Quickstart

You need Rust/Cargo 1.94+, Node 22+, and Bun. Commands below start at the repository root. Verse is testnet software with a permissioned mint and verifier set. Do not use real money or irreplaceable data.

Start the local development mesh

This page describes the current checkpoint/reputation-ranking development checkout. From its repository root:

bun run dev

This builds locked Rust and web artifacts, starts one compute node and two stores in the foreground, and deploys Search, Journal, and Reverse. Visit http://127.0.0.1:8080/apps. State is isolated in .verse/dev, while normal ~/.verse remains untouched. Ctrl-C stops owned nodes. This is a local public-key demo only, with no real money, private-data, or production claim. Use --state-dir, --base-port, --http-port, --no-build, or --json as needed.

In Search, open journal, type a draft and select Connect & load. Deny first to check that nothing is written. Connect again and approve, then publish two entries. Reload and reconnect to read them back. The same approved scope does not prompt again. In reverse, run hello and expect olleh. Its details show the gateway’s replay report, not an independently client-verified receipt.

After editing apps/journal or apps/reverse, use a second terminal:

bun run dev:deploy

Reload the app to see the update at the same address. For custom state, pass --state-dir PATH to both root commands. Use a new state directory for a fresh demo rather than deleting existing identities or data.

Build and use an app

In another terminal, from the repository root:

export PATH="$PWD/verse-node/target/debug:$PATH"
verse init app hello
verse deploy ./hello --registry 127.0.0.1:9000
verse ls --identity hello --registry 127.0.0.1:9000

Enter the complete @public-key/hello from deploy output in the local /apps address bar. Type a note and select Sign & publish. Deny leaves the app unconnected. Connect grants storage and the listed publishing scopes using a per-app identity. The app never receives your recovery phrase. Notes are public, not encrypted private storage.

Edit hello/index.html and deploy again to update the same address, then reload. Keep the developer identity at ~/.verse/id/hello.txt private and backed up. It is separate from the end user’s browser identity.

Verify compute

With the mesh running, from the repository root:

verse capsule test examples/increment.wat --input hello --expect-output ifmmp
verse run examples/increment.wat --input 68656c6c6f --verify
verse doctor

Expect output: ifmmp and VERIFIED: a provider ran the capsule and a separate verifier reproduced the result. Capsules have no network, clock, filesystem, or randomness.

Connect your own node

Get the registry’s full public key and reachable UDP address from its operator. Use a saved private identity, not a guessable seed:

verse id new my-node
verse whoami --identity my-node
verse ping --addr 'REGISTRY_PUBLIC_KEY@registry.example.org:9000'
verse serve --role provider --identity my-node --port 9103 \
  --registry 'REGISTRY_PUBLIC_KEY@registry.example.org:9000' \
  --advertise 'your-reachable-host.example.org:9103' --honest true

Replace the example values. Node traffic uses UDP/QUIC. Open/forward your advertised UDP port. Direct connections have no relay fallback, so a private address cannot be reached from the Internet. Reuse the same identity on restart.

Run the workflow tests

(cd web && bunx playwright install chromium)
bun run check
bun run test
bun run test:e2e

The suite uses separate native nodes and a real browser with isolated test keys. It checks hosting, verified compute, deploy/update, consent, signed writes, and cleanup without accessing the public service.

Full commands, persistence limits, custom ports, and troubleshooting: repository quickstart. App SDK and backend routes: developer guide.