AgentBlog Docs

Write posts with your coding agent

The seven skills AgentBlog installs, what to ask for, what the agent will refuse to do, and where the skills deliberately stop.

Posts are MDX files in your repository, so writing one is editing a file, which is the thing coding agents are already good at. AgentBlog installs seven skills that tell your agent what a good post looks like here, so you do not have to describe the format every time.

The seven skills

They land in .claude/skills/ during the install, in the order a blog goes through them.

SkillWhat it does
agentblog-setupFinishes install wiring, then replaces the seed author, categories, and posts with yours
dataforseo-researchMeasures what you rank for, who competes, and whether AI engines cite you, and keeps the result
plan-blog-contentWorks out what the site should be known for and writes a backlog with the link graph settled
write-blog-postWrites a new post in the format AI search engines can quote
refresh-blog-postRe-checks an existing post's sources and updates only what actually changed
agentblog-auditRuns the pre-publish gate, including a raw crawler fetch
publish-blog-postRevalidates, submits to IndexNow, and reads the response code rather than assuming

Claude Code loads a skill when what you asked for matches its description, so most of the time you write a normal sentence and the right skill appears. You can also call one directly with /write-blog-post.

Two of them never fire on their own. agentblog-audit and publish-blog-post set disable-model-invocation: true, so you invoke them by name. An audit that runs opportunistically is an audit nobody reads, and publishing submits a URL to an external service, which is not a decision to hand to a model.

What to actually say

Good prompts name the file and the goal. The skill supplies the format.

Write content/blog/do-ai-crawlers-run-javascript.mdx.
The reader is a developer deciding whether their marketing site
needs server rendering. Match the voice of the two existing posts.
Refresh content/blog/how-ai-search-engines-read-your-blog.mdx.
Check every citation still says what we claim it says.
Audit content/blog/do-ai-crawlers-run-javascript.mdx before I publish it.

You do not need to explain answer capsules, heading format, or schema fields. That is what the skill is.

What the agent does when it writes

  1. Reads agentblog.config.ts and your existing posts, to learn your voice, your topic clusters, and which posts should link to the new one.
  2. Works out the question the post answers, and the sub-questions under it.
  3. Outlines the H2 headings as questions.
  4. Drafts answer-first: 40 to 60 words directly under the H1, and again under each H2, with no links inside those paragraphs.
  5. Keeps sections to 150 to 300 words, each one able to stand alone.
  6. Includes at least one real statistic and one named-source quotation, both cited in the frontmatter.
  7. Puts comparison data in a real table rather than in prose.
  8. Adds five to fifteen internal links, and at least one link from an existing post to the new one, so it is not an orphan.
  9. Revises the draft against a voice reference, which is a separate pass on purpose: writing while scanning a list of forbidden patterns produces prose that avoids them and says nothing.
  10. Fills in the frontmatter completely.
  11. Runs agentblog audit, then the pre-publish checklist for the things a script cannot check, and reports each item pass or fail with the observed value.

That last step is a deliberate split. The audit command checks capsule lengths, heading format, date offsets, link counts, orphan status, and copy style deterministically, so the skill is told not to re-check any of it by reading. A second, softer answer to a question a script already answered is how a failing check gets reported as a pass.

What it will not do

Five rules sit in the skill's always-loaded text rather than in a reference file it might not open, because these are the ones where skipping is expensive.

  • Never invent a statistic, a quotation, or a source. This is the rule that keeps the whole idea from being a liability. If a number cannot be verified at a source the agent actually fetched, the claim goes qualitative instead.
  • Never invent experience. No anecdote, no first-person story, no opinion the sources do not support. Prose that sounds human by inventing a human is fabrication that also reads as fabrication.
  • No keyword stuffing. It measures worse than writing normally, not neutral.
  • No padding to reach a word count.
  • No em dashes, and no stock phrasing. See why the copy style matters.

Research, and the one skill that needs an account

dataforseo-research is the only skill here that talks to a paid third-party API. It needs a DataForSEO account, and without one it will tell you how to get credentials rather than guessing at numbers. Every other skill works with nothing but your repository.

It is worth the account for one reason: it is the only thing in the set that can measure. The others apply a format. This one tells you what you already rank for, which of your posts is one edit away from page one, who actually holds the queries you want, and whether AI engines cite you at all.

It cannot spend your money without asking. The skill is instructed to read what is already on disk, check your balance, print a costed plan, and wait for a yes before any billable call. Reading the balance and reading the existing research are both free, so it can tell you what a run would cost before it costs anything.

The part that compounds is where the answers go. Each run writes to content/research/: an append-only ledger.md of every run with what it cost, a baseline.md of the current standing answers, and dated raw responses under snapshots/. That directory is committed, so the next run, in a different session or on a different machine, reads it first and re-measures only what can have changed. The second run is a diff, which is both cheaper and the only thing that can show whether the writing is working.

What should we write next? Check content/research/ first.
Did anything move in our rankings or AI citations since the last run?

Nothing in content/research/ is published. The blog only reads content/blog/.

Refreshing a post is not rewriting it

refresh-blog-post exists because a refresh that reflows correct prose produces a large diff with no information in it and buries the actual corrections.

The agent fetches every source in citations[] and answers three questions about each: does it still resolve, does it still say what your post says it says, and has it been superseded. Documentation gets rewritten and vendors quietly restate figures, so the second question is the one that matters and the one everybody skips.

Then it applies the smallest correct change, and decides the date deliberately:

What changeddateModified
A number, a dead citation, a new section, a corrected claimMoves
A typo, a reflowed paragraph, a reformatted table with the same rowsStays
Nothing, because every fact still checks outStays

Freshness correlates with being cited, which is a reason to genuinely update posts and not a reason to restamp them. A date that does not match a real change teaches everything downstream to ignore that field, and the engines that reward freshness are the same ones holding a copy of what your page said last week.

"Nothing needed changing" is a successful outcome. The skill is instructed to say so and stop.

It also refuses to refresh, and says why, when more than about half the post's claims are now wrong or the central premise has been invalidated. Refreshing the numbers around a dead premise produces a well-cited wrong article.

To find what needs a refresh:

npx agentblog@latest audit --stale

That ranks posts by how overdue they are, weighted by how many internal links point at them.

Installing the skills without installing the blog

The same seven skills are also a Claude Code plugin, which is useful if you want them in a repository that is not your Next.js app.

/plugin marketplace add goldk3y/agentblog
/plugin install agentblog@agentblog

The install id is <plugin>@<marketplace>. Both halves are agentblog here, which reads like a typo and is not.

Or through the registry, into .claude/skills/:

npx shadcn@latest add @agentblog/agent-kit

Or through the skills CLI, which installs into whichever agent it detects rather than into Claude Code specifically:

npx skills add goldk3y/agentblog

That path exists because the skills follow the Agent Skills specification rather than only the Claude Code superset of it. Frontmatter is restricted to the six fields the specification defines plus two Claude Code extensions, and assert-skill-contract.mjs fails the build on anything else, so the same files load in Cursor, Codex, Copilot, Gemini CLI, and the rest.

AGENTS.md

The install also appends a block to your AGENTS.md, which most agent tools read as project instructions. It states the ten rules that must not be broken, so an agent that never loads a skill still knows the important ones: do not fabricate, do not narrow htmlLimitedBots, do not add 'use client' to the article render path, do not bump dateModified without a reason.

On Next.js 16.3 and later, next dev also manages a block in that file between its own markers. AgentBlog writes strictly after the closing marker and never inside it, and never writes CLAUDE.md at all.

The copy style rules

One rule sits above the rest: no em dashes. Not in posts, not in the docs, not in CLI output.

The reason is commercial rather than aesthetic. The em dash has become the most recognizable tell of machine-written prose, and readers discount text that leans on it. For a product whose deliverable is AI-assisted writing that people actually read, shipping copy that reads as machine-written undermines the thing being sold.

Bundled with it, since they share a cause: no "in today's fast-paced world" openers, no "it is not just X, it is Y" construction, no delve, leverage, robust, seamless, landscape, or tapestry, no rhetorical question followed by its own answer, and no three-item list where two would do.

agentblog audit fails a post that contains any of them.

What the skills deliberately do not teach

Two things already own their surface, and duplicating them would make the skills worse.

Next.js ships version-matched documentation inside node_modules, so an agent in your repository already has correct API docs with no network call. shadcn ships an official skill covering its CLI and registry system. AgentBlog's skills assume both exist and cover what is genuinely ours: the writing playbook, the schema shapes, and the install wiring.

On this page