Self-hosting Armada
Nothing to host
Section titled “Nothing to host”No server owns your community. It travels as ordinary Nostr events, sealed, over relays that cannot read them — so self-hosting Armada means the app and, if you want them, the pipes. Never the community itself.
Run it
Section titled “Run it”The client is a static site, and the repo ships a Dockerfile that builds it and
serves it with nginx.
git clone nostr://soapbox.pub/relay.ngit.dev/armadacd armadadocker build -t armada .docker run -p 8080:80 armadaThat address is a Nostr remote, so git clone needs
ngit
installed once. Put your own TLS in front of the container — microphones only
work in a secure context, so voice needs a real certificate anywhere but
localhost.
Configuration
Section titled “Configuration”Settings bake in at build time, as Docker build args.
| Build arg | What it does |
|---|---|
VITE_APP_NAME |
What the app calls itself. |
VITE_APP_RELAYS |
The relays a fresh user starts with. Editable in Settings. |
VITE_SEARCH_RELAYS |
Where search queries go. |
VITE_APP_BLOSSOM_SERVERS |
Default media upload servers. |
VITE_CONCORD_AV_SERVERS |
Voice token brokers. |
docker build \ --build-arg VITE_APP_NAME="Example Chat" \ --build-arg VITE_APP_RELAYS="wss://relay.example.com" \ -t example-chat .Branding
Section titled “Branding”- Logo —
public/logo.svg - Social card —
public/og.png - Colors —
builtinThemesinsrc/themes.ts
Three colors
Section titled “Three colors”A background, a text color and a primary. Every other token — surfaces, borders, muted text — is derived from those, so retinting is three values, not a stylesheet.
Relays
Section titled “Relays”You probably do not need your own. Any Nostr relay carries an Armada community, and nostr.watch lists hundreds run by people who have never heard of yours — spread across a few, one going down doesn’t take the community with it.
If you want one anyway, Soapbox runs ditto-relay: AGPL-3.0, written for Bun, storing events in OpenSearch.
The one piece that has to be a real server, because audio cannot travel the way messages do. It is stock LiveKit plus a small token broker that checks you hold the key to a channel and issues a ticket for one room — it never learns which community that is, and the audio is encrypted end to end anyway.
git clone nostr://chad@chadwick.site/relay.ngit.dev/armada-avcd armada-av/deploy/singlecp .env.example .envdocker compose up -dSet AV_DOMAIN to the name people actually reach, and a LiveKit key pair from
docker run --rm livekit/livekit-server generate-keys. Open 80, 443, UDP
7882 and TCP 7881. Then, in Armada: Settings → Voice → https://av.example.com.
The stock apps still work
Section titled “The stock apps still work”Nothing about a backend is compiled into the Android or desktop builds. Your users install the normal app, add your relay in Settings, and they are on your stack.
One catch: an invite link on your domain opens a browser rather than jumping
into the app, because the installed app only claims links on armada.buzz. It
costs your members one extra tap.
Build your own fleet
Section titled “Build your own fleet”A client on your domain, relays you administer, calls through your own box — or just the client, pointed at relays that already exist, for an afternoon of work and no database to babysit.
$ own the whole road