ZERONE Node guide Dashboard

Local sandbox · closed beta

Run your own
node.

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.

  1. 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.

  2. 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.

  3. 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.

  4. Create fresh local state

    Where zerone-local-source

    Terminal
    python3 scripts/local-node.py init --home "$HOME/zerone-local" --binary "$PWD/build/zeroned"

    Check A new local genesis, validator and funded test account are created in the chosen home.

  5. Start your local node

    Where zerone-local-source

    Terminal
    python3 scripts/local-node.py start --home "$HOME/zerone-local"

    Check The foreground process confirms zerone-local-1 and advancing blocks. Leave this terminal open.

  6. Check it from another terminal

    Where zerone-local-source, in a second terminal

    Terminal
    python3 scripts/local-node.py status --home "$HOME/zerone-local"

    Check The JSON status confirms the local node identity, chain and advancing height.

Stop and return

Press Ctrl-C in the start terminal. The helper stops its own child and preserves your local state.

Initialization refuses an existing home. Restart the same home to continue; setup is not a reset command.

Terminal
python3 scripts/local-node.py start --home "$HOME/zerone-local"

Initialization retains the exact binary in your local home. Restart uses that copy, even if you later rebuild the source checkout.

Retained binary: $HOME/zerone-local/bin/zeroned

Your local endpoints

Chain
zerone-local-1
RPC
http://127.0.0.1:47657
P2P
tcp://127.0.0.1:47656
Disabled in this setup
REST, gRPC, gRPC-Web

Fresh local test keys remain in your chosen home. Never import a live validator key or reuse test keys for real funds.

These APIs describe the pinned local source. Public legacy routes and messages may differ.

Make a first read from your tool

With the local node running, read its status from another terminal.

Terminal
curl --fail --max-time 10 http://127.0.0.1:47657/status

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.

Run the claim workflow

Closed beta · by invitation

Run a node
with other Macs.

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.

What a seat needs

  • 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

  1. 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.

  2. 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.

  3. Coordinator

    One genesis

    The coordinator builds the genesis from the invited seat packets, once.

  4. 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.

  5. 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.

  6. 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

  1. Done

    Rehearsed on one machine

    Four validators and a full seat, each with its own keys, run the protocol on loopback in automated tests.

  2. 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.

  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.

Readable history · no browser transactions

Share an exact claim ID

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.

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.

Open the zerone.ai dashboard

Experimental signed release · Linux amd64

Follow the ledger
with your own observer

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.

Verify and start the observer

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.

Terminal
git clone https://github.com/cambridgetcg/zerone-core.git zerone-observer-tools &&
cd zerone-observer-tools &&
git checkout --detach ed364bc0afec062612b61a309002f23da85acf2c &&
curl --fail --location --connect-timeout 15 --max-time 300 --proto '=https' --proto-redir '=https' 'https://github.com/cambridgetcg/zerone-core/releases/download/zerone-1-observer-20260909.2/observer-release.tar.gz' --output ../observer-release.tar.gz &&
python3 -I -c 'import hashlib; from pathlib import Path; assert hashlib.sha256(Path("../observer-release.tar.gz").read_bytes()).hexdigest() == "5d874b4c38427117f1567ea0152fc4782e066e4926f3294f1eb776ff6ce22d08", "Archive digest mismatch"' &&
python3 -I -B deploy/legacy-observer/package.py unpack --archive "$PWD/../observer-release.tar.gz" --output "$HOME/zerone-observer-package" --gpgv "$(command -v gpgv)" &&
curl --fail --location --connect-timeout 15 --max-time 60 --proto '=https' --proto-redir '=https' 'https://github.com/cambridgetcg/zerone-core/releases/download/zerone-1-observer-20260909.2/REHEARSAL-RECEIPT.json' --output ../REHEARSAL-RECEIPT.json &&
curl --fail --location --connect-timeout 15 --max-time 60 --proto '=https' --proto-redir '=https' 'https://github.com/cambridgetcg/zerone-core/releases/download/zerone-1-observer-20260909.2/REHEARSAL-RECEIPT.json.sig' --output ../REHEARSAL-RECEIPT.json.sig &&
python3 -I -c 'import hashlib; from pathlib import Path; assert hashlib.sha256(Path("../REHEARSAL-RECEIPT.json").read_bytes()).hexdigest() == "c99a1bac24b9ccc71a2769ce10d72f0a947eec8cb4b4afe9df22df2886c0ed0b", "Rehearsal receipt digest mismatch"' &&
python3 -I -B deploy/legacy-observer/verify-rehearsal.py --bundle "$HOME/zerone-observer-package" --archive "$PWD/../observer-release.tar.gz" --receipt "$PWD/../REHEARSAL-RECEIPT.json" --signature "$PWD/../REHEARSAL-RECEIPT.json.sig" --gpgv "$(command -v gpgv)"

Create fresh state

Terminal
python3 -I -B "$HOME/zerone-observer-package/observer.py" init --home "$HOME/zerone-observer-home"

Follow new blocks

Terminal
python3 -I -B "$HOME/zerone-observer-package/observer.py" start --home "$HOME/zerone-observer-home"

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.

Open the local setup

Use an existing zerone-1 account

Connect Keplr to inspect an address and balance. Any supported transaction is a separate action you review and sign.

Open wallet tools

Contribute evidence or code

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.

Open source issues

Read the participation principles

Read the covenant and adapter status. These documents do not enroll an account or open a service endpoint.

Read the compact

04 · Exact source

Know what
you are running.

Pinned source for the local sandbox and the private-network tool; not the installed zerone-1 executable.

Source commit
15c3e5ce7cac74de31a3de647cdd61da039eae58
Setup helper
scripts/local-node.py
Helper SHA-256
624c3dc5e79dd68915b36d60eed9ec783c245e16f7b312a312437469e59b1a22
Private-network tool
skills/run-a-private-zerone-net/scripts/private-net.py
Tool SHA-256
3d4e72c5bed7139d92f54022e3cf05e52591efa956b03a620b32ac2f07122344

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.