blog-writer
Skill36 starsChanged 54 days agoMITView on GitHub
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`).
- Commits and pushes
32 other projects use a version of this.
Adopted by
Most recently taken up by
- chaitanyapantheor/claude-skillstheir own version, first seen Oct 25, 2026
- maroffo/claude-forgetheir own version, first seen Oct 25, 2026
- peterbamuhigire/proposal-skillstheir own version, first seen Oct 17, 2026
- google/adk-samplestheir own version, first seen Oct 13, 2026
- google/adk-recipestheir own version, first seen Oct 13, 2026
- TheArchitectit/awesome-cline-skillstheir own version, first seen Oct 13, 2026
Used with
Projects with it also use aminer-data-search, auto-target-tracker and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
dav-niu474Skillaminer-data-search
使用 AMiner 开放平台 API 进行学术数据查询与分析。当用户需要查询学者信息、论文详情、机构数据、期刊内容或专利信息时使用此 skill。 触发场景:提到 AMiner、学术数据查询、查论文/学者/机构/期刊/专利、学术问答搜索、引用分析、科研机构分析、学者画像、论文引用链、期刊投稿分析等。 支持 6 大组合工作流(学者全景分析、论文深度挖掘、机构研究力分析、期刊论文监控、学术智能问答、专利链分析)以及 28 个独立 API 的直接调用。 即使用户只说"帮我查一下 XXX 学者"或"找找关于 XXX 的论文",也应主动使用此 skill。
Also in 4 projects that use this
dav-niu474Skillauto-target-tracker
自动目标进度追踪器。在对话中检测到目标相关图片(笔记、进度、截图、记录)时,自动调用 VLM 识别关键信息并记录到目标日记。适用于学习管理、健身追踪、工作进度、习惯养成、创作记录等所有目标管理场景。
Also in 4 projects that use this
Liang-MHSkillstock_analysis
获取 A 股、基金和港股的实时行情和技术分析数据
Also in 4 projects that use this
- +9 more from dav-niu474
Other versions32 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 32
- google/adk-recipes★ 11ksame name
- google/adk-samples★ 11ksame name
- microsoft/vscode-docs★ 6.7ksame name
- cosZone/astro-koharu★ 470same name
- KonghaYao/peri★ 248same name
- eunomia-bpf/eunomia.dev★ 244same name
- getnao/sylph★ 195same name
- nimbalyst/skills★ 28same name
- maroffo/claude-forge★ 17same name
- manthanpatelll/seo-blog-writer-claude-code★ 16same name
22 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
- anti-aiSkill
- beat-writerSkill
- book-writerSkill
- newsletter-writerSkill
- polishSkill
- x-writerSkill
The file
We split this skill into the rules it gives an agent
5 rules. 0 are common, 1 is distinctive, and 4 are very specific to this project.
0
Common
Most of the 30 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 62
Per-session: Read the project's CLAUDE.md and extract the optional ## Blog section.
- Very specific: line 81
Voice always: Every beat pours through /authors-voice Apply Protocol with the site-specific anchor.
- Very specific: line 84
The writer accepts before you publish: After agent writes, integrate tells the user "click Accept All in the right rail, then I'll publish" …
- Very specific: line 85
Cover image before publish: No post integrates without a cover/OG image — a gate, not optional.
- Distinctive: line 112
NOT covered (use your own tooling instead): project deploy pipelines · cross-channel announcements (Discord, X, etc.) · /newsletter-writer …
“Common” is measured: kept by at least 6 in 10 of the 30 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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. Mirrors book-writer's discipline at post scale.
Format rules for blog documents (title, blogContext fields, slug, cover, body, what post_to_blog needs) arrive from OpenWriter when the document is opened. This skill keeps voice, beats, titling, SEO and editorial judgment, and the pipeline.
Convention
This skill obeys the shared writer contract at WRITER-CONVENTION.md. Brief shape and return shape match that doc. Sub-form values: long | short | tutorial | announcement.
OpenWriter's own editing rules arrive with its tools and documents.
Blog posts ship SEO-complete in the FIRST pass. A blog post almost always carries SEO — internal/cluster links, meta + slug + tags, snippet-targeted headings, FAQ/schema-eligible content all go into the initial draft (the minion brief + first populate_document), never bolted on after. Bolting SEO on later forces an edit (→ write_to_pad, never a 2nd populate). SEO-strategy-led posts (pillar / landing / comparison) front-end through /seo-writer if you have it installed (not bundled with OpenWriter).
Cover image is a publish gate (Firm rules). Placement rules: no bottom-band text (the platform renders og:title there), keep the subject center-safe, ≤5–7 words of overlay text, do not echo the title/description. Palette / brand skin comes from the project's style_doc (e.g. recipebox.md). Generation, canonical size, and the tmp-first rule for text-overlay covers: docs/images.md.
ABOUT TO HAND-EDIT A PUBLISHED POST'S .md, ITS image: FRONTMATTER, OR DROP A COVER INTO THE REPO'S public/? STOP. The OpenWriter doc is the single source of truth, and post_to_blog is the ONLY writer to the blog repo. Edits flow doc → Accept → Publish — never doc and repo in parallel, because Publish rewrites the post file wholesale and your hand-edits vanish. Never hand-name a cover; never side-channel an image; never git push the post yourself. Publish flow: docs/integrate.md.
Modes
| Mode | Trigger | What it does | Sub-doc |
setup | /blog-writer setup, "register blog repo", "add blog site" | One-time per blog: inspect_blog_repo clones the target, auto-proposes frontmatter_defaults + frontmatter_field_map from existing posts; add_blog_site persists the site config | docs/setup.md |
brainstorm | /blog-writer brainstorm, "brainstorm blog topics" | Open a Blog Ideas doc; propose 3-5 candidate angles with tone + length labels; hand off to beats when user picks | docs/brainstorm.md |
beats | /blog-writer beats, "extract beats", "blog beats" | Query-first beat extraction with 3-pass (short/announcement, 3-5 beats) or 5-pass (long/tutorial, 8-15 beats); 9 blog category tags (CLAIM/REFRAME/MECHANISM/EVIDENCE/DEMO/SCENE/OBJECTION/APHORISM/PIVOT) + HOOK/CTA positional roles; locks title + preview + slug as B0; dopamine arc layered with conversion arc | docs/beats.md + docs/titling.md |
draft | /blog-writer draft, "draft this post", "pour the beats" | Per-beat dispatch to /authors-voice Apply Protocol with site-specific anchor; cross-beat coherence pass; supports beat-level reshape loop (re-pour only the affected beats) | docs/draft.md + docs/voice-anchor.md |
images | /blog-writer images, "blog image", "featured image" | Read style doc, craft prompt, generate the cover; optional inline images | docs/images.md |
integrate | /blog-writer integrate, "publish", "post to blog" | post_to_blog against the registered site once the writer has accepted every pending change; verify the live URL | docs/integrate.md |
pipeline | /blog-writer pipeline, "full blog workflow", "write and publish" | 7-step sequence (Setup → Brainstorm → Beats → Draft → Images → Accept → Publish → Verify) with explicit gates; reshape loop returns to Beats step | docs/pipeline.md |
Modes can chain (pipeline runs them in sequence) or stand alone. Beats reshape → draft re-pour is the inner loop the architecture is designed around.
Setup (per-session vs per-blog)
Per-session. Read the project's CLAUDE.md and extract the optional ## Blog section. It can carry writing_rules, style_doc, content_driven, aspect_ratio. Used by images mode + as defaults for beats/draft. Schema: docs/project-config.md. If absent, defaults apply and the skill still runs.
Per-blog (one-time). Each blog repo must be registered with the github plugin via add_blog_site before integrate can publish to it. Run /blog-writer setup once per blog. The setup mode uses inspect_blog_repo to auto-propose frontmatter_defaults (layout, author, prerender — fields constant across the site's existing posts) and frontmatter_field_map (e.g. date → publishedDate for Astro sites). Sub-doc: docs/setup.md.
Architecture (build internals)
Per-post container structure (Beats + Draft sibling docs), the 10-step OpenWriter call-order for building one post, and the return/output contract live in docs/architecture.md. Two facts ride every build:
- Two sibling docs per post.
Beats — <Title>(content_typedocument) holds structure;<Title>(content_typeblog) is the publishable Draft — one per container. Reshape beats → re-pour only the affected beats, never the whole post. - ABOUT TO CALL
switch_document(or any view-control MCP) MID-BUILD? STOP. The agent builds the container + Beats + Draft + metadata + images silently, targeting docs bydocId; the user watches the activity feed and navigates themselves. Onlyswitch_documenton an explicit user instruction ("open the Draft", "show me the Beats") or when publishing needs the post open.
Firm rules
- Beats before draft. Draft mode requires a locked Beats doc. No beats → run
beatsfirst. Pouring prose without committed beats produces shapeless drafts that need full structural rework downstream. - Beats and Draft live in separate docs, always. One container per post, two sibling docs:
Beats — <Post Title>(content_type: document) and<Post Title>(content_type: blog — the publishable doc). Beats reshape → draft re-pour. Don't mix prose into the Beats doc; don't put structural commitments in the Draft doc. - Title + preview + slug are B0 commitments. Locked in the Beats doc's B0 block during
beatsmode. Whendraftmode runs they mirror onto the Draft doc. See docs/titling.md. The first paragraph of the draft must echo the title — can't echo what isn't locked. - Per-site voice anchor.
draftmode readsvoice/anchor-<site-slug>.mdwhere<site-slug>is the slugified site label fromlist_blog_sites. Silent fallback tovoice/anchor.mdif not present. Discovery is convention-based, NOT in plugin config. See docs/voice-anchor.md. - Setup before integrate. A blog repo must be registered via
add_blog_sitebeforeintegratecan publish. Checklist_blog_sitesat session start — if the target repo isn't there, run/blog-writer setupfirst. - Project config is optional; per-site config is canonical.
## Blogin CLAUDE.md is forwriting_rules,style_doc,content_driven,aspect_ratio. Frontmatter shape lives on the site registered with the github plugin, NOT in project config. - Voice always. Every beat pours through
/authors-voiceApply Protocol with the site-specific anchor. The skill owns shape; voice owns diction. Per-beat dispatch is the default forlong/tutorial; collapse to single dispatch forshort/announcementunder 1000w. - Two-step doc creation.
create_document(spinner) →populate_document(content). Never inline a 30s generation into one tool call. - Today's date in the doc, in the project's configured timezone (default
America/Los_Angeles). - The writer accepts before you publish. After agent writes,
integratetells the user "click Accept All in the right rail, then I'll publish" rather than silently posting incomplete content. - Cover image before publish. No post
integrates without a cover/OG image — a gate, not optional. Design per the Convention above (placement rules +style_docpalette; docs/images.md mechanics).
Anti-patterns
- ❌ Calling
draftwithout first runningbeatsfor the post — fails with "no Beats doc found in container" - ❌ Writing the blog post
.mdfile directly into the target repo via Write/Edit tools — that'spost_to_blog's job - ❌ Generating an image before the content is approved (image themes might shift)
- ❌ Skipping voice protocol because "the draft sounds fine"
- ❌ Mixing modes — finish one, then start the next
- ❌ Single global voice anchor when a site-specific one exists —
draftmode reads conventionally; no opt-in required - ❌ Reshaping beats AND re-pouring the entire draft in one pass — reshape beats first, lock them, then re-pour ONLY the affected beats
- ❌ Calling
/blog-pipeline,/blog-images,/blog-integrate,/blog-feature-imagesas separate skills (deprecated stubs that redirect here)
Scripts
mcp__openwriter__insert_image— Gemini image generation in OpenWriter (primary path)- image-gen CLI (if installed locally) — standalone fallback for non-OpenWriter workflows
- Sharp conversion (PNG → WebP) — for projects where the target site insists on
.webp(the github plugin copies PNGs unchanged; conversion is a project-specific concern before publish)
Related skills
Delegated / required:
- /authors-voice — voice pipeline; REQUIRED for any prose generation (
draftdelegates every beat dispatch). - /anti-ai — final AI-tells fingerprint scrub; recommended after a post is voice-poured.
- openwriter — the workspace/document MCP; REQUIRED for the doc management this skill governs.
- /seo-writer — optional, not bundled: SEO-strategy-led posts front-end there, then reuse this skill's publish path.
NOT covered (use your own tooling instead): project deploy pipelines · cross-channel announcements (Discord, X, etc.) · /newsletter-writer (different channel) · /x-writer (different channel) · /book-writer (multi-chapter books — global beat sheet, workspace management).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

