0035. Every object has one link, <d>/go/…, which opens the best surface for the reader
Status: accepted, 2026-10-21
Context
A link to an object differs by surface: each panel's URLs on its own host, notify's event pages, the hub's
routes, native screens, the Telegram Mini App. A notification can't know where it will be opened: one event
goes to Telegram, e-mail, a webhook and a phone, and a link copied from a desktop panel gets opened on a phone.
Panel URLs also change as panels change, and links written into events by hand go stale.
Decision
- One link per object:
https://<d>/go/<service>/<kind>/<id>[/<view>], with ?ev=<seq> for the inbox
item it came from and #act=<action> to open an action's confirmation. Kinds are the contracts' resource
kinds; views are a short fixed list per kind.
- home resolves it for the reader: phones go to the hub's screen, other browsers to the owning panel's
page from the link table each service publishes in its contract (
x-xvii-links), and ?to= forces either;
the native apps route the same paths. home never redirects outside the hosts of installed services, and a
link never carries a credential or runs anything by itself.
- Events with a resource get their
/go link from kit; Telegram, e-mail and webhooks use it. Where the
surface is already known (the hub's own pushes and screens, the Mini App's buttons), links go straight to it
with the same grammar.
Consequences
- Each service keeps a link table next to its operations; when a panel's route changes, the table changes,
and old notifications still open the right page.
- The hub and the native apps share one route grammar, kept as a fixture in kit, and Android can hand
/go
links to an installed app.
- Design:
superpowers/specs/2026-10-21-phone-hub-design.md in this repository.