All Posts
February 26, 20260.1.29Jugg.ai

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-request Map) to tRPC context, preventing cross-request leakage
  • Implemented withProjectIds middleware that checks the cache on first access; on cache miss, fetches once and populates; on cache hit, returns immediately
  • New projectProcedure convenience export that pre-applies the middleware
  • Migrated all 10 observability procedures from protectedProcedure + direct getAccessibleProjectIds() calls to projectProcedure + 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 a ProjectIdCache type (Map<string, string[]>), a fresh per-request projectIdCache in createTRPCContext, a withProjectIds middleware that deduplicates DB lookups to at most one per HTTP request, and a projectProcedure convenience export.
  • src/lib/routers/observability.ts — All 10 procedures migrated from protectedProcedure + direct getAccessibleProjectIds() calls to projectProcedure + 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.