Run your own server
Host Rondo on a server of your own, with Docker Compose.
Rondo's servers are open source, and the images that run rondo.matthewsource.com run on a server of yours. One Compose file starts all of it on one port, and the reverse proxy you choose serves that over HTTPS.
What you need
- A Linux server on x86-64 with Docker and Docker Compose. The images aren't built for ARM yet.
- A hostname whose DNS points at the server, and a reverse proxy that serves it over HTTPS: Caddy, nginx, Traefik or a Cloudflare Tunnel.
- An SMTP login to send sign-in codes from. Any mail provider's works.
Start it
Get the Compose file and its settings, from the latest release:
mkdir rondo && cd rondo
curl -fL -O https://raw.githubusercontent.com/sourcelocation/Rondo/v0.1.9/server/compose.yaml
curl -fL -o .env https://raw.githubusercontent.com/sourcelocation/Rondo/v0.1.9/server/.env.exampleThe settings run Rondo on your own computer as they are. Change every one marked "Self-hosting":
RONDO_PUBLIC_URLtohttps://<your hostname>,RONDO_HOSTto the hostname, andCOMPOSE_PROFILEStoapp, so Rondo's own servers start.RONDO_VERSIONto nothing, so the images matchcompose.yaml's release. RemoveRONDO_HOOKS_URL, and setORY_DEVto nothing.- The five secrets: make each with
openssl rand -hex 32, exceptKRATOS_CIPHER_SECRET, which must be 32 characters:openssl rand -hex 16. - Your SMTP login (uncomment those lines), and your own email address in
RONDO_OWNER_EMAIL. - Remove
RONDO_STAFF_PASSKEYand the development Web Push keys.
Start it:
docker compose up -d --waitRondo now answers on http://localhost:23900, on the server only.
Point your reverse proxy at it. With Caddy on the server, which gets the certificate on its own:
<your hostname> {
reverse_proxy localhost:23900
}With another proxy, send every path on the hostname to localhost:23900, with its Host and X-Forwarded-* headers.
Open your hostname and sign in with the address in RONDO_OWNER_EMAIL. That account owns the server.
What runs
| Service | What it does | Path |
|---|---|---|
web | The web app, and routing each other path to its service | /app |
api | The Go server: accounts, sharing, Discover, media, mail | /api, /media, /blobs |
sync | The sync server, and the MCP server for AI assistants | /sync, /mcp |
kratos | Ory Kratos: sign-in | /auth |
hydra | Ory Hydra: AI assistants' OAuth | /oauth2, /userinfo and OAuth discovery |
postgres | One PostgreSQL, with a database each for Rondo, Kratos and Hydra |
Pictures and sounds are kept in the media volume. Share links lead into the web app, and /docs leads to these docs.
Using it
- The web app at
https://<your hostname>/app/works in any modern browser, offline too. - The iPhone, iPad, Mac and Android apps sync with
rondo.matthewsource.comuntil you choose otherwise: while signed out, enterhttps://<your hostname>under Settings › General › Sync › Server, then sign in. - Sign-in is by email code or passkey. Google and Apple sign-in aren't set up.
- AI assistants connect to
https://<your hostname>/mcp, as described in AI assistants. Forrondo-mcp, setRONDO_URL=https://<your hostname>.
Pro on your server
No billing is set up, so nobody has Pro until you give it. As the owner, open the web app's staff tools at /app/staff/promo, make promo codes, and redeem them. Staff tools ask you to add a passkey first.
To change how much each plan may store, set RONDO_FREE_MEDIA_MB and RONDO_PRO_MEDIA_MB (200 and 10000 by default).
More settings
The Go server reads .env as well, so its other settings go there too:
- S3-compatible storage in place of the
mediavolume:RONDO_S3_ENDPOINT,RONDO_S3_BUCKET,RONDO_S3_ACCESS_KEY,RONDO_S3_SECRET_KEYand, if your provider needs it,RONDO_S3_REGION. - Reminders in browsers (Web Push):
RONDO_VAPID_PUBLIC_KEYandRONDO_VAPID_PRIVATE_KEY, whichnpx web-push generate-vapid-keysmakes, andRONDO_VAPID_SUBJECT, amailto:address of yours.
After changing .env
Run docker compose up -d --force-recreate. Kratos's and Hydra's settings are written from .env, and
Compose doesn't notice when they change.
Upgrade
Back up first, download the new release's compose.yaml over the old one (as in Start it), and run docker compose up -d --wait. The database is migrated before the servers start. Keep your .env.
From the tls profile
Compose used to serve HTTPS itself, with the tls profile. It's gone: put a reverse proxy in front of port 23900 (above),
change COMPOSE_PROFILES from tls to app, and remove the rondo_edge volume once Rondo answers.
From server/self-host
Rondo used to run from server/self-host, on PostgreSQL 16. Back up there (below) and stop it, move your .env to
server/ and change it as above. Start only the database, docker compose up -d postgres, restore into it with
docker compose exec -T postgres psql -U rondo -d postgres < rondo.sql (the errors about what already exists are
expected), copy the media volume across, and start the rest.
Back up
The database, with Kratos's and Hydra's:
docker compose exec -T postgres pg_dumpall -U rondo > rondo.sqland the media volume, rondo_media, unless you use S3.
Changing Rondo
Rondo is under the AGPL-3.0: if you change it and let others use it, offer them your changes. A changed Rondo needs a name and logo of its own.