Documentation platform for InkBot
Docs that your team and your bots keep up to date
Quill is a self-hosted documentation site with an admin portal for people and a REST API for bots. Every page is a Markdown file on your own server.
- Next.js 16
- Markdown files on disk
- No database
- Runs on your server
The platform
One site, written by hand or by your bots
Readers see a clean docs site. Your team edits it in the admin portal. Your InkBot bots edit it through the API. All three work on the same Markdown files.
A docs site readers can find their way around
A full-width header, a fixed sidebar with collapsible folders, an “On this page” list on every page, and instant search with Ctrl K.
An admin portal for the people who write
A password-protected editor at /admin with a live preview, drafts, file uploads and a sidebar you arrange by dragging.
A REST API for the bots that write
Bots create, update, append to, move and delete pages, edit the navigation and search the site, with a Bearer key.
Components
More than plain Markdown
Pages can use callouts, numbered steps, tabs, question-and-answer blocks, keyboard keys, tables, highlighted code, images and video. Each one is a short directive in the Markdown file.
Callouts
Note
A note adds context that helps but isn’t essential.
Tip
A tip shows a quicker or better way to do something.
Warning
A warning says what could go wrong, before it does.
Steps
Create a key
Add a long random value to
QUILL_API_KEYSand restart Quill.Give the bot the address
It sends the key on every write as a Bearer token.
Point it at the map
/llms.txtlists every page.
Tabs
Docker
Build the image, then run it with a volume mounted at /data.
Node server
Install Node.js 22, build once, and keep it running with a process manager.
Other hosts
Any host with a persistent, writable disk, such as Railway or Fly.io.
Questions and answers
Where are pages stored?
As Markdown files with front matter, in the content folder.
Does it need a database?
No. The files on disk are the only source of truth.
Can I keep the content in git?
Yes. Commit the content folder like any other text files.
Keyboard keys and tables
| Action | Keys |
|---|---|
| Search the docs | Ctrl K |
| Search from anywhere | / |
| Move between tabs | ← → |
The Markdown behind it
:::steps
### Build the image
```bash
docker build -t quill-docs .
```
:::
:::warning
Without `-v`, edits are lost.
:::Admin portal
Edit pages by hand at /admin
The admin portal is protected by a password you set. It has everything you need to write and organise the site.
- Live preview
- Write Markdown on one side and see the finished page on the other as you type.
- Drafts
- Keep a page hidden from readers until it is ready to publish.
- File uploads
- Add images, video and downloads, then link to them from any page.
- Sidebar editor
- Drag pages into order, group them, and nest them in folders.
- Site settings
- Change the name, header links, home page cards and footer.
API for bots
Let your InkBot bots maintain the docs
Give a bot an API key and it can add a page when a feature ships, append a question to the FAQ, or fix a step that changed. Reads are open; writes need Authorization: Bearer <key>.
/api/v1/openapi.jsondescribes every endpoint/llms.txtlists every page in plain text
Append to a page
curl -X PATCH https://docs.example.org/api/v1/pages/help/faq \
-H "Authorization: Bearer $QUILL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"appendBody":":::accordion[Can I export to PDF?]\n..."}'Create a page
curl -X PUT https://docs.example.org/api/v1/pages/deploy/fly \
-H "Authorization: Bearer $QUILL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Fly.io","group":"Get started",
"folder":"Deploy","body":"..."}'Move a page
curl -X PATCH https://docs.example.org/api/v1/pages/deploy/fly \
-H "Authorization: Bearer $QUILL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"newSlug":"deploy/fly-io"}'Search
curl "https://docs.example.org/api/v1/search?q=docker"
# No key needed to read.| Methods | Path | What it does |
|---|---|---|
| GETPOST | /api/v1/pages | List pages, or create one |
| GETPUTPATCHDELETE | /api/v1/pages/{slug} | Read, replace, append to, move or delete a page |
| GETPUT | /api/v1/navigation | Read or reorder the sidebar |
| GETPUTPATCH | /api/v1/site | Read or change site settings |
| GET | /api/v1/search?q= | Search every page |
| GETPOSTDELETE | /api/v1/uploads | List, upload and remove files |
Self-hosted
Your server, your files
Quill has no database and no outside service. The content belongs to you and lives where you can see it.
Markdown files on disk
Each page is a Markdown file with front matter. Copy the folder to move your docs, or commit it to git to review every change.
content/ ├─ site.json name, links, sidebar ├─ pages/ │ ├─ introduction.md │ ├─ deploy/ │ │ └─ docker.md │ └─ help/ │ └─ faq.md └─ uploads/
Runs wherever you have a disk
Quill saves edits to its own disk, so it needs a host where that disk is writable and persistent.
- Docker
- A VPS
- Railway
- Fly.io
docker run -p 3000:3000 -v quill-data:/data \
-e QUILL_ADMIN_PASSWORD=... \
-e QUILL_API_KEYS=... quill-docsNote
Plain Vercel or Netlify will serve the site, but their read-only file systems can’t save edits.
Get started
Quill takes about five minutes to set up.