ECHO · GENESIS
The number that's yours, forever.
Counter service v0.1 · hands out permanent, sequential Genesis numbers
Local-first generates your handle and your opaque uid. But a global, sequential rank — "Genesis #1284" — can't exist when every device only knows itself. This tiny service isthat one shared truth. It's the thing we refused to fake; now it's a few dozen lines of running code.
The number is shared truth. Everything about you stays yours. Those are two different problems, kept separate on purpose.
Take your place in line — for real.
Your device makes an opaque id, mines a small proof-of-work in the browser, and claims the next number from a counter backed by a real database. Claim again with the same id and you get the same number back, permanently.
Generates a throwaway opaque id, mines a real proof-of-work in your browser, then claims a permanent number from the Neon-backed counter. Demo ids only — no real vault is touched.
The smallest piece of Echo that honestly needs a server.
Numbers are handed out in order and never reissued. A global rank requires a shared source of truth — the one thing pure local-first can't provide alone.
A uid claims exactly once. Come back a year later and you get the same number. That's what makes “I was Genesis #1284” durable instead of a nice story.
It keys on an opaque uid the device already generated. It never receives memory, content, or even your echoId handle. A breach yields (uid → number) and nothing else.
An open counter is Sybil-spammable. The honest fix is a small proof-of-work on every claim — cost on the claimer, never reading anything about them to decide.
The honest sharp edge: a counter you can claim from is one you can spam. Proof-of-work raises the cost of inflation without ever inspecting the user — and if it ever needs to be stronger, the fix is more friction on claiming, never reading anything about you. Stated here so it's a known trade-off, not a surprise.
From placeholder to permanent.
A new vault identity starts with genesisNo: null — the card shows a blank#————————. To claim, the device sends its opaque uid:
POST /api/genesis/claim { uid: <vault's opaque uid>, powNonce }
→ { genesisNo, claimedAt, total }Write genesisNo into the identity and the placeholder becomes #00001284, permanently. Nothing else about the vault changes — and the counter never learned which handle, or whose memory, sits behind that uid.