* feat(offline): persisted query cache + unreachable banner (web + mobile)
- Web: PersistQueryClientProvider on localStorage (24h maxAge); mobile:
AsyncStorage persister (7d). Both exclude high-churn keys (logs,
notifications, metrics) — stale tails are worse than none.
- networkMode 'offlineFirst' so cached data serves while the refetch
attempt fails.
- Web: ConnectivityBanner in PlatformShell pings public /health every
15s + listens to online/offline events — slim "last-known data" bar
so persisted state can't masquerade as live.
- Mobile: same banner in the tabs layout — /health ping plus
expo-network's local signal distinguishes "no connection" from
"instance down".
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* feat(mobile): cron jobs screen — schedules, run-now, execution history
- /service/cron lists the service's jobs with schedule, timezone,
last/next run, and last status; "Run now" triggers via the existing
POST /cron-jobs/:id/trigger and "History" expands recent executions
with status + output/error.
- Manage row on the service detail + Stack registration.
Verified live: created */5 job on a running service, triggered it —
execution recorded with status success and captured stdout.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---------
Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Phone app v1 (Phase I): PAT auth against any instance, secure-store
credentials, dark UI matching the design system.
- Overview: service status counts, per-project health dots, deploy feed
- Services/Projects: status badges, drill-down detail
- Service detail: start/stop/restart/redeploy/sleep/wake, env-doctor
issues, deployment history + rollback
- Logs: 300-line tail, 5s poll, stderr highlighted
- Databases: status, start/stop/restart, backup-now
- Settings: server info, disconnect
CI: mobile job (tsc + expo lint) gated on a dedicated app/mobile paths
filter so non-mobile PRs skip it entirely.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>