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
2 vCPU, 4 GB RAM, 20 GB SSD. Fine on a Raspberry Pi 5 or Mac mini.
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.
tribe seed set ws://<seed-ip>:4000/gossip— point at a known seed.- Run
tribe start— the hub dials out, exchanges hello → have → want → messages, and starts catching up. tribe peer add <ws-url>adds extra peers on demand;tribe peerslists what's connected.tribe syncshows coverage(local / peer total);tribe sync --peer allforces 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.jsonfunded 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.