Loading…
Loading…
A cross-border payments platform with an AI support agent that reads the customer's own account and hands off to a human mid-conversation.

Support poll load
Apps, one workspace
API domains
ComplyRemit moves money across borders, so almost every screen sits on top of KYC, an approval gate, or a payment rail. I built it as a single npm workspace: an Express 5 API on Node 24 with Prisma over PostgreSQL, three Next.js front ends (customer app, operator console, marketing site), a Stripe storefront, and an Expo mobile app covering the same customer journey. Thirteen API domains share that one server — auth, onboarding, recipients, bank accounts, KYC, payments, support, admin and webhooks. The piece I'm proudest of is the support layer: an AI assistant that can actually see the caller's own transfers, and that knows when to stop talking and fetch a person.
An assistant that can read account data is an IDOR waiting to happen — a customer can talk a model into looking up someone else. So no tool takes a subject at all: every lookup closes over the authenticated session, and a test asserts that no tool parameter is ever named for a user. Prompt wording alone was never going to hold that line.
Two voices answering one customer is what makes people distrust a support widget. The assistant answers only while the conversation is in its bot state and stops completely once a human is queued — and because transcripts are persisted rather than held in React state, the agent who picks it up inherits the whole conversation instead of asking the customer to repeat themselves.
The first cut of live chat polled hard enough to trip production rate limits. Reworking it — one round trip per tick instead of three, and an interval that backs off 2s → 15s as polls come back empty — took an agent with three panels open from roughly 204 requests a minute to about 12 at rest, without adding sockets to a two-instance deployment.
The assistant's prompt is a product claim, and it drifted: an earlier version offered corridors that were never built and described a login flow that had been replaced. Nothing errored — every answer just read fluently and wrong. It's now asserted in tests against the same source of truth the API validates against.





Have a product in mind? Let's turn it into something users love — fast, scalable, and beautifully engineered.