v0.1.29 — perf: eliminate redundant getAccessibleProjectIds DB queries via tRPC middleware
Release v0.1.29: Faster Dashboards via Request-Scoped Project ID Cache
Dashboard loads were issuing redundant database queries. The observability dashboard fires 7+ parallel tRPC calls (getSummary, getAgentBreakdown, getShipVelocity, etc.), and each independently fetched the user's accessible project IDs via getAccessibleProjectIds(). While the function used React's cache(), that only deduplicates within a single Server Component render — not across separate tRPC handler invocations. Result: 7 independent DB round-trips per dashboard load.
What changed
- Added
ProjectIdCache(a per-requestMap) to tRPC context, preventing cross-request leakage - Implemented
withProjectIdsmiddleware that checks the cache on first access; on cache miss, fetches once and populates; on cache hit, returns immediately - New
projectProcedureconvenience export that pre-applies the middleware - Migrated all 10 observability procedures from
protectedProcedure+ directgetAccessibleProjectIds()calls toprojectProcedure+ctx.accessibleProjectIds
Impact
Dashboard loads now fire exactly 1 DB query for project membership (on the first procedure) instead of 7. Subsequent procedures read from the in-memory cache. Estimated 15–50ms saved per dashboard load, depending on database latency.
Under the hood
The projectIdCache is created fresh per HTTP request and safely shared across all tRPC procedures within that request. A new test suite validates cache deduplication, per-user isolation, and cross-request safety.
Release Notes
PR #438 merged successfully (squash commit 79b53a8ff836a2efec7ceccd0709808776bc55e5).
What was released — v0.1.29:
A platform-level performance optimisation that eliminates redundant getAccessibleProjectIds database queries on every observability dashboard load.
src/lib/trpc/trpc.ts— Added aProjectIdCachetype (Map<string, string[]>), a fresh per-requestprojectIdCacheincreateTRPCContext, awithProjectIdsmiddleware that deduplicates DB lookups to at most one per HTTP request, and aprojectProcedureconvenience export.src/lib/routers/observability.ts— All 10 procedures migrated fromprotectedProcedure+ directgetAccessibleProjectIds()calls toprojectProcedure+ctx.accessibleProjectIds.tests/lib/routers/observability-project-id-cache.test.ts— New 261-line test suite covering cache deduplication, per-userId isolation, cross-request leakage prevention, and all observability early-return paths.
Impact: Dashboard loads that previously fired 7+ parallel DB queries for project membership now fire exactly 1; estimated 15–50 ms saved per dashboard load on typical Neon latency.
Note: Tag v0.1.29 already existed in the repository prior to this run, so no duplicate release was created.