Publish Markdown incident reports, ADRs, RFCs and runbooks as web pages, with team spaces.
- ✓Open-source license (AGPL-3.0)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
git clone https://github.com/AshwinSathian/booklet{
"mcpServers": {
"booklet": {
"command": "node",
"args": ["/path/to/booklet/dist/index.js"],
"env": {
"NEXT_PUBLIC_SITE_URL": "<next_public_site_url>",
"INVITE_JWT_SECRET": "<invite_jwt_secret>"
}
}
}
}NEXT_PUBLIC_SITE_URLINVITE_JWT_SECRETResumen de MCP Servers
# Booklet
**Publish Markdown incident reports, ADRs, RFCs and runbooks as web pages, with team spaces.**
[](LICENSE)
[](https://www.npmjs.com/package/booklet-cli)
[](https://www.npmjs.com/package/booklet-cli)
[](https://github.com/AshwinSathian/booklet/actions/workflows/ci.yml)
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](https://booklet.ashwinsathian.com) · **API docs:** [/api-docs](https://booklet.ashwinsathian.com/api-docs) · **MCP setup:** [/mcp-setup](https://booklet.ashwinsathian.com/mcp-setup)
---
## Quick start
```bash
npm install -g booklet-cli
booklet login # opens your browser to authorize
booklet publish README.md --open # publish this file, open it in your browser
```
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.
---
## Features
- **Editor**: live preview, drafts saved in the browser and synced to your account, import from a file or a GitHub URL
- **Document types**: frontmatter `type`, `status`, `severity`, `date`, `owners` and `supersedes`, shown in a header strip
- **Links between pages**: `[[Title]]` resolves to a published page in the same team space, or among your own pages
- **Team spaces**: `/t/<slug>` lists a team's pages by type, with an ADR log and an Atom feed of its public pages
- **Visibility**: unlisted (the default, not indexed), public, or team; a password on top if you want one
- **Share pages**: table of contents, reading time, dark and light themes, five document themes, `<iframe>` embeds at `/p/:id/embed`
- **Math and diagrams**: KaTeX (`$...$`, `$$...$$`), Mermaid and Graphviz in fenced code blocks
- **Export**: Markdown, self-contained HTML with diagrams and math drawn in, and Print to PDF
- **Version history**: 50 snapshots per page, a line diff between any two, restore as a new version
- **Analytics**: per-page views, how many readers reached 50% and 100%, referrers
- **Custom slugs**: a URL such as `/p/my-release-notes`
- **Webhooks**: `page.published` and `page.updated`, signed, with a log of the last 50 deliveries
- **REST API**: publish, update, list and delete pages; OpenAPI 3.1 at `/api/v1/openapi.json`
- **CLI**: `booklet-cli` on npm, with `--json` output and exit codes for scripts
- **GitHub Action**: [`AshwinSathian/publish-to-booklet`](https://github.com/AshwinSathian/publish-to-booklet)
- **MCP server**: seven tools and five prompts, with OAuth sign-in or an API key
- **Accounts**: email and password, passkeys, and GitHub or Google sign-in where the host has configured them
---
## CLI
```bash
npm install -g booklet-cli
booklet login # save your API key
booklet publish README.md # publish a file
booklet publish README.md --watch # watch + auto-republish on save
booklet publish - < NOTES.md # from stdin
booklet pages list # list your pages
```
See [packages/cli/README.md](packages/cli/README.md) for full docs (all flags, CI/non-interactive auth via `--key` or `BOOKLET_API_KEY`, `pages open`, etc.).
---
## REST API
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:**
```bash
curl -X POST https://booklet-api.ashwinsathian.com/api/v1/publish \
-H "Authorization: Bearer bklt_..." \
-H "Content-Type: application/json" \
-d '{"raw": "# Hello\n\nThis is my page."}'
```
`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/api-docs](https://booklet.ashwinsathian.com/api-docs).
---
## MCP Server
A Node process (`mcp-server/`) that gives [Model Context Protocol](https://modelcontextprotocol.io) 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/mcp-setup](https://booklet.ashwinsathian.com/mcp-setup) has copy-paste config for Claude Desktop, Claude.ai, Cursor, Windsurf, VS Code, and Zed.
To run the server itself locally:
```bash
cd mcp-server && npm run dev
```
---
## Tech stack
| 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) |
---
## Local development
### Prerequisites
- Node.js 24 (see `.nvmrc`)
- MongoDB connection string (a local `mongod`, or any self-hosted/managed instance)
### Install & run
```bash
npm install
npm run dev # Next.js dev server at http://localhost:3000
```
### Environment variables
Create `.env.local`:
```env
NEXT_PUBLIC_SITE_URL=http://localhost:3000
MONGODB_URI=mongodb://localhost:27017/booklet
# Required: dedicated secret that signs/verifies team-invite JWT tokens.
# Must be its own random value; there is no fallback, and invite creation
# and joining fail closed if this is unset. Generate with: openssl rand -base64 32
INVITE_JWT_SECRET=<random-secret>
```
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.
### Deploy
```bash
npm run deploy # rebuilds and restarts the PM2-managed app + MCP server (scripts/redeploy.sh)
```
---
## Project structure
```
src/
app/
app/ # Editor (client)
p/[id]/ # Share page + embed
my-pages/ # Dashboard: pages and folders, version history, analytics
settings/ # Account, API keys, webhooks and their delivery log
api/v1/ # REST API
explore/ # Public page directory
templates/ # Template landing pages
components/
blocks/ # BlockRenderer + InlineRenderer (custom AST renderer)
share/ # TOC, export, embed, reading progress, analytics beacon
ui/ # Design system components
lib/
blocks.ts # Block/Inline type definitions
parse.ts # Markdown → Block[] (unified pipeline)
db/ # MongoDB helpers
storage.ts # Document content storage (MongoDB)
quota.ts # Feature flags
frontmatter.ts # YAML frontmatter parser (js-yaml)
packages/ # npm workspaces; one root lockfile covers all of these
shared/ # booklet-api-client: shared /api/v1 schemas + client
cli/ # booklet-cli npm package
mcp-server/ # MCP server (plain Node process, run under PM2)
.github/
workflows/ # ci.yml, publish-cli.yml, publish-shared.yml
examples/ # publish-to-booklet.yml, use in your own repo
```
---
## GitHub Actions
### CI
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. SLo que la gente pregunta sobre booklet
¿Qué es AshwinSathian/booklet?
+
AshwinSathian/booklet es mcp servers para el ecosistema de Claude AI. Publish Markdown incident reports, ADRs, RFCs and runbooks as web pages, with team spaces. Tiene 1 estrellas en GitHub y su última actualización registrada es del 2026-10-10.
¿Cómo se instala booklet?
+
Puedes instalar booklet clonando el repositorio (https://github.com/AshwinSathian/booklet) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar AshwinSathian/booklet?
+
Nuestro agente de seguridad ha analizado AshwinSathian/booklet y le ha asignado un Trust Score de 95/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene AshwinSathian/booklet?
+
AshwinSathian/booklet es mantenido por AshwinSathian. La última actividad registrada en GitHub es del 2026-10-10, con 1 issues abiertos.
¿Hay alternativas a booklet?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega booklet en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/ashwinsathian-booklet)<a href="https://claudewave.com/repo/ashwinsathian-booklet"><img src="https://claudewave.com/api/badge/ashwinsathian-booklet" alt="Featured on ClaudeWave: AshwinSathian/booklet" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
The fastest path to AI-powered full stack observability, even for lean teams.