A host with a stable address

For a computer that other devices can reach at a fixed address: an IP address on your own network, a public IP address, or a name that resolves to it (with a forwarded port if it is behind a router). It takes one command and no domain, certificate authority or reverse proxy.

What you need

Step 1: install the host

curl -fsSL https://euboulia.app/install.sh | bash -s -- host \
  --tls-port 8443 --tls-bind 0.0.0.0 \
  --endpoint https://ADDRESS_OR_NAME:8443

Add --dry-run first to see what it would do. --tls-bind 0.0.0.0 matters: without it the TLS port listens on this computer only. The host makes its own self-signed certificate on first start and signs its fingerprint into its record, so a plain IP address works.

It ends by printing a pairing link, euboulia://pair?url=...&address=.... euboulia-host pairing-link prints it again at any time.

Step 2: make it reachable

Step 3: check it

curl -sk https://ADDRESS_OR_NAME:8443/health
curl -sk https://ADDRESS_OR_NAME:8443/.well-known/phronesis.json

The first prints ok. The second prints the host's signed record: its address, its endpoint and the fingerprint of its certificate (tlsCertSHA256). -k is expected: a browser or curl does not know this certificate, and the app does not ask a certificate authority either; it checks the fingerprint against the signed record.

Step 4: pair the app

Open the app (Settings, Connection): scan the pairing code or paste the link, then press Connect. The host says it does not know this device yet; choose Claim this host and type the claim code the installer printed (it is valid for 30 minutes and works once; euboulia-host claim prints a new one). That makes this device the host's administrator. Then choose a model. Other devices ask to join and you approve them in the app (Settings, Members).

If something is wrong

SymptomLook at
The installer says the port is in useChoose another with --tls-port and --port.
The app cannot reach the hostThe endpoint in the link must be reachable from the phone: same Wi-Fi for a local address, a forwarded port for the internet. euboulia-host status shows the service.
The app says the connection is not bound to the hostThe certificate it saw is not the one in the signed record: something between the app and the host is answering. Do not continue.
The app says the host proves a different addressThe link and the host do not match: a wrong or stale link. Print it again with euboulia-host pairing-link.