Running a Node

Help decentralize the Tribe network by hosting your own Hub and Ephemeral Rollup sequencer. The Homebrew formula installs Docker, Postgres, the hub, and the ER server, then auto-generates a unique hub ID on first start.

System Requirements

Home node

2 vCPU, 4 GB RAM, 20 GB SSD. Fine on a Raspberry Pi 5 or Mac mini.

Seed node (public)

4 vCPU, 8 GB RAM, 100 GB SSD on a VPS with a public IP. Hub-only — no ER.

Install (macOS)

# Tap and install the hub + ER stack
brew tap chaalpritam/tribe
brew install --HEAD tribe

# Boot the stack (hub-db, er-db, hub, er-server)
tribe start

# Auto-connect to the seed node (one-time)
tribe seed set ws://<seed-ip>:4000/gossip
tribe start

# Optional: install the demo UI (separate formula)
brew install --HEAD tribe-twitter-app
tribe-twitter-app link http://localhost:4000
tribe-twitter-app

The frontend used to bundle with tribe on port 3002. It now ships as its own formula — brew install tribe-twitter-app — so the core node has no Node.js dev-server in the loop.

Joining the Mesh

Hubs gossip pull-based over WebSocket. Seed nodes live on public IPs; home nodes connect outbound — no inbound ports required.

  1. tribe seed set ws://<seed-ip>:4000/gossip — point at a known seed.
  2. Run tribe start — the hub dials out, exchanges hello → have → want → messages, and starts catching up.
  3. tribe peer add <ws-url> adds extra peers on demand; tribe peers lists what's connected.
  4. tribe sync shows coverage (local / peer total); tribe sync --peer all forces a hard 30-day catch-up.

CLI Reference

tribe startBoot Docker services, wait for health, auto-connect to seed.
tribe stopStop all Docker services.
tribe statusShow which services are running.
tribe logs [svc]Tail logs for hub, er-server, hub-db, or er-db.
tribe doctorCheck prereqs (Docker, Colima, Solana, pnpm) and auto-generate a wallet.
tribe peersList currently connected gossip peers.
tribe peer add <url>POST a peer WebSocket URL to /v1/peers.
tribe syncCoverage table (local / peer total) and last-sync per peer.
tribe sync --peer <id|all>Force a hard catch-up via /v1/sync/trigger.
tribe seed set <url>Persist seed-node WebSocket URL in ~/.tribe/seed.
tribe hub-id [show|set|reset]Show, set, or reset this hub's gossip identifier.
tribe networkPrint local, LAN, and seed-node URLs.
tribe shareCopy-paste hub/ER URLs plus a reachability check for other devices on Wi-Fi.
tribe backupSnapshot hub-db + er-db to a tarball.
tribe restore <file>Restore a previous backup.
tribe resetWipe local data and start over.

Persistent State (~/.tribe/)

~/.tribe/server-wallet.jsonER sequencer Solana keypair. Survives reinstalls; restored automatically.
~/.tribe/hub-idThis hub's unique gossip identifier. Auto-generated on first start so two laptops don't collide.
~/.tribe/seedSeed-node WebSocket URL. One line, e.g. ws://1.2.3.4:4000/gossip.
~/.tribe/tribe-twitter-app.envNEXT_PUBLIC_HUB_URL + NEXT_PUBLIC_ER_SERVER_URL for the tribe-twitter-app demo UI.

Running a Seed Node

Seed nodes are hub-only (no ER) and live on a public IP so home nodes can dial them outbound. Use the compose file in deploy/seed/docker-compose.seed.yml.

# On a VPS with a public IP
git clone https://github.com/chaalpritam/TribeEco
cd TribeEco
bash deploy/seed/setup-seed.sh
# Hub listens on :4000 — share ws://<ip>:4000/gossip with peers

Security Best Practices

  • Keep ~/.tribe/server-wallet.json funded with a small amount of devnet/mainnet SOL so the ER can settle batches.
  • Home nodes only need outbound network — keep ports 4000 (hub) and 3003 (ER) firewalled unless you want public peering.
  • Use a dedicated SSD for Postgres (hub-db on :5436, er-db on :5435) — gossip throughput is I/O bound.
  • Back up ~/.tribe/ before reinstalling — your wallet and hub identity live there.
← Hub API
Documentation Complete