v0.11.0 — branded notification emails that link back into the dashboard
Highlights
- Notification emails are branded, and they link back into the dashboard. Every message
now ships asmultipart/alternative: a text-only client sees exactly the wording it saw
before, and an HTML client sees a laid-out message carrying the event plus a link straight
to the page that explains it — a provider alert opens Providers, a budget alert opens
Limits, a spend summary opens Costs. Invite and password-reset emails share the same
layout. - That layout is deliberately asset-free. A text wordmark; no images, no web fonts,
nothing hosted anywhere else. A self-hosted instance that isn't publicly reachable renders
the mail identically to one that is, and opening it triggers no remote fetches — which
also means no tracking pixel, by construction rather than by promise. - Chat channels carry severity. An Apprise target now receives a per-event severity, so
a provider-down or budget-block notification is visually distinct from an informational
summary instead of arriving as undifferentiated text, with the page link on its own line. - Dashboard pages are addressable by URL. Each page has a
#/<page>fragment, so pages
are bookmarkable, the browser's Back and Forward buttons move along the page axis, and a
link from outside the product can open a specific page. An unrecognized fragment falls
back to the default page as before. Authorization is now enforced on the route itself:
the admin-only Users area cannot be reached by URL as a non-admin — the requested page is
held until the session resolves, then admitted only if permitted. The accept-invite link
flow is untouched; its token fragment is never parsed as a page nor written to history. - Auto performance names the agent whose L1 signal has gone flat. When a stable agent's
structural score collapses to a near-constant — one two-decimal score bucket covering
≥ 50% of its ambiguous-band requests — the Routing page now names the agent, its modal
score, and the share, with guidance that fits the instance: pin the agent to a tier, or
enable and configure L2 · Semantic, the layer that evaluates exactly that ambiguous slice. - Insufficient evidence never reads as healthy. Below a 50-request floor no verdict is
rendered at all, and a neutral coverage line discloses how many agents went unassessed —
so a quiet instance looks unassessed rather than fine.GET /api/analytics/autogains a
per-agentsignalQualityblock. This is read-time aggregation only: no routing behaviour,
hot-path, or schema change.
Upgrade notes
- No migrations and no schema change — a drop-in upgrade from 0.10.0.
APP_URLnow also gates the links in notification emails. The variable is not new and
its auth behaviour is unchanged, but it now decides whether a notification carries a link
back to the dashboard. Set it to the address your users actually reach the dashboard at,
then restart. On the default (http://localhost:3001), or on any loopback value, links
are omitted deliberately rather than sending a127.0.0.1URL that would be dead in a
recipient's inbox — or worse, on a phone, resolve to the phone. A LAN or.localaddress
works and is often the right one for a self-hosted instance. The value is read at boot, so
a restart is required after changing it.- Nothing to do for the other two. URL-addressable pages and the Auto-performance signal
card need no configuration and change no stored data.
Full package changelogs live in packages/*/CHANGELOG.md.