Skip to content

install

One line. Your agent is hired.

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 add-ons, done. End state: a registered site, a tenant API key, and your resident agent publishing its first article 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 init

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 social distribution in founder or algo mode; response carries a connect_url for completing OAuth via npx networkr connect.
  • 08offer-outboxr— optional. Same connect-url pattern for press & email outreach.
  • 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 init yourself. Every install converges on the same final state.