All releases
v0.2.7-beta

Live Updates Across Every Team

A new real-time push channel keeps every screen in sync with what is happening on the server, across every team you are in. The Requests inbox now shows transfer approvals for every team without making you switch scopes, and several long-running flows now use safer, scope-aware caching so data from one team can never leak into another. The Stories page, Dashboard, and Metrics page pivot to be release-centric so the release you are driving is the only thing on screen. Behind the scenes, this release also hardens billing webhooks, signup emails, release notifications, and crash reporting so flakiness on our side doesn't turn into work on yours.

New

  • Live updates without polling — Trinity keeps a live WebSocket connection per workspace you are in (your personal scope plus one per team) so server-side events — story progress, move requests, comments, knowledge edits, presence, billing changes — land instantly. If the channel drops for any reason, Trinity falls back to a 5-minute background refresh and reconnects automatically when service returns.
  • Cross-team Requests inbox — The Requests page now lists pending invites, sponsorship offers, storage gifts, and project transfer approvals from every team you belong to, regardless of which scope you are in. The badge on the sidebar counts items across all teams, and the team switcher shows a dot next to teams that have actions waiting for you.

Improved

  • Stories page is now release-centric — Opening Stories drops you on the active release with a required release picker on the right and a PRD picker scoped to that release. The same release picker drives Dashboard, Run, and the dependency graph, so switching releases in one place updates everything within a few seconds. The "default PRD per project" setting is gone — Trinity picks the first PRD by sequence number inside the active release; deep-link with ?prd=<id> to land on a specific one.
  • Dashboard focuses on the release you're driving — The bottom-right list of every active release was redundant when the page already shows one release at a time. It's been replaced with a Release Health card that shows the active release's status, the upstream releases it depends on (released vs. waiting), any stories blocked at gates, and a single primary action that adapts to the release's state ("Release now", "View progress", "Open Run", or "View artifacts"). The "Current Work" card was also removed — Live Execution already shows the same thing.
  • Full-width Progress card on the Dashboard — Replaces the per-phase bars with one bar for the active release as a whole and one bar per PRD inside it (sequence-ordered). Each PRD bar links straight to the Stories page filtered to that PRD.
  • Metrics page is release-centric — The project-wide PRD picker is replaced by the same release picker the rest of the app uses. Every story-derived chart (Overview, Pipeline, Cost, Releases, Detail) reflects the active release; Workers and AI Usage stay project-wide because workers process from any release and planning/provisioning calls happen before any one release exists. The Detail-tab PRD filter is scoped to PRDs in the active release.
  • 1-day period preset on the Metrics page — Sits between "All time" and 7d for quick same-day spend / cycle-time checks during heavy iteration.
  • Scope-aware caching across the app — Trinity now keeps every team's data in its own cache slot, so switching scopes is instant and there is no way for one team's stories, secrets, or metrics to bleed into another's. The migration also covers tasks (account-wide), presence (team-scope-only), and every settings layer.
  • Faster, fewer background polls — Metrics, team members, and move requests no longer poll every 30 seconds; they update in real time and only fall back to a 5-minute refresh if the push channel is unavailable. Presence is push-only.
  • Stable per-device identity for the push channel — Each desktop install gets a stable device id that travels with refresh tokens. Events you fire from one machine no longer echo back to the same machine, and presence indicators are accurate per-device.
  • Billing webhooks can't double-charge or double-grant — LemonSqueezy payment webhooks are now processed exactly once. If LemonSqueezy retries the same event during a network blip, Trinity recognizes it and skips re-processing. Events are held in a durable queue while they run, with a dead-letter lane that catches anything that fails repeatedly so nothing is lost silently.
  • Signup welcome emails always send — The post-signup side-effects (welcome email, workspace bootstrap) now run through the same durable queue. If our email provider is momentarily unavailable, the email retries on its own instead of being dropped.
  • Faster "new version available" notifications — When a new desktop release ships, every running instance refetches the release manifest within seconds over the push channel, instead of waiting up to fifteen minutes for the next background check.
  • Crash reporting across the stack — The desktop app, sidecar, website, and background workers now report errors to Sentry. When something breaks on your end we see it the moment it happens, so we can ship a fix without you having to file a ticket first.
  • Nightly background cleanup — A new sweeper clears stale webhook claims, expired sessions, and orphaned queue entries each night, preventing the slow-degradation buildup that used to require manual intervention.

Fixed

  • No more "Too many redirects" when finishing onboarding — Confirming a new project no longer crashes into a redirect loop on slower machines or stale caches. Finalizing now completes inline before navigation, and the Dashboard and Onboard pages use declarative redirects that can't double-fire if a background refetch lands at the same moment.
  • Onboarding shows a loading skeleton instead of a blank page — While Trinity figures out which phase your project is in on first paint, you see a placeholder of the wizard chrome instead of an empty screen.
  • Roadmap sections appear as soon as each one finishes — During the Roadmap step the planning, architecture, and design sections reveal themselves wave-by-wave as the AI completes each one, instead of staying on "Generating…" until you clicked away and back.
  • Activity feed labels knowledge edits by title — Entries for knowledge book, chapter, and section edits now show the title in quotes (e.g. "Project Overview") instead of a UUID fragment.
  • "Project created" activity entries stick with the right project — Creating a new project no longer files its "created" entry under whatever project you happened to have open before — the entry is pinned to the new project, so the activity-feed chip and the project filter point at the right thing.
  • Provider initialization order on the desktop — A startup race could leave useAuthContext must be used within AuthProvider errors flashing on cold launch in dev. The auth provider now wraps the real-time provider, so the order is deterministic.
  • Webview crash on cold load (process is not defined) — A few cache call sites pulled in Node-only modules through a barrel import, which crashed the webview bundle the moment it loaded. The browser bundle is now structurally cordoned off from Node-only code, and a lint rule prevents the regression.
  • Switching projects no longer shows the previous project's data for up to a minute — A server-side cache for releases and PRDs was keyed only by your account and team, not by the active project. Right after switching projects, the dashboard story count, release list, and PRD content could keep showing the previous project's data until the cache expired. Both caches now key on the active project, so a switch is correct on the very next read.
  • "Restart onboarding" actually restarts now — The Restart button in the onboarding wizard is wired to the real reset path: it deletes the project's repos and workspace, clears state, and brings you back to step one. If a leftover repo with the same name is still on GitHub or in the database, finalizing repos now returns a clear error pointing at the offending name instead of a generic 500.
  • Onboarding shows the wizard immediately on Restart — Clicking "Yes, restart" updates the wizard cache optimistically so you see step one instantly while the reset finishes in the background. If the reset fails, the previous state is restored and an error toast explains what went wrong.
  • Resumed pipelines show the right phase ribbon — When you resume a story-pipeline run mid-flight, the phase indicator now reflects the phases that already completed instead of starting from scratch.
  • PRD knowledge chapters reference the right PRD — The vault entries created during PRD planning now use the PRD's stable UUID instead of its display number, so chapters don't get orphaned if numbering shifts.
  • Dashboard cards no longer flash "0" while loading — Stat tiles wait until the metrics request resolves before rendering numbers, so they don't pop from "0" to the real count on every load.
  • Recent activity is capped at 5 entries — The dashboard's recent-activity preview no longer expands as the project ages; the full feed is still on the Activity page.
  • Knowledge Base / Gotchas / Stories show a real skeleton on first load — The brief "Loading…" text these three pages flashed before the data resolved is replaced with a layout-shaped skeleton. The Knowledge Base and Gotchas headers also no longer show the misleading "being provisioned" subtitle until we've actually confirmed the library is empty.
  • Stories no longer shows "No active release" while still loading — On project switch or first paint there's a brief window where Trinity doesn't know yet whether the project has releases. Stories now keeps the skeleton up until that resolves, instead of flashing the empty-state message for projects that do have releases.
  • Metrics page no longer flashes "No metrics recorded yet" while loading — Same shape as the Stories fix: the empty-state message used to appear briefly on project switch even when the project had metrics. The skeleton now stays up until we've actually confirmed the server returned an empty payload.
  • Opening a story no longer flashes "No PRD found." while loading — Visiting a story's detail page used to briefly show "No PRD found." until the story and its PRD finished loading. The page now shows a layout-shaped skeleton until both have arrived.
  • Graph view opens on the active release — The graph used to default to "All Releases" with every PRD in the project on screen. It now opens on the active release picked in the global selector and stays in sync with it; the in-graph release dropdown is gone since the global one is the single source of truth.
  • Activity-feed entries hide the dead "Default Prd" change rows — Historical entries that recorded changes to the project-wide default PRD (a setting that no longer exists) are filtered out of the activity-detail dialog and the entity-history timeline.