2.2.19
A blog you host yourself, and an AI agent can run it for you. No algorithm, no ads, no platform standing between you and your readers. One process. Two SQLite files. No cloud account needed, and Cloudflare if you want one. Your name on it, not ours.
English · Tiếng Việt
quireink.com · Try it · Install · Docs · In full · Changelog · License
demo.quireink.com is the real thing. No sign-up, nothing to fill in. The bar at the bottom jumps between the front page, the list, an article, book mode, light and dark, and the admin. That bar is the only thing added, and it lives outside the code, so the demo is always the latest build.
A blog you write in and publish from, on a server you rent. It has the usual furniture — a front page, posts, categories, search, comments, a newsletter that goes out when you publish — and none of an algorithm deciding who sees your writing, ads across the middle of it, or a company that can change the rules next year.
Colour, type, the shape of the front page and the menu are all settings in the admin, and all of it works from a phone. Setting it up once is a technical job — ask someone who knows servers, or hand it to an AI agent. After that you write, and only an upgrade sends you back to a terminal.
Made for one person, one server, one blog they mean to keep. Not made for a team that needs roles, approvals and an editorial queue.
- A real editor over Markdown, with tables, footnotes, callouts, maths, galleries and video. It saves as you type, keeps versions, and schedules.
- Four looks, six palettes, four reading fonts, light and dark, and a book mode that sets a post in two columns like paper.
- A pen for you and for your readers: highlight in five inks, underline, ring a word — drawn by hand, never the same stroke twice.
- Sign in with a passkey (fingerprint, face or device PIN) beside the password and the code, never in place of them.
- Analytics without cookies, per post and per site, and a newsletter on your own mail server.
- Moving in and out: WordPress, Ghost, Substack or Medium in; a ZIP of Markdown out.
- An AI agent can run it. A built-in MCP server lets an assistant draft, publish, read your numbers and tidy up, through the same rules the admin follows.
- Fast on a small box. One Bun process, two SQLite files, no database server, no cloud account needed.
- Eleven languages, in the admin and on the site.
Every part, in detail and against the alternatives: Quire Ink, in full.
Four looks, one setting. The same post as plain paper, source code, a newspaper and a notebook. A look sets shape, type and marks; the colour always comes from the palette.
Book mode and the dark theme. Any post opens as a paginated book that starts on a title page; every palette is drawn twice, once for light and once for dark.
Maths, code and the pen. Formulas are real MathML, code is highlighted on the server, and the pen highlights, underlines and rings words by hand.
Readers get the pen too. Their marks stay in their own browser, and travel between their devices only if they ask.
On a phone, the list, a post with its series bar, book mode and the menu drawer with search on top.
The admin. The editor on the left, and on the right the settings that decide how the site looks: all of it a setting, none of it code.
Setting up is seven short screens in the browser, and the last one drops you in the editor.
Try it first, nothing to install: demo.quireink.com, or your own throwaway blog at try.quireink.com, wiped twice an hour.
Then pick the way that matches what you have. All of them end at the same blog.
About five minutes, and $5 a month for Cloudflare's Workers Paid plan, which covers every blog in the account. The Free plan is not enough: it stops a blog at 100,000 requests a day (why).
- Press the button and sign in to Cloudflare and GitHub. Cloudflare copies Quire Ink into your GitHub and builds it.
- When the form asks for a setup code, make one up: twelve characters or more.
- Open your blog's address with
/setupon the end, type the code, and answer seven short screens.
Updating: once, in Settings → Server → Cloudflare, add the update workflow to your copy (one click, then Commit). After that, each update is one click in your copy's Actions tab.
Already running Quire Ink on a server? In its admin, Settings → Server → Run on Cloudflare moves it there, posts and pictures included. Everything else is in the Cloudflare guide.
Ubuntu or Debian (the cheapest tier is enough) and a domain pointed at it. About ten minutes:
curl -fsSL https://raw.githubusercontent.com/joiha-steven/quireink/main/server.sh \
| sudo bash -s -- --domain blog.example.com --setup-code 'twelve-or-more-characters'server.sh installs Docker, runs the newest release with a free HTTPS certificate, and refuses a machine that already serves something. Then open https://blog.example.com/setup and type the code. Updating: docker compose pull && docker compose up -d in /opt/quireink.
| You have | How | Updating |
|---|---|---|
| A NAS (Unraid, Synology, QNAP, Runtipi) | Unraid: Apps → QuireInk. The others: paste one compose file (step by step) |
The container app's Update |
| Docker already, and a domain | docker-compose.image.yml + the Caddyfile (how) |
docker compose pull && docker compose up -d |
| A server you look after yourself, with Bun 1.3+ | install.sh, then systemd and nginx (self-hosting) |
bun run upgrade |
| Kubernetes | The manifests | Change the image tag |
| A DigitalOcean droplet | One pasted file | As the VPS above |
Every way installs a published release, tried on each of these paths before it ships (how). Images exist for amd64 and arm64. Rather not do it yourself? Hand the server to an AI agent: the quireink-install skill walks it through, checks included.
- Admin → Settings → Server & connections → MCP, and create a token.
- Point your agent at
https://<your-domain>/api/mcpwithAuthorization: Bearer <token>. - Ask it for a post, a Monday traffic report or a newsletter draft. The agent cookbook has prompts that do real jobs; how MCP works here.
| You want to | Read |
|---|---|
| Install by hand, put it behind a CDN, upgrade | Self-hosting · Docker · Environment variables |
| Change how the site looks, or add your own CSS | Appearance |
| Back it up and restore it | Backups |
| Let an agent run it | MCP · Cookbook |
| Read it from another program | Content API |
| Translate it | Translations |
| Know how it is built and why | docs/ · decisions |
bun install
bun run build:admin # once, and again whenever src/admin changes
bun run dev # http://localhost:3000
# the log prints a /setup link to claim it; or: bun run user create --username me --email me@example.comNothing is finished until bun run check:all passes: two typechecks, seventeen static guards and the tests, all offline, with no credentials and no services. bun run tour then drives every screen in a real browser and opens the backup it built. Start at CONTRIBUTING.md, which points to the house rules in CLAUDE.md.
Where things live
| Where | What is in it |
|---|---|
src/ |
The whole thing: Bun, Hono, SQLite. How the pieces fit |
docs/ |
How it works and why. docs/README.md indexes it; docs/decisions/ is every decision, including the ones that were reversed |
golden/ |
The rendering contract. One byte of different output fails the build |
scripts/checks/ |
The guards. Register a write route outside the owner-only group and the build stops, same as a hardcoded font size in the reader's stylesheet |
What is planned lives with the author's own notes rather than here, because it is one person's intentions for one blog and not a promise to anybody running the software (ADR 0017).
The code here is PolyForm Noncommercial 1.0.0 plus one additional permission. Source-available, not open source. Together they come to one sentence: run it, and charge for running it, as long as the version you run is the one published here.
- Noncommercial: everything. Your own blog, a hobby project, study, research, and also charities, schools, public research bodies and government. Read it, change it, host it, fork it, pass it on.
- Commercial: yes, unmodified. Run it for a business or a client, sell hosting where each customer gets their own blog. Four things are asked in return: run a published release with its source unchanged, keep the notices, say your service runs Quire Ink and link back, and sell the service rather than the software. Settings, palettes, fonts and content are not source, so the look of a site is a setting here rather than a fork.
- A modified version, used commercially, needs a separate licence. That is the one line the project holds. Fixing a bug or a security hole in your own deployment is carved out; patch it, and tell the owner within 30 days.
- What you write stays yours. Your posts and images are not covered by the code licence and are not in this repository.
- If the project ever goes quiet, it opens. Forty-eight months without a release and the code as it then stands is also yours under the Apache License 2.0, by a grant already made today. Nobody has to be reachable for that to happen (ADR 0050).
Everything up to and including v2.0.0 was MIT, and stays MIT forever. A licence change does not reach backwards (ADR 0015).
Written by someone who cannot code. Every line of Quire Ink is Claude Code's work; I have no software background. What I do have is time for it, so updates come often. Every change goes through the test suite and a browser tour of every screen before it ships, and it runs the demo and my own blog. Bugs still happen: open an issue, because being told is how I find out.






