Operate

Notifications

Omnesis keeps notification text on your gateway. Apple's and Google's push services, and the hosted relay, carry only a content-free wake; the phone then fetches the notification from the gateway itself. This page lists what sends a notification, explains that privacy boundary, and covers delivery setup and repair for operators. With the official iOS app, installed through TestFlight, there is nothing to set up beyond approving notifications on the phone. If you built and signed the app yourself, see Configure direct delivery.

What sends a notification

Notifications go to your paired phones. Each one is about something waiting for you on the gateway:

Notification Sent when
Answer ready / Answer failed A question you asked by voice took longer than its foreground wait and has finished
New reply in a conversation The agent wrote into a conversation you were not looking at
Privacy review needed An answer for an external agent is held for your approval under its privacy policy (see Privacy policy)
Access request waiting An AI agent asked to connect and needs approval with the displayed code
Re-auth needed A source's sign-in lapsed on one of your devices and needs you to sign in again
Permission reminder A phone-only source lost a permission, or its phone stopped reporting
Test You ran omnesis push test

The two kinds of reminder repeat until the problem is fixed. Re-auth needed is sent once per account per device when its sign-in lapses, then again after 1 day, 2 days, 4 days and 7 days, and weekly after that, until that device signs in again; tune the schedule with gateway.reauthReminders (initialDelay, multiplier, maxDelay).

A permission reminder names the source, the affected phone and how to fix it. If the phone simply stops reporting, the reminder says Source check overdue instead, because silence does not prove a permission was revoked; for a source several phones contribute to, that happens only when all of them are quiet.

Permission reminders repeat after 1 day and then at doubling intervals capped at a week, until the source recovers; overdue reminders stop after four. The schedule is gateway.mobilePermissionReminders. Turning the source off, removing it, or revoking the phone clears the reminder. Any of your phones can show it, but only the affected phone opens the repair controls; another phone names the device where Omnesis must be opened.

The privacy boundary

A carrier wake contains a generic Omnesis placeholder and no notification kind, title, body, document identifier, conversation identifier, or collapse key. All wakes for a platform have the same carrier-visible shape. If the phone cannot reach the gateway, iOS leaves the generic placeholder; Android can show a fixed local connection notice. Neither reveals why the notification was sent.

Wakes arrive wherever the phone is, but the notification text still requires the phone to reach its paired gateway. Nothing carries the text off your network. If the phone was paired to a LAN address, set up remote access and pair it again using an address it can reach away from home.

Delivery flow

  1. EventSomething on the gateway needs your attention
  2. Gateway queueStores the notification text, one entry per phone
  3. Content-free wakeThrough APNs, FCM, the hosted relay, or a live connection
  4. Phone fetchesOver its paired HTTPS connection
  5. BannerShown on the phone, then confirmed to the gateway
The notification text stays in the gateway's queue; only a content-free wake crosses the push service, and the phone fetches the text itself.

Each phone can fetch only its own notifications. A notification is marked delivered only after the phone has shown it, so a dropped connection loses nothing. A newer notification about the same thing replaces an older one that has not been shown yet. When the app has a live connection to the gateway, the wake travels over it instead of the push service.

Failed wakes are retried with growing delays — from 5 seconds, doubling up to 5 minutes — for about an hour. Undelivered notifications expire after a week, and the phone fetches any still waiting the next time the app opens or reconnects, wake or no wake. omnesis push status shows attempts and the last outcome.

Choose a notification transport

The correct transport depends on who signed the app. Every choice keeps notification content on your gateway; only the fixed, content-free wake crosses APNs, FCM, or the hosted relay.

App build Transport What you configure
Official iOS build (TestFlight) Hosted push.omnesis.app relay Approve relay notifications on that phone
Official Android build (Google Play) Hosted push.omnesis.app relay Approve relay notifications on that phone
Self-built iOS app under your own App ID Direct APNs delivery Your own APNs credentials for your app identity
Self-built Android app Direct FCM delivery Your own Firebase project and service-account credentials

What counts is the app identity, not how the app was installed. An app built from source with the official iOS identity and signed by a team authorized for it can use the relay, provided its APNs environment matches. A contributor using an unrelated Apple team needs their own app identity and uses direct APNs delivery.

Allow the hosted relay for an official app

Your own APNs or FCM credentials cannot cover an official build, because they belong to a different app identity. When the paired phone needs the hosted relay, it explains the boundary and asks you to allow relay notifications for that phone. Nothing is enabled for another phone, and no push token leaves the phone before its gateway records that approval.

During enrollment, the relay receives the phone platform, its device push token, the public Omnesis app identifier and, on iOS, the APNs environment. The phone makes that request itself, so the relay also sees the phone's network address at enrollment. Afterward, the gateway sends the relay an authenticated request with an empty body so APNs or FCM can deliver the fixed wake. The relay never receives notification text, the gateway address, an Omnesis account, or which notification fired.

Review each phone's transport under Settings → Devices in the portal. Withdrawing relay access there stops relay delivery immediately and leaves every other phone unchanged. The affected phone may ask for approval again later.

The default endpoint is https://push.omnesis.app. Operators of a compatible relay can select another HTTPS origin with omnesis config set /gateway/pushRelay/url https://push.example.com. A self-built app whose identity is not supported by that relay should use direct delivery.

What the hosted relay is, and is not

The relay is a dependency of the official apps. A background wake for one of them, while the app holds no live connection to the gateway and no direct credential covers it, goes through the relay. It is run by the Omnesis maintainer. The gateway sends it wakes for exactly the two official app identities, the iOS app and the Android app on Google Play, and never for any other. Pointing the gateway at another relay URL changes where wakes go, never which apps the gateway will wake; phones registered against the previous URL register again the next time the app opens.

Beyond the enrollment data above, what the relay learns is what any server learns from a connection. Payload minimization keeps the content, the notification kind and the gateway's address out of every request. It does not hide that a wake happened, when it happened, or the network address the gateway's request came from; the relay's hosting and network providers see those as they see any request. A gateway on a private network reaches the relay through whatever address that network presents to the Internet.

No availability, latency or support commitment is published for the relay. If it cannot be reached, the gateway retries the wake for about an hour, then stops trying; the notification itself waits on the gateway for a week and reaches the phone when the app next opens. The independent option is direct delivery with your own APNs or FCM credentials for an app you sign yourself, which depends on Apple's and Google's services instead of the relay.

Configure direct delivery for self-built apps

A self-built iOS app under your own App ID needs Apple Developer Program membership, an App ID under its signing team, Push Notifications enabled, and a matching provisioning profile. The gateway needs an APNs .p8 authentication key, its Key ID and Team ID, and the actual bundle identifier of the installed app. Android direct delivery uses a Firebase service account whose project id matches the build. The gateway selects credentials for the app identity each phone reports; a credential for another build is not used.

For iOS, have two distinct Apple keys ready: the APNs auth key used for delivery and an App Store Connect API key allowed to manage Certificates, Identifiers & Profiles. The wizard also asks for the management key's Key ID and issuer ID. It looks up the exact bundle id, verifies that its App ID carries Push Notifications, and enables the capability when missing. The management key is used for setup, not for every push. If the capability changes, refresh the provisioning profile and rebuild the app. Choose sandbox for a normal Xcode development build and production for distribution; the gateway setting must match the signed app's provisioning environment.

For Android, have the Firebase service-account file plus the Android package id and the four client values from the Firebase app configuration: application id, API key, project id, and sender id. The wizard writes the client values to local.push.properties in the Android project directory you give it (android/ from the repository root), on the machine running the CLI. That owner-only file is gitignored and Gradle reads it automatically, including the chosen package id. Rebuild the app after setup; the installed app's package id and Firebase registration must match the package id entered in the wizard. No shell exports or committed google-services.json are needed.

❯ omnesis push setup

# choose iOS or Android, then follow the credential prompts

❯ omnesis push status

# send a test through the normal queue and wake path to every phone

❯ omnesis push test

# or to one phone only

❯ omnesis push test --device <name-or-id>

Tapping the test notification opens the app. When an all-phone test reaches some phones but not others, the command reports partial success and exits non-zero so scripts do not mistake it for complete delivery.

The APNs .p8 or Firebase service-account path you enter in the CLI is sent to the gateway, which reads the file on its own host and imports it into its configuration directory with owner-only permissions. A file on a laptop running the CLI is not uploaded, so for a remote or containerized gateway, first place the key at a path the gateway process can read. The App Store Connect key is read by the CLI itself and never sent to the gateway. Setup updates gateway.apns or gateway.fcm and switches to the new credential without restarting the gateway.

Open the app on each phone afterward so it picks up the new delivery path and registers its push token; there is no token to copy by hand. If notifications are off on the phone, turn them on from the app's setup flow or its Settings; the app does not prompt on its own. A notification that arrives while the app is open proves only the live connection, not background APNs or FCM delivery.

Status and repair

❯ omnesis push status

❯ omnesis doctor

Status shows credential metadata without secret contents and counts phones by their transport. A phone without a usable transport is reported with the one thing that is missing; both omnesis push status and omnesis doctor name it. The push status lines read:

The apps also report whether they can show notifications, without any notification content, so status and doctor tell a missing transport apart from notification permission being undecided or denied, alerts being disabled, or iOS Scheduled Summary batching Omnesis notifications. The gateway queues no notification for a phone whose permission is undecided or denied, or whose alerts are disabled. Scheduled Summary still receives notifications but may delay the banner.

A phone that has not reported its state still receives ordinary notifications but not permission reminders; open the app once so it reports. If a pairing belongs to a phone you no longer use, remove it with omnesis devices revoke <device-id>.

On the phone, the iOS app shows the gateway's selected delivery path in Settings → Notifications. If its app identity has no matching direct credential, it shows that identifier and links to setup; this is a configuration warning, not a background-delivery test. The Android app shows missing Firebase build values or an uncovered package id in its app-wide warning and explains the problem in Settings → Notifications. Build values require a rebuild; gateway credentials can be configured with omnesis push setup and rechecked with Retry. A notification-permission warning opens Android notification settings; returning to Omnesis rechecks delivery and shows any notification that was held while alerts were disabled.