Skip to content

Self-hosting Armada

The app is the part you host. Everything under it is public infrastructure — some of which you might run too.

The client is a static site: a Dockerfile, an nginx container, your own domain and TLS in front of it. Nothing else on this page is required to reach that — a client on your domain, pointed at relays that already exist, is a complete self-hosted Armada and has no database to babysit.

It is also the only piece where hosting it yourself changes what your users get: your name, your colors, your defaults, and a build nobody else can push to.

Underneath the client are three kinds of server, and Armada treats every one of them as a URL rather than as a home. They are all defaults, all editable in Settings, and all plural.

Relays

Carry the events. Armada ships with a couple and there are hundreds more, run by people who have never heard of your community.

Media servers

Hold attachments as content-addressed blobs. In a Concord community they are encrypted before upload, so the server stores ciphertext it cannot open.

Voice brokers

Issue a ticket for one LiveKit room. The broker never learns which community it belongs to, and the audio is end-to-end encrypted anyway.

Which means a member can change any of them and still be in the same community — and, symmetrically, that running one of them yourself buys you no authority over anybody. That is the trade: infrastructure you can leave is infrastructure that cannot hold you.

So the interesting reason to run a relay, a media server or a voice broker is not your own community. It is that these are the commons Nostr actually runs on, and they are maintained by a few hundred people worldwide. A relay you stand up carries other people’s events. A Blossom server you stand up holds other people’s pictures. Neither asks who sent them.

Start with the client on your domain. Add a relay when you want the network to be one relay stronger, not when your community needs it — it doesn’t.

$ carry someone else's traffic