Mar 2026 – Jul 2026
CCM
Chase Cost Management — contract and vendor management platform
A platform for managing thousands of vendors and their contracts, used by about 100 people, with an AI chat for querying contracts. I set up the Next.js foundation, reviewed two developers' work, stabilized the codebase and built two modules.
- Role
- Project setup, code reviewer for 2 developers, then module owner
1,000s
vendors managed
~100
users
2
developers reviewed
2
modules built
Problem
The client supplied UI generated with v0 (Vercel), which needed to become a real production codebase.
Later, while I was on another project, forms and other features in CCM started breaking almost daily.
Constraints
- Mostly forms and tables, with fields that depend on other fields' values.
- A small team: two developers continued the work between my setup and my return.
Architecture
What I built
Setup from v0 to production
I moved the v0 UI into a Next.js codebase using the Pages Router, with server-side and static rendering where it fit, plus architecture, tooling and reusable boilerplate the team built on.
Review, then stabilize
I came back as code reviewer for two developers, fixed the recurring form and feature failures, and got the app to the point where errors became rare.
AI Sync and User modules
AI Sync is a WebSocket chat with streaming responses for querying the contracts assigned to a user. The User module gives admins access control over other users.
Dynamic forms and performance
Complex forms with conditional, nested dependent fields, and data tables for contracts and vendors. React.memo, useMemo and useCallback avoid needless re-renders; pages are lazy-loaded and API responses cached.
Decisions and trade-offs
Adapt the v0 UI instead of rebuilding it
Choice: Wire the client's generated UI into Next.js with Redux and REST.
Trade-off: A faster start that matched the client-approved design; the generated UI still had to be adapted to Redux and the API layer.
Direct-to-S3 uploads
Choice: Pre-signed URLs from the backend; the frontend uploads files (up to 25 MB) directly.
Trade-off: Keeps file traffic off the API server.
Results
- A production Next.js foundation the rest of the team built on.
- Daily breakages reduced to rare errors after review and stabilization.
- Two complete modules shipped: AI Sync and User management.
What I'd do differently
- Automated tests on the form logic would have caught the regressions earlier than review alone.
Next case study
Paper Tiger →