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:

  1. Obtainium (Android): add codeberg.org/prelay/prelay and it tracks the release feed directly, so automatic updates land as they are published, no Play Store in the loop.
  2. Direct download: grab the APK from a release, verify the checksum against the release's SHASUM, install it. Every device gets exactly what the release says it does.
  3. Build it yourself: the whole client is in this repository (android/), single Gradle module, and the signing rules are plain to follow. Nothing stops you from compiling and installing your own build against the same server protocol.
What is Obtainium

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.

Why no store

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.

  1. Enter the server URL (self-hosted, or https://api.prelay.sh for Cloud).
  2. The app fetches FCM configuration from the server at onboarding; there is no build-time google-services file.
  3. Register a device. The private key is generated on the device and sealed by the Android Keystore; it never leaves it.
  4. Create an API token with device:manage scope (see below); drop it into your senders.
Token scopes differ by actor

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: FCM is 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.

On this page