Skip to content
AgentBlog

Install a blog that ranks and gets cited

One command installs a complete, SEO optimized blog into your Next.js site. 100% Free & Open Source.

npx agentblog@latest init

Installs the blog into your Next.js app, then verifies it.

AI crawlers do not run JavaScript

GPTBot, ClaudeBot, and PerplexityBot fetch your HTML once and read it as text. Whatever is missing from that first response is missing from the answer they write.

curl -sA "GPTBot" https://example.com/blog/do-ai-crawlers-run-js
<!doctype html><html lang="en">  <head>    <meta charset="utf-8" />    <meta name="viewport" content="width=device-width" />    <link rel="stylesheet" href="/assets/index-a1c9f2.css" />  </head>  <body>    <div id="root"></div>    <script type="module" src="/assets/index-7f2b04.js"></script>  </body></html> # 412 bytes. No title, no description, no article.
A client-rendered blog. The article exists, but only after a bundle runs.
curl -sA "GPTBot" https://agentblog.dev/blog/how-ai-search-engines-read-your-blog
<!doctype html><html lang="en">  <head>    <title>Do AI crawlers run JavaScript? | AgentBlog</title>    <meta name="description" content="No. GPTBot, ClaudeBot,      and PerplexityBot fetch HTML once and parse it as text." />    <link rel="canonical" href="https://agentblog.dev/blog/…" />    <script type="application/ld+json">{"@context":      "https://schema.org","@graph":[{"@type":"BlogPosting",…  </head>  <body>    <article>      <h1>Do AI crawlers run JavaScript?</h1>      <p>No. Vercel and MERJ instrumented AI crawler      traffic across Vercel’s network over a month and      reported that none of the major AI crawlers      render JavaScript.</p>      <h2 id="which-crawlers-render">Which crawlers render?</h2>      <p>Googlebot renders. Bingbot renders on a delay.… # 41 KB. The whole article, in one response.
The same post on AgentBlog. Everything a crawler needs, in one response.

Representative output, abridged for width. The right-hand command is real.

One command installs the whole blog

81 files, and you own every one of them. No runtime package to depend on, and nothing of ours to upgrade around.

your-app/81 files
opengraph-image.tsx
page.tsx
layout.tsx
opengraph-image.tsx
page.tsx
not-found.tsx
robots.ts
sitemap.ts
authors.json
categories.json
use-toc-active-heading.ts
ai-referrers.ts
config.ts
define-config.ts
indexnow.ts
metadata.ts
og-card.tsx
posts.ts
preflight-checks.ts
preflight.ts
reading-time.ts
render-mdx.tsx
schema.ts
schemas.ts
toc.ts
types.ts
agentblog.css
agentblog.config.ts
AGENTS.agentblog.md
app/blog/[slug]/page.tsx
import type { Metadata } from 'next'
import Image from 'next/image'
import { notFound } from 'next/navigation'

import { AnswerCapsule } from '@/components/blog/answer-capsule'
import { AuthorBio } from '@/components/blog/author-bio'
import { Breadcrumbs } from '@/components/blog/breadcrumbs'
import { Byline, PostDates } from '@/components/blog/byline'
import { JsonLd } from '@/components/blog/json-ld'
import { Faq, FAQ_HEADING } from '@/components/mdx/faq'
import { Prose } from '@/components/blog/prose'
import { RelatedPosts } from '@/components/blog/related-posts'
import { ShareButtons } from '@/components/blog/share-buttons'
import { TableOfContents } from '@/components/blog/table-of-contents'
import {
  CLUSTER_GAP,

Open any file to read the source it installs. Each preview is the first sixteen lines after the file header, and the whole file arrives with the install.

Already on shadcn? npx shadcn@latest add @agentblog/blog installs the same files, and npx agentblog@latest doctor --fix finishes the config a registry cannot reach.

Your coding agent writes the posts

Posts are MDX files in your repository. Installing AgentBlog also adds seven skills and a rule block your agent reads, so it knows the format before you ask.

.claude/skills/

agentblog-setup

Finishes whatever the registry could not do on its own, then replaces the seed author, categories, and posts with yours, so the blog is about your subject and not ours.

dataforseo-research

Reads the research already on disk before it spends anything, then measures what you rank for, who holds the answers, and whether AI engines cite you. Every run is written back, so the next one compares instead of repeating.

plan-blog-content

Decides what the site should be known for, mines the questions people actually search, and writes a backlog with the internal link direction already settled.

write-blog-post

Writes to the format: answer capsule first, question headings, a cited statistic, comparison data in a table. It is instructed never to invent a figure or a quotation.

refresh-blog-post

Re-fetches every source a post cites, checks it still says what the post says it says, and applies the smallest correct change. Nothing needed changing is a valid outcome.

agentblog-audit

Fetches your deployed URL as GPTBot, checks the title landed in head, and validates the graph before you publish.

publish-blog-post

Revalidates the post, the index, the sitemap, and the feed, submits to IndexNow, and reports the response code. A 403 and a 200 look identical until somebody reads the number.

Everything a blog needs to get found

Prerendering, structured data, feeds, and crawler wiring are built in. You write the posts.

Prerendered HTML

Every post is complete static HTML at build time. Nothing is deferred, and nothing mounts on interaction.

Connected JSON-LD

One graph per page. BlogPosting, Person, Organization, WebSite, and FAQPage, joined by @id instead of restated.

Sitemap, Feed, IndexNow

Dates come from your content, not from the deploy. Publishing pushes changed URLs to Bing, Yandex, Seznam, and Naver.

Answer Capsules

A direct answer under every heading, with no links inside it. That paragraph is the chunk a retrieval system lifts.

Your Design System

The blog reads your shadcn tokens and composes your primitives. It installs no theme, no base, and no font.

Doctor

Fetches your deployed URL as five different bots and names what is missing. Run it from CI.

Install it in one command.

Get started
npx agentblog@latest init