Case Study

GrantTracker 2.0

Next.js 16tRPCPrisma PostgreSQLClerk AuthTailwind CSS ● Production Ready
GrantTracker 2.0 Dashboard
2 CFR
200 Compliance
SF-425
Federal Reporting
RBAC
Multi-Role Access

The Problem

Educational institutions managing multi-year federal grants struggle with budget compliance, document organisation, and maintaining complete audit trails across departments. Existing solutions were either too rigid (enterprise ERP modules) or too lightweight (spreadsheets).

GrantTracker 2.0 treats compliance knowledge as governed infrastructure — not a checklist — building sponsor-aware logic directly into the workflow so teams can focus on outcomes rather than paperwork.

Key Features

Multi-Year Grant Tracking
AI-Driven Insights & Chat
Sponsor-Aware Compliance (2 CFR 200)
SF-425 Federal Reporting
Role-Based Access Control
Real-time Budget Monitoring

Architecture: Type-Safe API

The entire data layer is built with tRPC — giving end-to-end TypeScript type safety from database schema to React component without a manual API layer. Prisma handles database access with generated types that match the Postgres schema exactly.

// tRPC Router — end-to-end type safety export const grantRouter = createTRPCRouter({ getById: protectedProcedure .input(z.object({ id: z.string() })) .query(async ({ ctx, input }) => { const grant = await ctx.db.grant.findUnique({ where: { id: input.id }, include: { grantYears: true } }); return grant; }), });

Role of AI

Multi-agent AI powers the proactive spending insights and policy query system — users can ask natural language questions like "Are we at risk of violating the salary cap under 2 CFR 200.431?" and get grounded, context-aware answers with references to the relevant grant year data.

Access: the live demo is a frontend-only showcase on mock data — the cockpit, not the engine. The full-stack build described in this case study (tRPC API, Prisma data layer, auth, compliance engine) is private and available to discuss in a working session.

← All Projects Next: Dreamcatcher →