Every relay serves at least one profile. The first one is whatever you created during self-hosting.
Adding another
1. Log the new account in, once, out of band. On the relay machine:
HOME=/path/to/new/home claude loginThis step is deliberately manual and outside the app. There is no in-app login flow: the relay never holds a credential of its own, it inherits one that already exists on disk.
2. Create the profile. Either from the client — profile switcher → add profile, give it a label and that same path, then Check to confirm the login was picked up before creating — or from the command line, which is what that dialog calls behind the scenes:
~/.local/share/anywh/infra/systemd/add-profile.sh work \
--relay-host <address> --home /path/to/new/homeSee infra/systemd/README.md for the full set
of flags and how the systemd instance per profile works.
That is the whole of it. Profiles sync automatically: any other device already pointed at the same relay machine picks the new one up on its next sync — nothing to import, nothing to copy between devices.
Where it all lives
Everything stays on the relay machine:
| Path | What |
|---|---|
~/.config/anywh/profiles.json | The registry: ids, labels and colours |
~/.config/anywh/env/<profile>.env | Per-profile settings — RELAY_HOST, RELAY_PORT, RELAY_HOME_OVERRIDE, and the rest of Configuration. The address a profile advertises lives here, not in the registry. |
~/.config/anywh/themes/*.json | Custom themes, host-wide — see Themes |
Creating or syncing a profile never sends anything to a third party. Each
profile runs as its own systemd instance (anywh-relay@<profile>) on its
own port, so one profile restarting or crashing leaves the others alone.