Write in plain Markdown
A post is a Markdown file with a little frontmatter; a site is a folder of them. If that folder is an Obsidian vault, wikilinks, ![[embeds]] and co-located images resolve the way you expect. Drafts, series, tags, aliases with proper 301 redirects, and embargoed posts (publish_after:) are all one frontmatter line each.
Rich content works out of the box: highlighted code, KaTeX maths, Mermaid diagrams, callouts, pull-quotes, tables, task lists, video and audio with a themed player, and downloadable attachments that flow into your podcast feed as enclosures.
Typeset like a broadsheet
The bundled press theme is an editorial newspaper: real typography (Fraunces over Inter), a restrained palette, light and dark, and print-inspired detail throughout. Prefer something stricter? The broadsheet and gazette variants restyle it with a single CSS file, and community themes ship in the repo. Or bring your own: a theme is a folder of templates, and overriding one file is enough to start.
Reach readers everywhere
Feeds are not an afterthought: RSS, Atom and JSON, with audio enclosures, plus a sitemap and WebSub pings so subscribers hear about new posts in seconds. Your markup speaks microformats2, so the IndieWeb can read you; webmentions let replies, likes and reposts from other sites (and the Fediverse, via Bridgy Fed) appear on your posts, with a committed blocklist for moderation.
Syndication is POSSE done properly: the canonical post lives on your domain, copies go to Bluesky and Mastodon, and a committed ledger makes re-runs safe. Nothing ever double-posts.
Search with no server
Visitors get instant on-site search from a static, sharded BM25 index. Optional fuzzy matching forgives typos. There is nothing to host, no third-party service, and nothing phoning home.
Posts that present themselves
Add slides: true and a post projects itself into a slide deck at /slides/: headings become slides, prose becomes speaker notes, and the reader gets presenter mode, autocue and fullscreen. It is still one HTML file, and it still reads perfectly with JavaScript switched off.
Optional AI media, your keys, your cache
Write hero: gen:a desk by a window, morning light and colophon generates the artwork (MiniMax, Gemini, OpenAI, xAI, Together and more). Turn on audio: true and each post gets a spoken reading with a themed player and podcast enclosure. Generated media is content-addressed and cached in your repository, so a normal build never calls an API, and none of this is required: skip the config and colophon is a pure static site generator.
Your assistant, your voice
colophon ships agent skills for Claude Code, Codex, Gemini CLI, Cursor, Copilot and OpenCode. Run colophon skills install once and your assistant knows how to draft a post, revise one without flattening your style, cross-link related entries, fill in tags and SEO metadata, and run the publish flow.
The voice comes from personas: a style guide plus the exemplar corpus of everything you have already written in that voice. colophon persona context hands the model both, so an LLM-drafted post sounds like you on a good day, not like a press release. The byline and the voice are separate on purpose; one author can write in several registers, and a team can share one.
Speak your readers' languages
Put post.es.md beside post.md and colophon wires them together: hreflang links, language chips, a polite "available in your language" hint (never a forced redirect), and per-language pronunciation dictionaries so spoken readings sound right in every language.
Accessible, seriously
colophon output targets WCAG 2.2 Level AAA: 7:1 contrast, visible focus everywhere, keyboard access to everything (including scrollable tables and maths), and full progressive enhancement. Screen readers, keyboards and no-JS browsers are first-class readers.
Publish anywhere, incrementally
Publishers are pure mechanism: Cloudflare Pages, GitHub Pages, S3, R2, Tigris, MinIO, any git remote, or any command you care to run. Environments decide what deploys where (production, preview, staging), deploys are incremental so only changed files upload, and a --allow-publish latch keeps accidents out of production.
Ready to try it? Get started, or read the documentation.