The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Booklet listing page.
Publish Markdown incident reports, ADRs, RFCs and runbooks as web pages, with team spaces.
You write Markdown, and Booklet gives you a page with a link. The page is typeset, has a table of contents when it's long enough to need one, and opens for anyone you send it to.
It's built for the documents engineering teams pass around. Put type: incident (or adr, rfc, runbook, postmortem, release-notes) in the frontmatter and the page shows status, severity, date and owners in a strip under the title. [[ADR-012 Queue retries]] in an incident report links to that ADR, and the ADR lists the incident under "Referenced by". A team space keeps a team's documents together, grouped by type, and a page in one can be restricted to its members.
There are five ways to publish, and all of them produce the same page: the web editor, the REST API, the booklet-cli npm package, a GitHub Action, and an MCP server for Claude and other MCP clients.
Live: booklet.ashwinsathian.com · API docs: /docs/reference/api · MCP setup: /docs/guides/mcp
You get back the page's URL. The editor works without an account, up to 10 pages a month, each kept for 90 days. An account (free, and there is no paid plan) removes both limits, and you need one for an API key and so for the CLI.
type, status, severity, date, owners and supersedes, shown in a header strip[[Title]] resolves to a published page in the same team space, or among your own pages/t/<slug> lists a team's pages by type, with an ADR log and an Atom feed of its public pages<iframe> embeds at /p/:id/embed$...$, $$...$$), Mermaid and Graphviz in fenced code blocks/p/my-release-notespage.published and page.updated, signed, with a log of the last 50 deliveries/api/v1/openapi.jsonbooklet-cli on npm, with --json output and exit codes for scriptsAshwinSathian/publish-to-bookletSee packages/cli/README.md for full docs (all flags, CI/non-interactive auth via --key or BOOKLET_API_KEY, pages open, etc.).
All endpoints are under /api/v1/ and authenticated with Authorization: Bearer <bklt_...>.
| Method | Path | Description |
|---|---|---|
POST | /api/v1/publish | Create a new page |
GET | /api/v1/pages | List your pages |
GET | /api/v1/pages/:id | Read a page's metadata and raw content |
PATCH | /api/v1/pages/:id | Update content, slug, or visibility |
DELETE | /api/v1/pages/:id | Delete a page |
GET | /api/v1/keys | List API keys |
POST | /api/v1/keys | Create an API key |
DELETE | /api/v1/keys/:id | Revoke an API key |
Publish example:
booklet-api.ashwinsathian.com is a dedicated hostname for the API surface (same app/process as the main site, just scoped; see docs/OPERATIONS.md). booklet.ashwinsathian.com serves /api/v1/* too, so either works.
Full endpoint reference with request/response shapes: booklet.ashwinsathian.com/docs/reference/api.
A Node process (mcp-server/) that gives Model Context Protocol clients Booklet's API. It runs under PM2 beside the main app and speaks protocol 2026-07-28 over Streamable HTTP.
Endpoint: https://booklet-mcp.ashwinsathian.com/mcp
Auth: OAuth sign-in with your Booklet account, or an Authorization: Bearer <bklt_...> header (the same API keys as the REST API)
Tools: publish_page, update_page, get_page, list_pages, delete_page, create_document, search_pages
Resources: your published pages, as booklet://pages/:id
Prompts: five document templates the assistant can fill in and publish: incident_report, adr, release_notes, rfc and runbook
Point an MCP client at the endpoint above. A client that supports OAuth (a Claude.ai custom connector, for one) signs in with your Booklet account; the rest send your API key in the Authorization header. booklet.ashwinsathian.com/docs/guides/mcp has copy-paste config for Claude Desktop, Claude.ai, Cursor, Windsurf, VS Code, and Zed.
To run the server itself locally:
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript 5 (strict) |
| Styling | Tailwind CSS v4 |
| Auth | In-house (email + password with argon2id, passkeys, optional GitHub and Google sign-in, DB-backed sessions) |
| Database | Self-hosted MongoDB (pages, users, API keys, webhooks, rendered documents) |
| Deployment | PM2 on one Mac behind a Cloudflare Tunnel (why: docs/adr/0001-hosting-platform.md) |
| Markdown | unified + remark-parse + remark-gfm + remark-math |
| Math | KaTeX |
| Diagrams | Mermaid, Graphviz (@viz-js/viz) |
| Analytics | Page views and read depth, counted by the app itself (MongoDB) |
.nvmrc)mongod, or any self-hosted/managed instance)Create .env.local:
See .env.example for the full list of required secrets (session auth, API keys, page-password tokens, etc.). Each documents its own generation command and fail-closed behavior.
Every push/PR to main runs lint, typecheck (root app + each workspace package), a production build, and the unit test suite against a real MongoDB service container. See .github/workflows/ci.yml.
Push to main with a bumped version in packages/cli/package.json or packages/shared/package.json → automatically publishes booklet-cli or booklet-api-client to npm.
Required secret: NPM_TOKEN (Granular Access Token with publish + 2FA bypass).
Two ways: the AshwinSathian/publish-to-booklet GitHub Action, or booklet-cli via npx. See .github/examples/publish-to-booklet.yml for both — copy it into your own repo's .github/workflows/, add a BOOKLET_API_KEY secret, and it publishes on every release.
Booklet has two licenses, split by directory.
| Path | License |
|---|---|
Everything not listed below (the Next.js app in src/, scripts/, tests/, docs/) | AGPL-3.0-only |
packages/cli (booklet-cli) | MIT |
packages/shared (booklet-api-client) | MIT |
mcp-server | MIT |
The publish-to-booklet GitHub Action lives in its own repository and is MIT.
The app was MIT up to and including commit 1839525. That commit and everything before it can still be used under MIT. Later commits to the app are AGPL-3.0-only: if you run a modified copy as a network service, section 13 requires you to offer its users the source.