← All posts

Day one: the idea, and an empty Go module

Every project starts as one commit. Today that commit is an architecture doc and an empty Go module — and a stubborn idea: your data should live on machines you own, replicated across people you trust, encrypted end to end, with nobody's cloud in the middle.

Day one: the idea, and an empty Go module

Every project starts the same way: one commit, no users, and far too much confidence. Today's first commit is honest about it — an architecture document and an empty Go module. That's the whole thing. No network, no storage, no UI. Just a plan and a go.mod.

The itch

I wanted a place to keep things — files, photos, music, chats — that didn't live in someone else's data center, didn't quietly change its terms of service, and didn't disappear the day a company pivoted. I have machines. You probably have machines. The hardware to store our own lives already exists; what's missing is software that stitches those machines into something that holds.

So that's the goal:

  • Homelab-first. It should run happily on the boxes you already own — a NAS, an old laptop, a Raspberry Pi.
  • Distributed by design. Data is replicated across your nodes and the people you trust, so no single disk failure is a catastrophe.
  • Encrypted and content-addressed. Blocks are addressed by their hash and encrypted before they ever leave a machine. The network moves ciphertext.
  • Trustless where it can be. A peer can hold your data without being able to read it.

Writing the plan before the code

The architecture doc is long, and I already know most of it is wrong — that's fine. Writing it down forces the hard questions early: how do nodes find each other, how does a vault know it's in sync with a peer in one comparison, what's the block size, what happens when a node has been offline for a week.

(For the record, it started life under a different name. The current one — MeshHold — came later. The mesh part was always the point; the "hold" is the promise.)

Day one is mostly faith. But the module compiles, the doc has a table of contents, and tomorrow there's code to write. That'll do.