You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Deliver a production-quality React and Mantine UI backed exclusively by Alertmanager's generated v3alpha ConnectRPC services.
The new UI will be built into every Alertmanager binary and served at <route-prefix>/ui/, while the existing Elm UI remains available at the route-prefix root. Development is incremental: screens become available as their v3alpha services land, without temporary API v2 fallbacks.
Motivation
The current Elm UI is increasingly difficult to evolve, and the existing Mantine scaffold has no production asset integration or feature parity. At the same time, #5450 is introducing independently versioned protobuf services with generated clients, structured errors, pagination, and watch streams.
The bundled UI should be the first complete browser consumer of those contracts. This avoids another handwritten API model, exercises Connect and gRPC-Web in a real application, and aligns Alertmanager's frontend stack with the Prometheus 3.x UI.
Established architecture
Permanent mount: <route-prefix>/ui/.
Clean client routes such as /ui/alerts, /ui/silences/:id, and /ui/silences/:id/edit.
The legacy Elm UI remains at <route-prefix>/; this work does not remove it or change the default root UI.
Both UI distributions are embedded in release binaries and included in prebuilt asset workflows.
The Mantine UI uses only v3alpha ConnectRPC services. It does not fall back to /api/v2.
TypeScript messages, service descriptors, and query bindings are generated from proto/api/**; generated wire contracts are not hand-written.
Connect-Query and TanStack Query handle unary calls, mutations, caching, and pagination.
Generated Connect clients are consumed directly for server-streaming watch RPCs.
Browser clients use Connect under <route-prefix>/api/, not native gRPC at the server root.
Notification observability is an optional follow-up blocked on the design decision in API v3alpha: NotificationService #5484 and is not a legacy-parity completion gate.
Goals
Build, test, package, embed, and release the Mantine app alongside Elm.
Serve clean nested routes and assets correctly at root and non-root --web.route-prefix deployments.
Provide a responsive, accessible application shell, theme selection, settings, and robust loading/error/empty states.
Implement v3alpha-backed Status and Configuration pages.
Implement Alerts, alert groups, receiver filtering, pagination, URL-backed filters, and links into Silence workflows.
Two UI requirements must be resolved before the corresponding public protos freeze:
Custom alert grouping: the current UI can regroup by user-selected labels. With paginated v3alpha reads, grouping only one client page is incorrect. ListAlertGroups needs a server-side requested grouping contract, or maintainers must approve and document a parity exception.
Silence state counts: the current UI displays active/pending/expired counts. Fetching every page solely to calculate counts is not bounded. ListSilences needs bounded state counts/facets, or maintainers must approve and document a parity exception.
Delivery phases
Foundation: production asset serving at /ui/, generated Connect clients, transport/query infrastructure, shell, theme, and settings.
First useful embedded UI: Status and Configuration over API v3alpha: StatusService #5477. Until Alerts lands, /ui/ redirects to /ui/status.
Core operational UI: Alerts/groups/receivers, followed by the complete Silence lifecycle. Once Alerts lands, /ui/ redirects to /ui/alerts.
Live behavior: watch-stream consumption, reconnect, overflow handling, and fresh snapshots.
Both Elm and Mantine distributions are built, embedded, released, and linked from one Alertmanager binary.
<route-prefix>/ui/ and every supported direct nested route work with root and non-root route prefixes.
Dynamic HTML is no-cache; hashed assets retain immutable caching and identity/gzip/Brotli negotiation.
Production Mantine code contains no API v2 calls or handwritten protobuf wire models.
Status, Configuration, Alerts, Receivers, Silences, Settings, filtering, deep links, and local preferences satisfy the maintained parity matrix or have explicit maintainer-approved exceptions.
Multi-set Silence capability failures use structured FailedPrecondition details and are never flattened.
Watch overflow, disconnect, restart, and HA peer changes trigger an explicit resnapshot rather than silently retaining stale data.
Large alert/group/silence datasets meet agreed rendering and browser-memory thresholds.
Generated TypeScript output is reproducible and a second generation produces no diff.
Component, real-server, browser E2E, route-prefix, and release-asset tests pass.
The legacy Elm UI remains available and unchanged as the default root UI.
Existing work to coordinate
ui: Alerts page #5031: salvage suitable Alerts presentation/time work, but replace API v2 access and obsolete custom Accordion code with generated v3alpha clients and Mantine 9 primitives.
ui: Add theme toggle #5106: integrate the theme selector into the shell/theme work and retain the requested interaction/accessibility tests.
ui: Add tests for silences datasource #5128: preserve the testing intent, but prefer generated Connect test transports and real-server coverage over expanding fetch mocks for an API v2 datasource.
Parent: #4944
Related API roadmap: #5450
Summary
Deliver a production-quality React and Mantine UI backed exclusively by Alertmanager's generated v3alpha ConnectRPC services.
The new UI will be built into every Alertmanager binary and served at
<route-prefix>/ui/, while the existing Elm UI remains available at the route-prefix root. Development is incremental: screens become available as their v3alpha services land, without temporary API v2 fallbacks.Motivation
The current Elm UI is increasingly difficult to evolve, and the existing Mantine scaffold has no production asset integration or feature parity. At the same time, #5450 is introducing independently versioned protobuf services with generated clients, structured errors, pagination, and watch streams.
The bundled UI should be the first complete browser consumer of those contracts. This avoids another handwritten API model, exercises Connect and gRPC-Web in a real application, and aligns Alertmanager's frontend stack with the Prometheus 3.x UI.
Established architecture
<route-prefix>/ui/./ui/alerts,/ui/silences/:id, and/ui/silences/:id/edit.<route-prefix>/; this work does not remove it or change the default root UI./api/v2.proto/api/**; generated wire contracts are not hand-written.<route-prefix>/api/, not native gRPC at the server root.Goals
--web.route-prefixdeployments.Non-goals
/in this issue.API dependencies
Two UI requirements must be resolved before the corresponding public protos freeze:
ListAlertGroupsneeds a server-side requested grouping contract, or maintainers must approve and document a parity exception.ListSilencesneeds bounded state counts/facets, or maintainers must approve and document a parity exception.Delivery phases
/ui/, generated Connect clients, transport/query infrastructure, shell, theme, and settings./ui/redirects to/ui/status./ui/redirects to/ui/alerts.Completion criteria
<route-prefix>/ui/and every supported direct nested route work with root and non-root route prefixes.FailedPreconditiondetails and are never flattened.Existing work to coordinate
Child issues
/ui/.