Mobile app

Mobile push notifications

The mobile app supports OS-level push notifications — new message, new task, urgent escalation — wired through the standard browser Push API.

Subscribing

The first time the operator opens the mobile app after gh#562 ships, the app prompts for notification permission. Grant → the subscription token is saved server-side against the operator's user row.

To re-prompt later: Settings → Notifications → Mobile push → tap Enable.

What fires a push

  • New guest message on a thread you're routing to (gh#562).
  • Task assigned to you.
  • Critical escalation (e.g. Send Check-in BLOCKED for a check-in today).

The set of triggers is configurable per-template in the Task Templates editor — same surface as in-app + WA notifications.

Deep-linking (gh#583)

Tapping a push notification opens the app to the right entity:

  • New message → opens the thread.
  • Task assigned → opens the task drawer.
  • Critical escalation → opens the affected reservation.

Earlier the push tapped opened the app home (/m/pulse) regardless of payload — gh#583 fixed it. Push payloads now carry entity routes (/m/inbox/thread/<id>, /m/tasks/<id>) that the service worker honours.

Badge counts (gh#561)

The bottom tab bar carries badges:

  • Inbox — count of unread / unanswered threads. Visible from any tab (gh#561 — earlier the badge only updated when on Pulse tab).
  • Pulse — count of overdue auto-resolves blocked by failed conditions.

On iOS PWA install, the app-icon badge mirrors the Inbox count (gh#561 fixed the iOS app-icon badge that was never set).

Resolving tasks on mobile (gh#584)

Earlier the mobile task list was read-only — operator could see tasks but not resolve them. gh#584 closes the gap: tap a task → see action buttons (Send now / Mark done / Snooze / Reassign) inline; tap to act. Full parity with desktop.

Reply with template on mobile (gh#579)

The mobile Inbox composer earlier only had AI Suggest + free composer; the reply-with-template dropdown from desktop was missing. gh#579 ports it — the composer shows the same template picker as desktop.

Calendar / occupancy view on mobile (gh#578)

The mobile Pulse tab earlier showed Auto-resolves + Unanswered + Per-property panel, but the calendar / occupancy view (data was fetched but not rendered). gh#578 ships the mobile calendar — the same swipe-strip from pulse-mobile.md.

Phone-on-/v28 redirect to /m (gh#558)

When a phone-sized viewport loads /v28/..., the app now redirects to the equivalent /m/... route instead of showing the desktop chrome cramped onto a phone. Earlier the operator was stranded on the desktop surface with no link to mobile.

PWA mount crash fix (gh#553)

The mobile PWA mount earlier crashed with a TypeError on /m/pulse (a threadsQ.data cast lie latent since gh#106). gh#553 fixed it — the mount is stable.


Implements: gh#562 (push end-to-end), gh#583 (deep-link to entity routes), gh#561 (badge counts), gh#584 (resolve tasks on mobile), gh#579 (mobile reply-with-template), gh#578 (mobile calendar), gh#558 (phone viewport redirect to /m), gh#553 (PWA mount crash fix). Related: gh#552 (in-app notifications — sibling channel), gh#112 (mobile-native capability hooks).

Source: the FlatsBratislava operator manual.