Designers and admin staff
Prototypes without a pipeline
- Turn an idea into a clickable page in one conversation
- No repository, build step or hosting account
- Go back to any earlier version by asking
Open source · Self-hosted · MIT licensed
Kazari is a small, self-hosted home for what Claude builds: prototypes, reports, dashboards and demos. Every page gets its own address, every change is kept as a version, and people can sign in with the work account they already have.
Build a clickable prototype of the new onboarding flow and publish it to Kazari.
Published https://onboarding.art.example.com/ (version 1)
Create your workspace
How it works
Add Kazari to claude.ai as a custom connector, or to Claude Code with one command, and sign in with your work account or an API key.
Describe what you want. Claude writes the page, publishes it with Kazari's tools and replies with the link.
Ask for changes and Claude publishes a new version. The link stays the same, and every version keeps an address of its own.
Who it's for
One service with three ways in, so everyone on the team can use the one that suits them.
Designers and admin staff
Vibe coders
Developers
Operators and IT
Addresses
Kazari serves each artifact from its own subdomain under one wildcard certificate. Each is a separate browser origin, so one page can't read another's cookies or storage.
Versions never change. Put a version link in a review thread and it will always show what the reviewer saw.
onboarding.art.example.comThe published version. It moves when you publish or roll back.
onboarding--v3.art.example.comVersion 3, for good. Safe to cache, safe to link.
mcp.art.example.comThe MCP server for Claude, beside api. for the REST API and admin. for operators.
Rolling back moves a pointer. Nothing is copied and nothing is lost.
Publish your way
The MCP server, the REST API and the CLI share one service layer and return the same JSON.
Add a custom connector with your instance's MCP address, sign in once, then ask in plain words.
Publish with ClaudeConnector URLhttps://mcp.art.example.com/
Turn the attached CSV into a dashboard with a chart per region and publish it to Kazari as q3-dashboard.
Published https://q3-dashboard.art.example.com/ (version 1)
One command adds the server. Without a key, Claude Code signs you in through OAuth the first time it uses it.
MCP server referenceclaude mcp add --transport http kazari https://mcp.art.example.com/
# or with an API key instead of OAuth
claude mcp add --transport http kazari https://mcp.art.example.com/ \
--header "Authorization: Bearer kzk_..."The same binary as the server. Publish a directory, add versions, roll back, retire.
CLI reference$ kazari publish ./site --slug q3-report --name "Q3 report"
https://q3-report.art.example.com/
$ kazari update q3-report ./site --label "fix chart"
$ kazari rollback q3-report 1
$ kazari stale q3-report --grace 72h
JSON for small pages, a tar.gz bundle for sites, chunked uploads for anything large.
REST API referencecurl https://api.art.example.com/v1/artifacts \
-H "Authorization: Bearer $KAZARI_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"slug": "hello",
"files": [{"path": "index.html", "content": "<h1>Hello</h1>"}]}'
# {"url": "https://hello.art.example.com/", "version": 1, "artifact": {...}}Features
Every publish is an immutable, content-addressed version. Roll back or forward with one call; optimistic concurrency stops lost updates.
An MCP server with twelve tools, a REST API and a CLI, all on one service layer and all returning the same JSON.
OAuth 2.1 for MCP clients, federated to Microsoft Entra ID, Google Workspace, Okta, Keycloak or any OpenID Connect provider. No passwords stored.
An origin per page, a Content-Security-Policy that still allows the common CDNs, no search indexing unless you ask, quotas and rate limits.
Inline files for a single page, tar.gz bundles for whole sites, resumable chunked uploads for MCP clients without a shell.
One static Go binary or a distroless image. SQLite and a directory of blobs are the only state. Wildcard certificates by ACME DNS-01.
Structured request logs, Prometheus metrics, an admin API and an append-only audit log of every change.
Pages you no longer need retire themselves on a schedule you set, and every step up to the purge can be undone.
Lifecycle
Generated pages pile up. Mark one stale and it keeps serving through a grace period, then steps out of the way. Each step lands in the audit log, and everything short of the purge can be reversed.
How the lifecycle worksSelf-hosting
No domain or certificate needed: browsers resolve *.localhost to your own computer.
git clone https://github.com/PeterBooker/kazari.git
cd kazari
docker compose up --build -d
# pages appear at http://<slug>.localhost:8080/You need a domain, a wildcard DNS record and a DNS API token for the certificate, or a reverse proxy that already has one.
docker run -d --name kazari -p 80:80 -p 443:443 \
-v /srv/kazari/data:/var/lib/kazari \
-e KAZARI_BASE_DOMAIN=art.example.com \
-e KAZARI_TLS_EMAIL=[email protected] \
-e KAZARI_TLS_DNS_PROVIDER=cloudflare \
-e KAZARI_TLS_DNS_API_TOKEN=cf-token \
-e KAZARI_AUTH_ADMIN_TOKEN="$(openssl rand -hex 32)" \
ghcr.io/peterbooker/kazari:latest serveStatus. Kazari is heading for v1.0. The server, REST API, MCP server, OAuth sign-in and CLI work today; expect breaking changes until v1.0.0 is tagged.