Chronicles.

Open-source blog engine · Vanilla Rails · MIT

A blog you rewrite, not one you configure.

Every platform is built to be configured. This one is built to be rewritten — by you and the coding agent already sitting in your terminal.

You are looking at proof, not a promise: nityesh.com runs on Chronicles, and this very page is the kind of hand-authored document its engine can publish byte-for-byte.

The one thing that matters

Ghost is good. WordPress is good. So why build another one?

Because every blog platform ever made — Ghost, WordPress, Substack, all of them — answers the question "how do I change this?" with a settings page, a theme marketplace, or a plugin API. Someone else decided in advance which knobs you're allowed to turn.

Chronicles answers that same question with the source code. It's a vanilla Rails app small enough to hold in your head, and the whole thing is yours under an MIT license. Not a template you fill in. A codebase you own.

On most platforms, "infinite customizability" is something a marketing team wrote. Here it's just the license.

That's the asymmetry. The missing feature — comments, a second author, a podcast feed, a homepage that looks nothing like this one — isn't a roadmap item you wait for or a plugin you hope exists. It's a conversation you haven't had with your agent yet.

How ownership actually pays off

Your agent doesn't just write on it. It runs it, and rewrites it.

Owning the source only matters if changing it is cheap. It is — because the same agent you write with is the one that reshapes the platform underneath you. Three levels, each one deeper.

1

It writes with you

Chronicles ships an MCP server at /mcp with 13 tools. Your agent lists, drafts, tags, schedules, publishes, uploads images, embeds YouTube and X — and edits with surgical body patches, never wholesale rewrites of your prose.

claude.ai connects from a pasted URL. Claude Code connects with a token from /writing/connect.

2

It ships pages, not just posts

Agents write beautiful HTML. So here a complete hand-authored document is a first-class publication — served byte-for-byte at a root slug on your domain. No blog chrome. Full SEO, canonical injected, screened so it can't ship broken.

Live proof: nityesh.com/hands-on-deck was published this way, byte-identical to its source.

3

It rewrites the platform

Want comments? A second author? A different homepage entirely? Those aren't features you're missing — they're features you haven't asked for yet. You hold the complete source in the simplest full-stack framework ever made for one person.

The license is the customization API. Nothing is off-limits, because nothing is locked.

your-terminal — the entire install process
# There is no installer. Your agent is the installer.
you@laptop:~/chronicles$ claude "Read the README. Make this mine."

# It reads the codebase, then interviews you:
agent› Your name and domain?
agent› Leaving Ghost — do you have a JSON export?
agent› Want comments and a second author wired in now, or later?

# Then it fills one Setting row, imports your Ghost archive
# (posts, drafts, tags, images, embeds — URLs and SEO intact),
# and deploys you to a $6 box with Kamal.
you@laptop:~/chronicles$ git push  # tests pass → your site ships

The difference in one grid

A product manages you. A codebase answers to you.

A hosted platform

  • Change what the settings screen allows
  • Wait for the roadmap, or the right plugin
  • Customization is a feature you rent
  • Your archive and SEO live on their terms
  • Support tickets and version upgrades
  • The engine is a black box you configure

Chronicles

  • Change anything — it's Rails you can read
  • Ask your agent; ship it this afternoon
  • Customization is the MIT license
  • Your archive, URLs and SEO arrive intact
  • Fork it, own it, never look back
  • The engine is the product, and it's yours

What's in the box

A real publishing engine, not a starter kit.

This ran a real publication before it was open-sourced. The port from Ghost was parity-gated — a script compared both sites URL by URL until they matched. Search Console never noticed the switch.

/writing

A proper writing room

Rich-text editor (Basecamp's Lexxy) that autosaves every 2 seconds. Publish now, or pick a future time and a background job does it for you.

SEO parity

The reader experience

Designed homepage, tag pages, RSS, a sitemap index, full OG / Twitter / JSON-LD head tags, and 301s that keep old links alive forever.

lib/ghost/

A Ghost importer

Posts, drafts, pages, tags, images, embeds — mobiledoc in, Action Text out. Your whole archive migrates without breaking a URL.

Setting

Site identity in one row

Title, author, logo, domain, social handles — one database row. Rebrand the entire site without touching a line of Ruby.

Kamal

Deploy to one cheap box

SQLite for database, jobs, cache and cable. No build step, no node_modules. Push to main, tests pass, site ships. Runs on a $6 droplet.

/mcp

Agent-native, end to end

13 MCP tools and OAuth built in, dynamic client registration included — so an agent can onboard itself from a single pasted URL.

What's deliberately not in the box

No comments. No analytics. No payments. No memberships. No multi-author. Not because any of it is hard — because one person hasn't needed it yet. This isn't a feature matrix that has to look complete; it's a codebase honest about being small.

// It ships with one author because it was written by one person.
// If you want a second, that's an afternoon — not a paywall.

Read this before you fork

This is a codebase, not a product. That cuts both ways.

Fork this if

  • You run a coding agent as a matter of course
  • Your writing and side projects are scattered across platforms you only rent
  • You want a site your agent can operate and reshape
  • You're leaving Ghost and want your archive, URLs and SEO to arrive intact

Don't fork this if

  • You don't use a coding agent — Ghost and WordPress are right there, and they're good
  • You want a maintained product with support, versions and a roadmap
  • You won't run a real server with a disk (about $6/month)
  • You expect to git pull someone else's improvements — there are none to pull

The support policy is one sentence: I break it constantly and chronicle the breakage. There is no stable version — fork it and it's yours. If it breaks, ask your agent to fix it.

Fork it

Stop renting the platform. Own the source.

Three steps, and your agent handles the hard one. There's no installer — your agent is the installer.

  1. 01 Fork the repo.
  2. 02 Hand it to your coding agent: "Read the README. Make this mine."
  3. 03 Answer its questions, point your DNS at your box, and publish.
Fork Chronicles on GitHub