Skip to content
Install

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.

Agent install

Tell your AI agent

In Cursor, Claude Code, Continue, Aider, Lovable, Bolt, v0, or ChatGPT:

Read networkr.dev/brief.md and install Networkr on this site.

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.

CLI install

Run it yourself

From your project directory:

$ npx networkr install

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.

Before you start

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 of supabase, 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.
Manual install

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.

1

Start the install

POST /api/install
{
  "domain": "example.com",
  "email":  "user@example.com"
}
Response (trimmed)
{
  "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.

2

Pick flavour, preview the sample

POST /api/install/<token>/step
{
  "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"
}
Response (trimmed)
{
  "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.

3

Activate — create site, mint key

POST /api/install/<token>/step
{
  "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).

Response (trimmed)
{
  "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", ... }
}
Critical

api_key.key is shown once. Save it immediately. Networkr keeps only a hash.

4

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:

  • 04verify — confirms the site is registered; reports sitemap status + IndexNow auto-ping.
  • 05configure_blog_delivery — pick how new posts reach the live site: build_hook | embed | defer | rewrite | cms_push | gh_actions.
  • 06offer-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" }.
  • 07offer-viralr — optional. Activate the socials pipe in founder or algo mode; response carries a connect_url for completing OAuth via npx networkr connect.
  • 08offer-outboxr — optional. Same connect-url pattern as viralr for the email/press pipe.
  • 09done — install complete. Returns save_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):

.env.local
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

GET /api/sites/<site_id>/agent/brief
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):

GET /api/blog/<site_id>/posts?limit=20 — list
GET /api/blog/<site_id>/posts/<slug> — post with body, transparency, lineage, related, prev/next
GET /api/blog/<site_id>/covers/<file> — cover image
GET /api/blog/<site_id>/rss.xml — RSS feed
GET /api/blog/<site_id>/content-policy — transparency policy
GET /api/blog/<site_id>/authors/<slug> — author profile

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:

PUT /api/sites/<site_id>
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 /docs list. 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 with POST /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.