One rail. One key. Your blog is live.
Point any AI agent at networkr.dev/brief.md, or run the CLI yourself. Both paths drive the same server-side state machine: audit, flavour, activate, verify, configure delivery, optional pipes, done. End state: a registered site, a tenant API key, and the first article generating in the background.
Tell your AI agent
In Cursor, Claude Code, Continue, Aider, Lovable, Bolt, v0, or ChatGPT:
The brief is a machine-readable spec. Your agent follows the 9-step install rail, writes the tenant key to .env.local, and (for hosted mode) scaffolds blog rendering if you ask.
Run it yourself
From your project directory:
Interactive: asks for domain, email, flavour, storage mode. Writes .env.local. Drives the same 9-step rail as the brief, wrapped. Pass --yes for auto-pick, --skip-offers for baseline-only, --json to stream events.
Prefer to skip both? The manual API flow is below — what the agent or CLI is doing on your behalf.
What you need
- ✓A domain you own — DNS resolves, serves public HTML, not behind an auth wall.
- ✓An email address.
- ✓A storage mode pick:
hosted(simplest — we store articles, your frontend fetches via public API) or one ofsupabase,pocketbase,firebase,appwrite,mongodb(we write to your DB — you supply creds). - !Your site needs real content. An admission gate rejects empty, redirecting, or thin-content domains.
The install rail
Base URL: https://api.networkr.dev
The install is a server-driven state machine. Start with POST /api/install, then follow each next_step envelope by POSTing to /api/install/:token/step. The token lives 24h. The 9 steps fire in order and only ask for what they need.
Start the install
{
"domain": "example.com",
"email": "user@example.com"
}{
"install_token": "<token>",
"seo_score": 72,
"audit": { "issues": [...], "brand_detected": {...}, "database_detected": {...} },
"next_step": {
"id": "fix-loop" | "flavour",
"body_template": { ... },
"api_call": { "method": "POST", "path": "/api/install/<token>/step" }
}
}If seo_score is below threshold, the rail returns fix-loop — call GET /api/install/:token/fix-plan for an LLM remediation plan, then POST /api/install/:token/reaudit after the user applies fixes. Otherwise, jump to flavour.
Pick flavour, preview the sample
{
"step_id": "flavour",
"flavour": "professional" | "casual" | "technical" | "founder",
"author_name": "Your Real Name",
"blog_mode": "production",
"author_bio": "optional short bio",
"accent_color": "#8FBCBB",
"niche": "optional"
}{
"sample_article": { "title": "...", "body_html": "...", "cover_image": "data:..." },
"preview_url": "/preview/<token>",
"preview_inline": true,
"next_step": { "id": "activate", ... }
}The sample is returned inline — open https://api.networkr.dev<preview_url> for the full hosted preview. Re-POST flavour with a different value to retry voice. Advance to activate when happy.
Activate — create site, mint key
{
"step_id": "activate",
"db_type": "hosted",
"approval_required": false,
"approval_window_hours": 2
}For non-hosted modes, add db_url / db_key (see /docs for the full field list per adapter).
{
"site_id": "example-com",
"network_id": "...",
"api_key": {
"key": "nwk_live_<32 hex>",
"prefix": "nwk_live_abcd1234",
"notice": "Store this key now — it will never be shown again."
},
"approval": { "applied": false },
"next_step": { "id": "verify", ... }
}api_key.key is shown once. Save it immediately. Networkr keeps only a hash.
Verify, configure delivery, optional pipes
The remaining 6 envelopes ride the same POST /api/install/:token/stependpoint. POST the envelope's body_template, get the next envelope, repeat until done: true:
- 04
verify— confirms the site is registered; reports sitemap status + IndexNow auto-ping. - 05
configure_blog_delivery— pick how new posts reach the live site:build_hook|embed|defer|rewrite|cms_push|gh_actions. - 06
offer-gsc— optional. To connect Google Search Console, the agent first GETs/api/sites/:id/gsc/oauth-url, opens that URL for the user, then POSTs{ "choice_id": "connect_gsc" }. - 07
offer-viralr— optional. Activate the socials pipe infounderoralgomode; response carries aconnect_urlfor completing OAuth vianpx networkr connect. - 08
offer-outboxr— optional. Same connect-url pattern as viralr for the email/press pipe. - 09
done— install complete. Returnssave_to_env,verify_command, and a weekly-digest opt-out URL.
Skip any optional step with POST /api/install/:token/skip. Re-fetch the current envelope at any time with GET /api/install/:token/resume. The full envelope schema for every step lives in /brief.md.
Save the install to your repo
Write these three variables to .env.local at the project root (the done envelope returns them under save_to_env):
NETWORKR_API=https://api.networkr.dev NETWORKR_SITE_ID=<site_id from activate> NETWORKR_KEY=<api_key.key from activate>
Ensure .env.local is in .gitignore. Optionally drop a copy of /brief.md at .networkr/AGENT.md so future agents in the repo find the install context.
Verify the install
Authorization: Bearer <api_key.key>
Returns a 10-item checklist with statuses (ok / warning / missing), each item carrying the exact API call to fix it if needed, plus a next_step object.
Hosted mode — render the blog
If you picked hosted, your frontend fetches posts from these public endpoints (no auth):
Reference implementation (Next.js 16): github.com/HEIMLANDR/networkr/tree/main/frontend/src/app/blog. Adapt for your framework — the API is framework-agnostic.
Wire up your build hook
When your site deploys through a static host (Netlify, Vercel, Cloudflare, Render, Fly, GitHub Actions), Networkr needs a build hook URL to trigger rebuilds on every new post. Get the URL from your host's dashboard, then:
Authorization: Bearer <key>
Content-Type: application/json
{ "build_hook_url": "https://api.netlify.com/build_hooks/..." }Verify with POST /api/sites/<site_id>/build-hook/test.
Hard rules
- ✗Never invent endpoints. Use only what this page and
/docslist. Unknown routes return 404. - ✗Never edit published posts. Not supported. To change a post:
DELETE /api/sites/<id>/blog/posts/<slug>then regenerate. - !The tenant key scopes to the network, not the site. Reuse it across sibling sites on the same email.
- !Install token expires in 24h. On
410, restart withPOST /api/install. - !Respect rate limits.
429= wait 60s, retry once. Don't loop.
Install in the terminal right now
Point your AI agent at networkr.dev/brief.md or run npx networkr install yourself. Every install converges on the same final state.