This release includes 3 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
Summary
AI summaryUpdates Breaking changes, feat, and 24h/7d/14d/30d/All across a mixed release.
Full changelog
Project overview as a bento dashboard
The overview showed four context-free numbers, one crash-free line and a top-issues list. Nothing carried a trend, there was no time window, and fields the issues endpoint already returned were being thrown away. It is now a bento grid built around the chart an error tracker is actually for.
GET /api/projects/{id}/events/statsreturns project-wide error volume bucketed by severity. Nothing existed at project level before, only per-issue stats. Buckets are zero-filled, so a quiet hour renders as zero rather than a gapGET /api/projects/{id}/stats/summaryreturns events, new issues and open issues, each paired with the same counter over the preceding window, from one scan of the doubled window split byCASE- A hero error-volume chart with counter tiles, crash-free trend, session health and latency around it, then top issues full width. Each tile streams behind its own Suspense boundary instead of the page blocking on the slowest query
- Period filter (24h/7d/14d/30d/All) held in the URL, so the page stays a Server Component and the window survives a reload
- Top issues now uses the trend sparkline and user count the API was already sending
- New index on
issues(project_id, first_seen DESC): the existing indexes all order bylast_seen, so afirst_seenrange scanned every issue in the project @rustrak/clientgainsStatsResource, and@rustrak/mcpexposes both endpoints asget_error_volumeandget_project_stats
Releases as a paginated table
Releases rendered every release as a card with no pagination, unlike Issues, Logs, Performance and Agents. It now uses the same offset-paginated table, and the endpoint paginates server-side instead of returning every row.
ORDER BYgains release and environment tiebreakers. Without them, two releases with equal session totals could order differently between requests, letting offset pagination skip or repeat a row- Page and period both live in the URL, so the view is shareable and survives a refresh
getReleaseHealthno longer swallows errors into an empty array. A fetch or auth failure reaches the error boundary instead of being disguised as the empty state, matching Logs and Performance
Breaking changes
GET /api/projects/{id}/sessions/statsreturnsOffsetPaginatedResponse<ReleaseHealthRow>and acceptspage/per_page. It previously returned a bare array@rustrak/client:sessions.stats()takes an options object (period,release,page,per_page) instead of positional arguments, matchinglogs.list()@rustrak/client:releaseHealthSchemaand theReleaseHealtharray type are removed, since no response has that shape anymore
Improvements
- Chart palette replaces the unvalidated shadcn
--chart-*defaults with colors checked for lightness band, chroma floor, colorblind separation and contrast against both card surfaces, expressed in oklch like the rest of the file. Reserved--sev-*severity tokens added - Stacked-bar shapes moved to module scope. They were built inside render, so React remounted every bar on every resize tick: collapsing the sidebar over an all-time window remounted roughly 1900 nodes per frame. Charts also cap the bars they draw by merging buckets,
ResponsiveContainerdebounces, and "All" requests daily buckets instead of hourly min-w-0on the chart cells. A grid item defaults tomin-width: auto, so a measuredResponsiveContainerwidth pinned its column open and the page scrolled sideways on a phone- Out-of-range pages redirect to one that exists, instead of reading "19961-27 of 27" and "Page 999 of 2"
?period=is validated against the supported windows. An unknown value used to reach the API, which answered with all-time data while no filter button read as selected- Release detail walks every page of a release's rows instead of assuming 100 environments fit in one
query_release_healthuses saturating offset arithmetic. A large?page=overflowed the multiplication, surfacing as a 500 either way: a panic under overflow-checks, a negative offset Postgres rejects without them- The crash-free trend no longer bridges empty buckets. A bucket whose sessions all arrived as terminal updates lands with a null rate, and connecting across it drew a confident line where nothing was measured. Measured buckets with no measured neighbour now get a dot
- Top issues is labelled as all-time, since the issues endpoint takes no time window and
event_countis a lifetime total
Artifacts
rustrak/rustrak-server:v0.12.3
rustrak/rustrak-server:v0.12.3-postgres
rustrak/rustrak-ui:v0.12.3
@rustrak/[email protected] and @rustrak/[email protected] on npm.
What's Changed
- feat: paginate release health and show releases as a table by @AbianS in https://github.com/rustrak/rustrak/pull/209
- feat: rebuild the project overview as a bento dashboard by @AbianS in https://github.com/rustrak/rustrak/pull/210
- chore: version packages by @AbianS in https://github.com/rustrak/rustrak/pull/211
Full Changelog: https://github.com/rustrak/rustrak/compare/v0.12.2...v0.12.3
Breaking Changes
- GET /api/projects/{id}/sessions/stats now returns OffsetPaginatedResponse and accepts page/per_page query parameters (previously returned a bare array).
- @rustrak/client: sessions.stats() now takes an options object (period, release, page, per_page) instead of positional arguments.
- @rustrak/client: Removed `releaseHealthSchema` type and the `ReleaseHealth` array type as they are no longer used.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About AbianS/rustrak
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]