hadley.

Static site generator / open source, free, private

Just write. Own your site.

You write; hadley turns it into finished pages for any web server. With an editor right on the page, a version history of your text without Git, and a comments service of its own. One program on your machine — open source, free, with no account and no tracking.

For people who write — authors, bloggers, anyone with a site of their own — who would rather write than tinker.

Start here

Install it in one line.

shell · 0.5.1Getting started →
$ curl -fsSL https://hadley.sh/install.sh | sh
$ hadley init ~/my-site
$ cd ~/my-site && hadley dev

On Linux (glibc), macOS and in WSL, with nothing else installed. On Windows, download the program from the releases on GitHub. With Node.js 24, npm installs it too.

For you · everything included

Just write.

Double-click. Write. Save.

The editor works on the page itself, in your browser, while hadley runs on your machine. What you write stays Markdown in its file, and each change is a version you can go back to.

01

Editor on the page

Switch on edit mode, double-click a block of the page in your browser, and write. Markdown stays Markdown, saved to the file it came from.

02

Versions without Git

Each page keeps its versions, whoever changed it: you, another editor, an agent. Compare word by word, undo, restore. The last 100 stay, and those you name for good.

03

Comments of your own

Visitors write without an account and without a captcha service; you approve them on your own machine, and they become part of the article, kept in its folder.

04

Search built in

It runs on the site itself, with an index for each language. No search service.

05

Several languages

One site, each page linked to its translations, and front matter keys in the writer's own language: titel:, 題名:, autor:in:.

06

Pictures, feeds, ready for AI

Every width the theme asks for, link previews, a sitemap, a feed, and llms.txt for language models.

For your AI · if you want

Bring your AI.

An agent can read all of hadley's documentation, Markanto and Lima included: about 26,000 tokens. Every new site gets an AGENTS.md that tells an agent which documentation to read for what, and every site publishes llms.txt for language models, with its pages as Markdown if you like.

Measured in November 2026: with only that documentation and no web access, an agent did five everyday tasks on a new site — an article in two languages, a note, an author profile, dark mode for good, comments. It took under four minutes, and the site built without a problem.

In the editor, the agent you already use, Claude Code or Codex, works in a panel beside the page, on the subscription you already have. Before it writes a file, runs a command or reaches the network, it asks you to allow it, and every change it makes to a page is a version you can take back. For everything else it changes, the configuration, the theme, a picture, keep your site in git: hadley init --git sets it up. What you give it goes to its provider. The chat stays off until you turn it on; starting the agent from the panel is still experimental.

For the free web

Own your site.

Open

hadley and its own packages are ISC-licensed. Your pages are files in folders, in formats with a public specification: Lima is the part of YAML that front matter needs, Markanto is Markdown as you know it, with a few extras. When you leave, your files are already with you; what a move takes is on “Is hadley for you?”.

Free

No paid tier, no plugins to buy, no subscription. What costs money is a server for the comments, and a small one will do: for the price of an espresso a month, it runs several sites, comments included.

Private

Its themes load nothing from other servers: no fonts, no scripts, no trackers, no cookies. Photos lose their location and camera data before they are published, unless you keep them. The server has no editor and no login: you write on your own machine. And the pages stay readable without JavaScript.

How hadley works

One page, three views.

01 · Source · article.md

---
publishFrom: 2026-09-16
author: Noa
description: Write close to the page.
---

# The quiet web

Keep the machinery *small*: a parser, a template, a
formatter --- and nothing you could not read in an afternoon.

## Why it matters

What you can read, you can change.

Lima and Markanto

The front matter is Lima, the part of YAML that front matter needs. The text is Markanto: Markdown as you know it, with a few extras. The first heading is the title.

A bundle: content/articles/[quiet-web]/ holds the page and its pictures. Its keys may be in the author's language and gendered too, as config.lima names them: titel:, autor:in:, 題名:.

02 · Template · article.chase

<!DOCTYPE html>
<html lang="{ meta.lang }">
<head>
  <meta charset="{ meta.charset }">
  <title>{ htmlTitle }</title>
  <link rel="stylesheet" href="{ assets['/assets/css/style.css'] }">
</head>
<body>
  <article>
    <h1>{ meta.title }</h1>
    <p class="lead">{ meta.description }</p>
    {@raw html.markup}
  </article>
</body>
</html>

A galley template

Layouts are .chase, partials .sort. { meta.title } is written escaped; HTML comes only from what hadley made and from the theme's own texts: {@raw html.markup}.

The theme belongs to the site: theme/templates/article.chase.

03 · Output · index.html

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>The quiet web</title>
  <link rel="stylesheet" href="/assets/css/style.df7a3c80.css">
</head>

<body>
  <article>
    <h1>The quiet web</h1>
    <p class="lead">Write close to the page.</p>
    <p>Keep the machinery <em>small</em>: a parser, a template, a formatter — and nothing you could not read in an afternoon.</p>
    <h2 id="why-it-matters">Why it matters</h2>
    <p>What you can read, you can change.</p>
  </article>
</body>

</html>

Formatted HTML

What the build writes, set by quad. Typography turned --- into a dash; the stylesheet carries the hash of its bytes.

In .hadley/publish/the-quiet-web/index.html, ready for any server.

Three folders

content/
What you write: pages in folders, with their pictures and their other languages.
theme/
How it looks: templates, styles and texts, copied into the site and yours to change.
.hadley/publish/
What the build makes: the site, to copy to any web server.

Four pieces

case
Reads each page: front matter in Lima, the part of YAML that front matter needs, and text in Markanto, Markdown as you know it.
galley
Puts what case read into the theme's templates, every value escaped unless it is HTML hadley made or a text of the theme.
quad
Sets the whitespace of the HTML, as quads fill the space between type.
publish
Writes the pages, the pictures in their sizes, the styles under their hash, the sitemap, the feed and the search.

Why another static site generator

Made to fit in your head.

Not because the others are bad. Hugo is fast, Astro is flexible, Eleventy is pragmatic. But with none of them did I feel I understood what happens: I found myself learning the framework, not the ground beneath it.

hadley started from the wish to be able to explain every line of it. A second reason came later, with AI assistants: the smaller and more coherent a codebase, the more useful the help. An agent can read all of its documentation at once.

Content in.
Static pages out.

Stuck, or just curious? I'm Michael, and I'm glad to help: ask in Discussions on GitHub or write to [email protected].