A seed node turns an ephemeral workspace into a durable community — full text history forever, media cached on your policy, and invites answered while every member is offline. Anything Raspberry-Pi-class works; the DHT handles NAT, so no port forwarding. It holds ciphertext only — durable, but blind.
You need Node.js 20 or newer and an internet connection. Everything below runs as an unprivileged user; only the systemd step touches root.
# need Node.js >= 20 node --version # clone and install production deps only git clone <repo> bearhole && cd bearhole npm ci --omit=dev
node bin/seed.js --join <inviteCode> \ --storage /var/lib/bearhole/seed \ --media-cache 90 --label main-seed # → up. community key: 8f3c…a91d # → waiting for a workspace writer to admit this seed… ✓ seed admitted · indexing · durable
sudo cp deploy/systemd/bearhole-seed.service /etc/systemd/system/ sudo systemctl enable --now bearhole-seed # status line every ~30s journalctl -u bearhole-seed -f # → community=Acme Den peers=4 members=12 messages=845 files=30/30 cached
Ready-to-use deploy/ examples: a Node Dockerfile (npm ci --omit=dev), a docker-compose.yml and a podman-compose.yml (seed + stats + update-seed + website with volumes), a Caddyfile/nginx.conf load-balancing the site, and systemd units. Secrets are always passed at runtime — never baked into an image.
# build the seed image podman build -t bearhole-seed \ -f deploy/Dockerfile . # first run — join once podman run -d --name seed \ --restart=always \ -v bearhole-seed:/data \ bearhole-seed --join <code>
# seed + stats + update-seed # + 3 website replicas + Caddy docker compose \ -f deploy/docker-compose.yml \ up -d # scale the web tier out # stateless: just add replicas
# add a 2nd seed for HA node bin/seed.js --join <code2> \ --storage /var/lib/seed-2 # failover is structural — # both are equal indexers, # no leader to elect
Coarse, anonymous, opt-in aggregates from bin/stats.js — the same byCountry counts, now with a flag next to each ISO code. No new data: the 2-letter country was already in each report; we only draw its flag.
Flags are Unicode regional-indicator emoji. They render as flags on macOS, Linux, iOS and Android; some platforms (notably Windows) show the 2-letter code instead — which is why the code is always printed alongside the flag.