The platform a Colombian lender runs on, from the public site where a family applies to the panel where an advisor approves.
Preview. Click it to open the live app.
ConstruCredit lends to families building their own homes in Colombia, one wall at a time. I build the software the whole business runs on.
There are two faces to it. The public site is where a family picks a credit line and applies. Behind it sits the panel the staff live in: applications, clients, payments, notifications, reports, administration and audit, each screen filtered to what that person's role may see.
Under both sits the part that has to be right. The amortization engine works over outstanding balance and the Colombian business calendar, so a payment landing on a holiday behaves the way the business says it should. The three packages that do the arithmetic are pinned at 100% line and function coverage, and the integration tests run against a real Postgres they refuse to touch unless its name marks it as the test one.
The schema is 36 tables across 61 versioned migrations, 56 of them shipped with the file that rolls them back. Site and panel deploy on Vercel, the API runs on Cloud Run, and a worker handles WhatsApp notifications and scheduled jobs.
Closed source, so this page links the live site instead of a repo.
A lender running on spreadsheets and WhatsApp can survive a hundred clients. It cannot survive a thousand. The arithmetic drifts, nobody can say who approved what, and every question about a balance costs an afternoon.
webappThe public site where a family reads the three credit lines and applies.
panelappThe internal system the staff works in: applications, clients, payments, notifications, reports, administration and audit, filtered per role.
apiserviceThe HTTP layer over clients, credits, payments, parameters, users and authentication, running on Cloud Run.
workerworkerScheduled jobs and the WhatsApp notification lane.
dominiolibraryThe calculation engine: amortization over outstanding balance, late interest, balances. No IO, and CI holds it at 100% coverage.
dinerolibraryExact peso arithmetic as its own type, so rounding never happens by accident.
calendariolibraryThe Colombian business calendar the due dates and late interest are computed against.
dblibrarySchema, versioned migrations with their reverse files, and the row-level security policies.