Build a local chain on your computer and watch it produce blocks. On 2026-10-17, two Macs on one home network ran one chain together; in the closed beta, our own Macs can now run a private chain, with a roadmap for opening it to others. Check what each network is before you start.
New to the project? Understand Zerone: its purpose, one contribution, and how knowledge, money and control fit together.
01 · Build and run
A chain on your computer.
This setup runs on loopback addresses. It creates fresh local state and test keys in a directory you choose. Local test funds only; no live ZRN balance or reward entitlement.
Before you start
Access to the private zerone-core repository on GitHub; without it the first step cannot clone.
Go 1.25.14, Git, make and the platform C build tools.
Python 3.11+ and a terminal on Linux or macOS.
A new, dedicated home directory and free loopback ports 47656 and 47657.
Network access for the source and Go dependencies during the build.
Run these commands in order. The start command stays open; use a second terminal for the final check.
01
Get the pinned source
Where A directory where zerone-local-source does not exist
Terminal
git clone https://github.com/cambridgetcg/zerone-core.git zerone-local-source
cd zerone-local-source
git checkout --detach 15c3e5ce7cac74de31a3de647cdd61da039eae58
Check git rev-parse HEAD reports 15c3e5ce7cac74de31a3de647cdd61da039eae58.
02
Build the local binary
Where zerone-local-source
Terminal
GOTOOLCHAIN=go1.25.14 make build
./build/zeroned version --long
Check The build succeeds and the binary reports the pinned source revision.
03
Check the setup helper
Where zerone-local-source
Terminal
python3 -c 'import hashlib; from pathlib import Path; actual = hashlib.sha256(Path("scripts/local-node.py").read_bytes()).hexdigest(); assert actual == "624c3dc5e79dd68915b36d60eed9ec783c245e16f7b312a312437469e59b1a22", "Setup helper digest mismatch"; print(actual)'
Check The helper SHA-256 is 624c3dc5e79dd68915b36d60eed9ec783c245e16f7b312a312437469e59b1a22.
Check Read result.node_info.network and result.sync_info.latest_block_height from your local node.
Optional: send local test funds
Send 100 uzrn from the funded local user to the local validator, with a 250000 uzrn test fee. This signs a local transaction; it uses no live funds.
Where zerone-local-source, in the second terminal while the node remains running
Terminal
LOCAL_HOME="$HOME/zerone-local"
LOCAL_BIN="$LOCAL_HOME/bin/zeroned"
TX_HASH=""
python3 scripts/local-node.py status --home "$LOCAL_HOME" &&
RECIPIENT=$("$LOCAL_BIN" keys show validator -a --home "$LOCAL_HOME" --keyring-backend test) &&
LOCAL_TX_OUTPUT=$("$LOCAL_BIN" tx bank send user "$RECIPIENT" 100uzrn --home "$LOCAL_HOME" --chain-id zerone-local-1 --keyring-backend test --node http://127.0.0.1:47657 --fees 250000uzrn --gas 250000 --yes --output json) &&
printf '%s\n' "$LOCAL_TX_OUTPUT" &&
TX_HASH=$(printf '%s' "$LOCAL_TX_OUTPUT" | python3 -c 'import json,re,sys; result=json.load(sys.stdin); txhash=result.get("txhash", ""); assert result.get("code") == 0 and re.fullmatch("[0-9A-Fa-f]{64}", txhash), "No accepted transaction hash returned"; print(txhash)')
Confirm it was committed
In the same terminal, query the captured hash until the result has height greater than zero and code 0. The initial send response at height 0 is only mempool acceptance.
Terminal
if [ -n "$TX_HASH" ]; then
"$LOCAL_BIN" query tx "$TX_HASH" --home "$LOCAL_HOME" --node http://127.0.0.1:47657 --output json
else
printf 'No accepted transaction hash was captured.\n'
fi
If the transaction is not indexed yet, retry only the query. Repeating the send creates another transaction and spends another local test fee.
Put a claim into a block
Create a fresh knowledge sandbox with funded development participants. Submit a signed claim, save reasoned reviews, record a counterclaim and inspect the retained history in a local browser page.
Local development only. The same operator controls these accounts; an accepted review outcome is not a guarantee of truth or independent scientific agreement.
A fresh, valueless Zerone chain whose validators are our own Macs on our home network. Each Mac makes its own keys, and they never leave it. A chain can be thrown away and started again under a new chain id.
Seat
One Mac running one node, with keys made on that Mac.
Coordinator
The seat that writes the invitations and builds the genesis.
Genesis
The chain's first record: its settings, its validators and their stakes.
Who can join
Our own Macs, for now
For now, only our own Apple silicon Macs on our home network, each invited by the operator before the chain starts. Other people's Macs cannot join yet; they are a later stage of the roadmap.
Invited seats only. The genesis is built only from seat packets whose label, role and stake match an invitation the operator issued.
Private addresses only. Every seat address must be a private address (10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16), so seats reach each other only inside a private network. The check cannot tell one home network from another, or our Macs from anyone else's: the invitations decide which Macs are seats, and for now they go only to our own.
Seats only, at the door. Each node accepts inbound connections only from the other seats' node keys, which CometBFT checks in its authenticated handshake. A node that holds the genesis but no seat is turned away.
Fixed at genesis. The seat list cannot change later. Adding a Mac means a new chain and a new round of invitations.
First LAN run · 2026-10-17 · zerone-rehearsal-lan-1
Two Macs, one chain
Two Apple silicon Macs on one home network each ran a validator with an equal stake of 1,000 test ZRN, which carries no value. They produced 446 blocks, one about every 2.9 seconds, each proposing half of them. The recorded compare agreed at all 21 heights it shared, and a transfer of 1 test ZRN from one validator appeared in the other's balance.
One home and one operator: two Macs, not independent operators. This makes no claim of decentralisation.
A short run of about 21 minutes of blocks. Day-long uptime, a restarted seat and three or more Macs are not yet shown.
It used an earlier version of the tool with a hand-built kit. The kit flow, the firewall signing fix and the seats-only door came afterwards and have run only in automated tests on one machine.
The second Mac's firewall rule silently failed, so the chain relied on that Mac dialling out.
Automated tests also cover:
On one machine, four validators with their own keys and a full seat agree, see a transfer, and keep finalising with one validator stopped.
A two-seat test runs the invitation, kit, genesis and install steps, and refuses a node that holds the genesis but no seat.
One of our own Apple silicon Macs on our home network, with Python 3.9 or newer; the macOS Command Line Tools python works.
A fixed address on that network: a DHCP reservation, with Private Wi-Fi Address set to Fixed or Off. A changed address needs a new chain.
A validator Mac stays awake and on the network while the chain runs; with two validators, neither may be away. A laptop is better as a full seat, which follows the chain without voting.
About 20 GiB of free disk, TCP port 36656 on the Mac's network address, and 36657 on loopback.
No Go toolchain or repository access on a seat: the kit carries the tool and the pinned zeroned.
The operator's help: carrying files between Macs, allowing zeroned through the macOS firewall, and confirming the seat table before any node starts.
How a Mac joins
01
Operator
Invitation and kit
The coordinating Mac writes an invitation that fixes this Mac's role and stake and pins the sha256 of the tool and of zeroned. The operator carries the kit across.
02
Seat Mac
Check and seat
The kit's START-HERE.md lists this Mac's exact commands: receive the kit, pin the binary against the invitation, run preflight, then seat. The keys are made on this Mac and stay there; only the public seat packet goes back.
03
Coordinator
One genesis
The coordinator builds the genesis from the invited seat packets, once.
04
Seat Mac
Verify, then install
The install command checks the genesis against this Mac's own defaults and against the sha256 the operator relays in a separate message. It then writes a configuration that listens only on this Mac's network address and admits only the other seats.
05
Operator
Confirm and start
Each seat prints the seat table, and every table must list the same seats. On the operator's yes, the nodes start; blocks begin once more than two thirds of the stake is online.
06
Every seat
Show agreement
The status and compare commands and a test transfer show that every seat sees the same chain.
There is no sign-up form. For now the operator invites only our own Macs, and no genesis, peer address, invitation or kit is published here. Not one of our Macs? You can still run a local node, read zerone-1, and follow the roadmap below.
From closed beta to everyone
Done
Rehearsed on one machine
Four validators and a full seat, each with its own keys, run the protocol on loopback in automated tests.
Done
First run across two Macs
On 2026-10-17, two validators on one home network agreed at every height compared and carried a transfer.
Now
Closed beta on our own Macs
Only our own Apple silicon Macs on our home network, each invited and admitted at the door by node key. Each run starts its own new, valueless chain.
Still to show
A run of the current kit and tool across three or more Macs, kept up for a day, with one seat restarted and every compare output kept.
The firewall signing fix confirmed on a second Mac.
Planned
Other people's Macs on our home network
Macs that are not ours join as seats, still by invitation and still on our home network.
Opens when
Signed invitations and kits, so a seat can check who issued them.
Each seat under its own macOS user, so other software on that Mac cannot read its keys.
A plain note for each invited person: what the seat runs on their Mac, what it shares on the network, and how to remove it.
Planned
Invited Macs beyond our home network
Seats outside our home network, still by invitation.
Opens when
An overlay network path proven between two Macs.
A way to carry files that does not need the operator beside every Mac.
Planned
More kinds of devices
Seats on Linux computers and Intel Macs, not only Apple silicon.
Opens when
A build for each platform, each pinned by its own sha256; today one Apple silicon binary is pinned per chain.
Planned
Join a running network
A new node joins an existing chain instead of a new chain for every new member.
Opens when
A way for a node to join after genesis; today the seat list is fixed at genesis.
Planned
Open to everyone
Anyone can verify a signed release and run a node on a public network. Which network that is has not been decided.
Opens when
A public, signed release with its provenance, since the source repository is private today.
A release-bound join packet: the exact binary digest, the genesis and authenticated peers.
A separate, signed decision to open that network.
No dates: a stage opens when its own gates and those of every earlier stage are met. This closed beta does not open zerone-1 validator joining, the shared development chain's validator seat, or any successor network.
Separate chain · operator verified publication
Work on a claim together.
Deployment checked 2026-09-23T10:01:17Z. Availability can change; reads below make a new endpoint observation.
zerone-dev-1 · your own local keys
Submit, review, challenge
The initial consensus has one operator-controlled validator seat. Development funds and full nodes do not confer block-signing membership. Separately controlled contributors and reviewers are welcome; several addresses do not prove independent people or agents.
Valueless development funds: 1,000 ZRN per address, once, within a 100,000 ZRN lifetime faucet budget. At most 5 new grants per IP per hour and 10 globally per hour. No cash value, promised future allocation, implied scientific credibility or proof of personhood. Existing development fee and review-settlement rules still apply.
Read the claim, attributed reasons, revealed reviews, derived facts and directly linked challenges at one observed height. There is no inferred pending-work feed.
Commit and reveal each allow 3,600 blocks by default. Follow the round's actual height deadlines; block counts are not a wall-clock guarantee. Keep your committed review and salt locally until reveal.
A reset requires a new chain ID and a public notice preserving the old public history. This network does not replace zerone-1 or activate zerone-2.
02 · Public observations
Read zerone-1.
A custodial network with a disclosed sole-validator trust model. Gateway reads are observations, not independent proofs; the upstream node hop uses HTTP.
Available · no account
Inspect public records
Open a selected read endpoint, or use the dashboard. These links return public observations; this guide does not poll the network.
Read the returned denom and amount; a failed request means unavailable, not zero.
For automated reads, send an honest application User-Agent, such as zerone-node-guide/1.0, and set a timeout. Some generic client signatures are blocked by the gateway. Treat non-200 responses as unavailable.
A signed Linux amd64 observer package retains the legacy application with reviewed dependency fixes and follows the ledger with zero voting power. Check the bootstrap expiry before installing.
Experimental legacy runtime: SDK 0.50 is end of life and Go 1.25 is outside upstream support. Review the retained dependency risks in the release notes before installing; long-term maintenance is not established.
Linux amd64, Python 3.11+, gpgv, local Docker, 2 available CPUs, 6 GiB available memory and at least 20 GiB free disk for an initial trial.
New bootstrap deadline: 2026-09-16T19:19:13Z. New bootstrap is refused after the signed expiry. Obtain a refreshed signed package then. A successfully synced home can resume with its original verified package.
Use new directories for the tools, package and home. First confirm the release authority fingerprint from a trusted Zerone source: 09327B031F8FF2C2EE49B18F2234027FC5B68C19. The source-pinned unpacker verifies the signature and every file before package code runs.
Wait for FOLLOWING: the fresh zero-power observer has synced and advanced with recent blocks. RPC listens at http://127.0.0.1:27657.
In another terminal:
Terminal
python3 -I -B "$HOME/zerone-observer-package/observer.py" status --home "$HOME/zerone-observer-home"
Press Ctrl-C in the start terminal; keep the package and home. Repeat start to resume the same observer.
Operator-selected sole-validator checkpoint; the RPC aliases share one upstream. State sync starts from a recent snapshot; it does not replay the complete history or repair legacy signer custody. Keep the RPC on loopback. Source reproduction details ↗
On zerone-1, validator joining, new-account admission, starter funds, sponsored onboarding, and reward-claim onboarding remain paused. Joining status ↗ · Trust model ↗
A dated ledger census records application height 1261575 on 2026-09-09. It is a historical checkpoint, not a claim of current freshness. Read the census ↗ · Settlement history ↗
03 · Bring your work
Find a place to contribute.
Start with an integration, a reproducible observation, or a source change. Existing account tools and the participation principles are also available to inspect.
Build an agent integration
Run the local node and test against its local RPC using the pinned API and SDK. This needs access to the source, which is not public.
Compare public records, reproduce local results, and contribute a bounded issue or source change. The issue tracker and source need repository access, which is not public. Share public evidence, never keys or private account material.
The tool this guide describes. A closed-beta seat checks its kit against the sha256 in its own invitation.
The zerone-core repository is private. Source links, both clone steps and the observer's release downloads need repository access; this guide and guide.json do not.
The same steps and source pins are available as a static file for tools and agents.