DEV Community

Cover image for Quire Ink: one process, two SQLite files, and an AI agent that can run your blog
Steven Tran
Steven Tran

Posted on

Quire Ink: one process, two SQLite files, and an AI agent that can run your blog

Last month I moved my blog off a platform and onto a rented server, and instead of installing WordPress I finished something I had been building for it: Quire Ink, a blog engine that is one process and two SQLite files. No database server, no build pipeline, no cloud account anywhere in the path.

bun src/index.ts
Enter fullscreen mode Exit fullscreen mode

That line is the whole deployment. Point nginx at the port and you have a blog.

The part readers notice

Opening a post costs about 114 KB, first visit, nothing cached. Of that, 67 KB is fonts I host myself and the JavaScript is 3.6 to 7.8 KB, written by hand. Third-party requests: zero. No CDN, no font host, no tracker.

The numbers hold because the build enforces them. Every bundle has a size cap and the build fails if a feature crosses it, so nothing can quietly start costing every reader a little more forever.

And the reading page is where most of the work went:

  • Six palettes in light and dark, and four reading typefaces, all switchable by the reader, not just the owner. Fonts ship with Vietnamese and Central European accents included.
  • Book mode: a fullscreen two-column reader on paper, with a drop cap and a page count. Not a filter over the page, a second typography.
  • A five-ink highlighter. Write ==text== and it renders as an SVG stroke with chisel ends that breaks per line, pigments measured off a photograph of a real pen box. Readers can also keep their own highlights. 1.4 KB, and zero if unused.
  • Math is MathML, drawn by the browser's own layout engine. No script, no stylesheet, no font file, so a post with a formula costs the reader nothing over one without.
  • Code is highlighted on the server, 21 languages, so no highlighter ships to the browser. A fence that names no language gets a timid guess, so program output stays plain.
  • Search answers as you type, a contents rail follows the post, and related posts, reading time and a progress bar are all there. The progress bar and the fade-in are pure CSS.

The part I use every day

The admin just went through a rebuild (v2.1.0 shipped this week) around one idea: it is a writing desk, not a control panel. The list of everything you have written sits beside the paper you are writing on. Search reads the body of your drafts, not just titles, and it survives Vietnamese diacritics, so typing gioi thieu finds "Giới thiệu".

The editor is a real one over Markdown: tables, footnotes, callouts, video, Spotify embeds, image galleries. Drop an image in and it is resized for every screen. It saves as you type, keeps three revisions, and can hold a post until Tuesday morning. Type / on an empty line for the insert menu, which prints each block's Markdown shortcut beside it, so the menu teaches the gesture that replaces it.

The rest of the desk, briefly:

  • A composed front page if you want one: lead story, picks, a row per category, most read. Or a plain list, or a page you wrote. Works with photographs and with only words.
  • Analytics without cookies: who read what, how far down they got, where they came from.
  • A newsletter on your own SMTP: sign-ups with confirmation, an issue sent when you publish, a note when a comment gets a reply. Nothing to sign up for.
  • Series for writing in parts; every part shows the others.
  • SEO done for you: sitemap, RSS, robots.txt, llms.txt, an Open Graph image drawn per post, and old URLs that keep working on their own when you rename a slug.
  • Backups: one button downloads the entire install, and a cron script ships it off the server. The test suite restores one and checks every byte, because a backup nobody has restored is not a backup.
  • A WordPress importer: upload the XML export, posts and pages come out as Markdown.
  • Six languages, admin and site: English, Vietnamese, German, Japanese, Chinese, Korean.
  • Sign-in that takes itself seriously: argon2id, a TOTP code every time, ten recovery codes for the day you lose the phone. No Google in the login path.
  • A trash you can undo, an activity log, and it installs to a phone's home screen like an app.

The part that surprised people

Quire Ink has an MCP server built in. Connect Claude or any MCP client, create a token in the admin, and say:

Write a 600-word post about today's trip, tag it travel, publish it.

The agent drafts, tags, schedules and publishes through exactly the same rules the admin follows, revisions and trash included. Revoke the token and it stops that second. Setting up a fresh server is also something you can hand to an agent whole: there is no OAuth app to register and no service to sign up for, so it can actually finish the job.

What it is not

It has one owner, on purpose. No roles, no editorial queue, no multi-author anything. A newsroom should look elsewhere; a person who wants to keep their own writing on their own machine is exactly who it is for.

The license is source-available, not open source: PolyForm Noncommercial, plus a grant that lets you run unmodified releases commercially, paid hosting included. Modify it and sell it, and you need to ask first.

Try it without installing anything

The demo is the real product, seeded with real posts, admin included, no sign-up: demo.quireink.com. The bar at the bottom jumps between the newspaper front page, an article, book mode, both palettes and the admin.

I write on it daily at manhhung.me. Questions and bug reports are welcome on GitHub.

Top comments (0)