Skip to content
Praveen Kumar
← All work

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
ReactNext.js (Pages Router)SSR / SSGReduxTypeScriptWebSocketsAWS S3v0

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

APPv0 UIgenerated designNext.jsPages Router · SSR/SSGRedux storeapp stateREST APIdataported towiresfetchREAL-TIME CHATAI Sync chatask about contractsWebSocketstreamingBackendprovider routingopenquerystreams replies backFILE UPLOADFile uploadup to 25 MBPre-signed URLfrom backendAmazon S3direct uploadrequest URLupload file

What I built

01

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.

02

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.

03

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.

04

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 →