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.
| Skill | What it does |
|---|---|
agentblog-setup | Finishes install wiring, then replaces the seed author, categories, and posts with yours |
dataforseo-research | Measures what you rank for, who competes, and whether AI engines cite you, and keeps the result |
plan-blog-content | Works out what the site should be known for and writes a backlog with the link graph settled |
write-blog-post | Writes a new post in the format AI search engines can quote |
refresh-blog-post | Re-checks an existing post's sources and updates only what actually changed |
agentblog-audit | Runs the pre-publish gate, including a raw crawler fetch |
publish-blog-post | Revalidates, 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
- Reads
agentblog.config.tsand your existing posts, to learn your voice, your topic clusters, and which posts should link to the new one. - Works out the question the post answers, and the sub-questions under it.
- Outlines the H2 headings as questions.
- Drafts answer-first: 40 to 60 words directly under the H1, and again under each H2, with no links inside those paragraphs.
- Keeps sections to 150 to 300 words, each one able to stand alone.
- Includes at least one real statistic and one named-source quotation, both cited in the frontmatter.
- Puts comparison data in a real table rather than in prose.
- 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.
- 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.
- Fills in the frontmatter completely.
- 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 changed | dateModified |
|---|---|
| A number, a dead citation, a new section, a corrected claim | Moves |
| A typo, a reflowed paragraph, a reformatted table with the same rows | Stays |
| Nothing, because every fact still checks out | Stays |
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 --staleThat 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@agentblogThe 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-kitOr through the skills CLI, which installs into whichever agent it detects rather than into Claude Code specifically:
npx skills add goldk3y/agentblogThat 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.
Make it live
Deploy the blog, set the two environment variables it needs, and verify that a crawler can actually read the result.
Decide what to write about
A working method for choosing topics, grouping them into clusters, and keeping the ones that earn traffic current, using the tools the install gives you.