Problem
Tropipay needed to ship a production-grade multi-currency wallet for a new subsidiary under a hard deadline: thirty days from kickoff to first live transaction. The product had to support USD, EUR, and crypto operations, with a regulated KYC onboarding flow and the operational reliability that financial events demand. Two engineers were available, including me, plus a project manager.
The challenge wasn’t picking a stack. It was deciding what to NOT build inside the deadline — and what shape the system needed so that the things we did ship wouldn’t be torn down later.
Approach
We chose a Turborepo monorepo with a Nest.js backend and a Next.js frontend, sharing TypeScript types between the two. The decision that mattered most wasn’t the framework — it was deciding to move the real-time notification surface to Next.js Server Actions with optimistic UI, instead of standing up a full WebSocket infrastructure under the deadline.
That choice was non-obvious: most teams default to Socket.io for “real-time” out of habit. For our scope — financial events that the user is already watching for — Server Actions with optimistic updates and revalidation gave us a working surface in a week and zero operational burden afterward. WebSockets would have cost us two days of setup and a year of maintenance.
The KYC onboarding was a multi-step form with conditional branches per identity-document type. We built it as a state machine in the frontend (XState) backed by a single resumable session entity in PostgreSQL, so a user dropping off at step 4 could resume at step 4, not start over.
Outcome
Shipped on day 28, two days ahead of deadline. The notification surface has run in production for months with zero pages. The KYC drop-off rate landed below the team’s pre-launch estimate, and the onboarding state machine has absorbed three feature additions without breaking change.
The architectural decision around Server Actions has held up: we never needed to revisit it. That’s the test of a good architectural call — not whether it’s clever, but whether it stays out of the way after launch.



