Get started
Quick start
On this page
Run Kazari on your own machine and publish a first page in about five minutes. You need no domain, DNS record or certificate: browsers resolve every *.localhost name to your own computer, so pages appear at addresses like http://hello.localhost:8080/.
You need Docker with Compose and git. Claude Code is optional, and so is Go (1.27 or later), which runs the CLI from source.
1. Start the server#
git clone https://github.com/PeterBooker/kazari.git
cd kazari
docker compose up --build -dThis builds the image and starts the development server on port 8080 with the configuration in deploy/dev.yaml: plain HTTP, the base domain localhost, and the admin token dev-admin-token. docker compose ps shows it as healthy once it is ready.
Tip
No Docker? With Go installed, go run ./cmd/kazari serve --config deploy/dev.yaml runs the same server and keeps its data in ./.data.
2. Create a user and an API key#
The image contains the kazari CLI, so you can run the admin commands inside the container:
docker compose exec kazari /usr/local/bin/kazari \
--admin-url http://admin.localhost:8080 --admin-token dev-admin-token \
admin users create ana
docker compose exec kazari /usr/local/bin/kazari \
--admin-url http://admin.localhost:8080 --admin-token dev-admin-token \
admin keys issue ana --label laptopThe second command prints a key that starts with kzk_. It is shown once, so copy it now. With Go installed you can run the same commands on your machine as go run ./cmd/kazari ....
3. Publish a page#
Pick whichever way suits you.
With Claude Code#
Add the MCP server with your key:
claude mcp add --transport http kazari http://mcp.localhost:8080/ \
--header "Authorization: Bearer kzk_..."Start Claude Code and ask for something:
Make a one-page “hello” site with a big friendly heading and publish it to Kazari with the slug hello.
Claude calls the create_artifact tool and replies with the address, http://hello.localhost:8080/.
With curl#
curl -sS http://api.localhost:8080/v1/artifacts \
-H "Authorization: Bearer kzk_..." \
-H 'Content-Type: application/json' \
-d '{"slug": "hello", "files": [{"path": "index.html", "content": "<!doctype html><title>Hello</title><h1>Hello</h1>"}]}'The response carries the page’s url and its version.
With the CLI#
mkdir -p site && echo '<!doctype html><title>Hello</title><h1>Hello</h1>' > site/index.html
export KAZARI_URL=http://api.localhost:8080 KAZARI_TOKEN=kzk_...
go run ./cmd/kazari publish ./site --slug hello4. Look around#
- Open
http://hello.localhost:8080/for the published version andhttp://hello--v1.localhost:8080/for version 1, which never changes. - Publish again (ask Claude to change the heading, or run
go run ./cmd/kazari update hello ./site) and a--v2address appears while--v1stays as it was. - Ask Claude to “roll hello back to version 1”, or, with
KAZARI_URLandKAZARI_TOKENexported as above, rungo run ./cmd/kazari get helloto list the versions andgo run ./cmd/kazari rollback hello 1to serve version 1 again.
Note
If a tool cannot resolve *.localhost (browsers and systemd-resolved can; some other resolvers cannot), add the names to /etc/hosts: 127.0.0.1 api.localhost admin.localhost mcp.localhost hello.localhost.
When you are finished, docker compose down stops the server; docker compose down -v also deletes its data.
Next steps#
- Publish with Claude: what to ask for, and how to change, share and retire pages.
- Publish from code: the CLI, preview deployments from CI, and the REST API.
- Install: run Kazari on a real domain with TLS, so claude.ai and your team can reach it. claude.ai connects from the internet, so it needs a public
httpsaddress rather thanlocalhost.