← ClaudeAtlas

blog-writerlisted

Channel-master writer for long-form blog posts. Owns the SHAPE of a post — beat structure, title/preview/slug commitments, per-post container layout, per-site voice anchor discovery — and delegates VOICE (prose generation) to /authors-voice and PUBLISH mechanics to the openwriter github plugin (`add_blog_site` + `post_to_blog`). Use when: "/blog-writer", "write a blog post", "blog draft", "brainstorm blog topics", "blog beats", "extract beats from this post", "write about this feature", "draft a post", "blog title", "preview text", "OG description", "blog image", "featured image", "OG image", "integrate", "create the files", "wire up the blog post", "publish to blog", "post to blog", "set up blog repo", "register blog site". Requires: OpenWriter MCP server configured + github plugin enabled + `gh auth login` set up locally. Project SHOULD have a `## Blog` section in its CLAUDE.md for writing-rules / image-style overrides (optional after setup).
travsteward/openwriter · ★ 14 · AI & Automation · score 83
Install: claude install-skill travsteward/openwriter
# Blog Writer Channel-master skill for long-form blog content. Owns ideation → beats → draft → image → publish. **Architecture:** beats-first (v0.5.0) + plugin-backed publish (v0.4.0). Each post lives in its own container with two sibling docs: a `Beats` doc (the structural commitments — beat list + title/preview/slug as B0) and a `Draft` doc (the voice-poured prose). Beats reshape regularly; draft re-pours via `/authors-voice` against a per-site anchor (`voice/anchor-<site-slug>.md`). Publish is a single `post_to_blog` MCP call against a site registered via `add_blog_site` — site-specific frontmatter (layout, author, prerender, `date → publishedDate` for Astro, etc.) lives on the github plugin's per-site config in `~/.openwriter/config.json`, not in project config. Mirrors book-writer's discipline at post scale. ## Convention This skill obeys the shared writer contract at [WRITER-CONVENTION.md](../WRITER-CONVENTION.md). Brief shape and return shape match that doc. Sub-form values: `long` | `short` | `tutorial` | `announcement`. **OpenWriter pad mechanics are canonical in [/openwriter](../openwriter/SKILL.md) — read it, don't re-derive from tool descriptions.** The load-bearing rule: `populate_document` is **create-only, used ONCE**; it re-sends the whole body, so calling it again to "fix" a doc appends a duplicate. All edits (rewrite / insert / delete) go through `write_to_pad` on fresh node IDs. Plus the read ladder (`outline_doc` → `search_docs` → `peek_doc` → `read_p