From pepe-multi-channel-content-pipelines
Publish long-form blog posts to a static-site brand domain via a Git-backed deployment (GitHub repo + Cloudflare Pages or equivalent). Covers operator setup (domain registration, GitHub repo, Cloudflare Pages project, DNS, build pipeline), authoring posts in localised pairs (e.g. EN + DE) from a canonical source, sitemap.xml + robots.txt + Atom feed maintenance, CSS cache-bust discipline on style additions, preview-before-publish, and post-deploy verification. Use whenever the content pipeline needs a long-form authoritative surface (the canonical home for articles linked from IG / X).
How this skill is triggered — by the user, by Claude, or both
Slash command
/pepe-multi-channel-content-pipelines:publishing-blogThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
A blog is the **authoritative long-form surface** in a multi-channel pipeline: every reel, every X thread, every newsletter can link back to a permanent canonical page. Unlike IG and X, the blog is **operator-owned infrastructure** — no platform can deprecate the surface, throttle the reach, or rewrite the rules.
A blog is the authoritative long-form surface in a multi-channel pipeline: every reel, every X thread, every newsletter can link back to a permanent canonical page. Unlike IG and X, the blog is operator-owned infrastructure — no platform can deprecate the surface, throttle the reach, or rewrite the rules.
This skill is opinionated toward a static-site, Git-backed, CDN-deployed stack. The reference deployment is helmguild.com (static HTML + Markdown sources, served by Cloudflare Pages). The same pattern works for Vercel, Netlify, GitHub Pages, Cloudflare Workers, etc.
Audience: the human operator.
<brand>.com); the www subdomain comes for free.<brand>.com). Public or private — Cloudflare Pages reads from either. The repo's top level is the site root; the deployment is "everything in main after build is the published site"..html directly; Markdown sources alongside for the agent to author. Best for full visual control + zero toolchain surface.dist/ from src/.npm run build (Astro/Eleventy/Hugo/Next) or empty (pure static).dist / _site / public / repo root.main.<brand>.com. Cloudflare creates the DNS records (orange-cloud, not grey — see memory:cloudflare_tunnel_orange_cloud for why grey CNAMEs to internal endpoints don't resolve). Add www as well; HTTP redirect rule for www → apex (or apex → www, operator's choice).<sha>.<project>.pages.dev). Commands 5-6 verify on preview before merging.robots.txt + sitemap.xml. At the site root:
robots.txt — User-agent: * + Allow: / + Sitemap: https://<brand>.com/sitemap.xml.sitemap.xml — XML sitemap listing every canonical URL with <lastmod>. For multi-locale sites, use xhtml:link hreflang alternates./feed.xml (or /atom.xml). Update on every new post. Newsletter integrations, RSS readers, IndieWeb consumers all read this.blog/<slug>/index.html + a Markdown mirror blog/<slug>/index.md (the canonical source).src/content/blog/<slug>.md./blog/<slug>/ is EN, /de/blog/<slug>/ is DE, /fr/blog/<slug>/ is FR. Every locale-equivalent post has a <link rel="alternate" hreflang="<lang>" href="<URL>"> to its siblings + an hreflang="x-default" pointing at the primary locale.<brand>.com for primary, <brand>.de etc. — heavier infrastructure, only worth it for SEO-aggressive multi-market brands.hello-world → push to a feature branch → preview URL renders → merge → live URL renders within 30 s of merge → sitemap.xml lists the post → Atom feed includes it.Operator confirms: "Setup complete."
The blog post is derived from the canonical content source (see content-strategy-planning-optimization). Do not handwrite the body directly into the site repo — handwrite the canonical source and have the agent render it into the site.
{id, title, summary, body_md, hero_image, locale, published_at, author, tags[]}.blog/<slug>/index.html + blog/<slug>/index.md. For Markdown-only sites: src/content/blog/<slug>.md.pandoc index.md -o /tmp/test.html && diff /tmp/test.html <(extract-article-body index.html) is a useful integrity check during authoring.<locale>/blog/<slug>/index.html + the Markdown mirror. Translate the body; keep field-shape parity. Each locale page must carry hreflang alternates linking to the others — symmetric (see memory:canonical_links_symmetric).blog/<slug>/hero.webp + hero.jpg. Width ~ 1600 px; height ratio 16:9 or 4:3.blog/index.html (or the framework's auto-generated index) lists posts newest-first. Update the listing in the same commit.<xhtml:link rel="alternate" hreflang="<lang>" href="..."/> siblings.feed.xml / atom.xml) with the new post's <entry> (id, title, published, updated, summary, content, author, link).lastmod on the homepage entry of sitemap.xml — anything that links to the new post is itself "modified" for SEO purposes.Cache-bust is correctness, not optimisation. A static-site CDN's CSS caching defeats edits silently if the filename doesn't change. The fix is filename-versioned CSS — every rule addition bumps the filename.
assets/style_<N>.css, where <N> is a monotonic integer. New selector → new file → bump every reference in the site's HTML (head <link href>). Track the current N in a top-level STYLE_VERSION file or in the build config.style_<N>.css in place after the first publish — bump N, copy + edit, update references.sed-renaming references across paths trips on multi-level relative paths (see memory:sed_relative_path_quantifier). Bump references by filename, not by pattern.Cloudflare Pages preview URLs are the gate. Procedure:
post-<slug>). Cloudflare Pages builds the preview within ~60 s.<sha>.<project>.pages.dev/blog/<slug>/). The agent fetches it with curl -sS -I and curl -sS and verifies:
main. Squashing keeps the git log readable as one commit per post.state/publish-log.jsonl with {ts, channel:"blog", media_type:"post", slug, locale, url}. The analytics skill consumes this.deployed_site_commit_and_push).A new blog post is the canonical anchor for a content arc. The agent updates:
Posts are versioned but not branched. Workflow:
updated_at field.<lastmod> in sitemap.xml for that URL.<published> of the original entry + bump <updated>).Cloudflare Pages build fails. Read the build log from the Pages dashboard or gh api. Fix the source error (broken HTML, missing asset, framework lint), push again.
DNS / certificate errors. Cloudflare Pages auto-provisions Let's Encrypt; first deploy after adding a custom domain can take 5-15 min for the cert. The agent flags this as "expected delay, not a failure" if the cert isn't ready yet.
Stale CDN. Cloudflare's CDN caches at the edge. After deploy, hard-purge:
curl -sf -X POST "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/purge_cache" \
-H "Authorization: Bearer <CF_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"purge_everything":true}'
Or purge only the affected URLs ({"files":["https://...","https://..."]}) — preferred for production.
www.helmguild.com (apex redirects to www).helmut-hoffer-von-ankershoffen/helmguild.com./blog/<slug>/, DE mirror at /de/blog/<slug>/./sitemap.xml lists every canonical URL with hreflang alternates./feed.xml (EN), /de/feed.xml (DE).assets/style_<N>.css, current N tracked at top of assets/. New selector → bump./blog/ for the live index.published_at in the canonical source drives when the agent runs Command 2 for that post.Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
npx claudepluginhub helmut-hoffer-von-ankershoffen/helmguild-plugins --plugin pepe-multi-channel-content-pipelines