← All posts

Lattice — publishing sites without asking anyone first

Notes on the peer-to-peer website protocol I've been building.

I wanted to see how much of "put a site online" could be moved out of the usual stack. No registrar, no hosted backend, no DNS record to point at the right place. Just a name, a signed manifest, and peers willing to serve blocks to each other.

That experiment became Lattice.

It's a peer-to-peer protocol for publishing and browsing websites. Your name is yours because you hold the key. The network can still be messy, slow, or young, but the ownership model is simple enough to reason about.

How it actually works

Names on Lattice live on a Kademlia DHT. You claim a .loom name by publishing a signed record to the network, tied to your Ed25519 keypair. First-come, first-served. No fees. No approval process. Heartbeats keep names alive.

When you publish a site, files are content-addressed and distributed as hashed blocks. The manifest is signed by your key, so peers reject anything tampered or forged before it ever reaches you.

Browsing currently works through a local daemon and a Firefox extension. You type mysite.loom, the extension routes the request to your node, and your node fetches and verifies the site from the network. There is no public gateway in the middle of that request.

The CLI

lattice publish --dir ./my-site --name mysite

That's the publish flow I wanted: one command that does the boring setup for you. If the name is free, it gets claimed in the same step. lattice doctor and lattice status are there for when things feel off. Most of the CLI design is just trying to keep the obvious thing obvious.

Fray

Fray is the first real app built on top of Lattice — a distributed forum running at fray.loom. No central server. Posts are signed. Moderation is handled through trust records on the DHT itself.

It's the first real test that Lattice can support more than static sites. It's somewhat working again now, but I'm still not sure whether the remaining roughness is a bug I need to fix or just what a tiny network feels like before there are more peers. I'll update this when I understand that properly.

Where it stands

v0.1.0. Early access. The daemon, DHT, extension, and publish flow all work. Packages exist for Arch (AUR), Debian/Ubuntu (APT), macOS (Homebrew), and Windows (MSI).

There are sharp edges I'm aware of and not hiding — the security page has the honest version. I wouldn't use it as my only infrastructure yet. I do think it is ready for people to try.

The network is young. Every peer that joins makes content more resilient. It also makes the weird edge cases easier to separate from normal "not enough nodes yet" behaviour. If this sounds like your kind of thing, install the daemon and publish something small.

lattice.benjf.dev