App setup
Install
Prelay is not on any app store, on purpose: the account's gatekeeping, signer
rotation, and policies don't apply. The app ships as a signed APK on the
Codeberg releases, each one with
a published SHA-256 checksum.
Three install routes, in the order most people should prefer:
- Obtainium (Android): add
codeberg.org/prelay/prelayand it tracks the release feed directly, so automatic updates land as they are published, no Play Store in the loop. - Direct download: grab the
APKfrom a release, verify the checksum against the release's SHASUM, install it. Every device gets exactly what the release says it does. - Build it yourself: the whole client is in this repository
(android/), single
Gradlemodule, and the signing rules are plain to follow. Nothing stops you from compiling and installing your own build against the same server protocol.
Obtainium is an open-source Android app that
installs and updates applications straight from a repository's release feed
(Codeberg, GitHub, GitLab, and others). You add the source URL, and it keeps
the app current without any store account. Codeberg is a supported source,
so codeberg.org/prelay/prelay is all it needs.
No gatekeeping: updates ship when they are ready, and what you install is
what you can audit. The AGPL source sits one click from the release, the
APK's SHA-256 is published in the release notes, and manual downloads verify
against it. Nothing on the device asks for store accounts or extra
permissions.
Pair with a server
Three fields pair the app: server URL, API token, and a device
name (e.g. Pixel 9 Pro). On pairing, the app calls
POST /v1/devices with its generated public key and its FCM token; the server
answers with the device record.
- Enter the server URL (self-hosted, or
https://api.prelay.shfor Cloud). - The app fetches
FCMconfiguration from the server at onboarding; there is no build-time google-services file. - Register a device. The private key is generated on the device and sealed by
the
Android Keystore; it never leaves it. - Create an API token with
device:managescope (see below); drop it into your senders.
The app's pairing token needs device:manage — it registers the device and
pulls the runtime FCM configuration with that same token. Sender tokens need
notify:send: the narrow scope a cron job or CI pipeline uses. Admin
overrides everything; use it for the initial pairing only.
Notes worth knowing
- One server per install. The app stores a single server URL; pointing it at a different relay (Cloud, or a new self-hosted server) is a re-pair, and the integration on the sender side never changes.
- Google Play services are required on the device:
FCMis the delivery transport, and it must only ever receive encrypted envelopes. The payload the transport carries is ciphertext; the plaintext exists only on your phone and your senders. - Revoking beats losing. If a device is lost or a token leaks, revoke from the dashboard or the CLI immediately; delivery stops for that key at once.