Context
The dashboard is already carefully mobile-responsive (dedicated @media (max-width: 600px) and pointer: coarse styles landed in the mobile-friendly PR) and is served over the Cloudflare tunnel at a stable HTTPS origin — but it's a plain browser page. ntfy alerts land on the phone with a Click header only for PR-created alerts (set in notify() opts), and even that opens GitHub, not the hub.
Problem
- The phone flow is: notification → open browser → find the agents tab (or retype the URL) → basic-auth prompt occasionally re-appears → scroll to the session. Each alert type knows exactly which session it's about, but none of them link back to the hub.
- No home-screen presence: as a non-PWA, there's no installed icon, no standalone window, and iOS/Android treat it as just another tab.
Proposal
- PWA basics: a
manifest.json (name, icons, display: standalone, theme colors matching the existing light/dark palette) + the meta tags, served from agent-hub/public/. A service worker is not required for install banners on Android anymore and can be skipped initially — the app is useless offline anyway, and skipping it avoids cache-invalidation complexity on a single-file UI.
- Deep links: support
/#session=<id> (and /#host=<key>) in index.html — on load, scroll to and highlight that card, auto-opening its repo <details>. With the terminal overlay, /#attach=<id> could go straight to the terminal.
- Click-through on every alert: set the ntfy
Click header on question/turn-finished/error alerts to https://<hub>/#session=<id> (the hub knows its public URL via a PUBLIC_URL env; HUB_URL on the agent side already carries it, but the hub itself never learns it today).
- Notification-with-actions (answer a question from the notification) is tracked in the answer-from-dashboard issue; this issue is just presence + navigation.
Touchpoints
agent-hub/public/ — manifest.json, icons, hash-navigation in index.html
agent-hub/server.js — serve manifest/icons, PUBLIC_URL env, Click headers in heartbeatAlerts()
Context
The dashboard is already carefully mobile-responsive (dedicated
@media (max-width: 600px)andpointer: coarsestyles landed in the mobile-friendly PR) and is served over the Cloudflare tunnel at a stable HTTPS origin — but it's a plain browser page. ntfy alerts land on the phone with aClickheader only for PR-created alerts (set innotify()opts), and even that opens GitHub, not the hub.Problem
Proposal
manifest.json(name, icons,display: standalone, theme colors matching the existing light/dark palette) + the meta tags, served fromagent-hub/public/. A service worker is not required for install banners on Android anymore and can be skipped initially — the app is useless offline anyway, and skipping it avoids cache-invalidation complexity on a single-file UI./#session=<id>(and/#host=<key>) inindex.html— on load, scroll to and highlight that card, auto-opening its repo<details>. With the terminal overlay,/#attach=<id>could go straight to the terminal.Clickheader on question/turn-finished/error alerts tohttps://<hub>/#session=<id>(the hub knows its public URL via aPUBLIC_URLenv;HUB_URLon the agent side already carries it, but the hub itself never learns it today).Touchpoints
agent-hub/public/—manifest.json, icons, hash-navigation inindex.htmlagent-hub/server.js— serve manifest/icons,PUBLIC_URLenv,Clickheaders inheartbeatAlerts()