El contexto
Monarka es una app de finanzas personales inspirada en herramientas como Actual Budget, pero pensada para usuarios latinoamericanos con necesidades reales: múltiples monedas, tarjetas de crédito con cuotas, préstamos con amortización, reglas recurrentes y seguimiento opcional de patrimonio neto a través de propiedades e inversiones.
La propuesta es simple: darle al usuario una imagen clara de su dinero sin forzarlo a adaptarse a una lógica contable de otro país. Desde el principio el producto soporta monedas locales e internacionales, flujos de ingreso y gasto, y un sistema de doble entrada que mantiene todo balanceado.
El desafío
Una app de finanzas personales no es solo un formulario de gastos. Para ser útil, Monarka tuvo que resolver problemas de dominio complejos:
- Multi-moneda y multi-vault: el usuario puede tener cuentas en guaraníes, dólares, reales o pesos, agrupadas en bóvedas (vaults) con propósito distinto.
- Contabilidad de doble entrada: cada transacción genera postings que mantienen los balances consistentes, especialmente en transferencias entre cuentas y divisas.
- Tarjetas de crédito con cuotas: una compra genera la transacción real y vistas de cuotas (
INSTALLMENT) que reflejan el plan de pagos sin duplicar postings. - Préstamos con amortización: soporte para métodos francés, alemán y simple, con generación automática de la tabla de amortización y pagos programados.
- Reglas recurrentes materializadas: las reglas de recurrencia crean transacciones reales con cron, no se calculan sobre la marcha.
- Patrimonio neto opt-in: propiedades e inversiones con valor de mercado, vinculadas opcionalmente a préstamos.
Además, todo esto tenía que ser rápido en mobile, accesible en español e inglés, y seguro mediante Supabase Auth + RLS.
La solución
Monarka está construido con Next.js 16 (App Router, RSC), React 19 y TypeScript. La base de datos usa PostgreSQL con Prisma 7 y el adapter de pg, y la autenticación corre por Supabase con Row Level Security.
La arquitectura separa responsabilidades:
src/schemas/— esquemas Zod como fuente de verdad de tipos de entrada.src/server/actions/— Server Actions que envuelven mutaciones en transacciones.src/server/queries/— lecturas para RSC.src/server/services/— lógica de dominio pura y testeable.
El dinero siempre se trata como BigInt en unidades menores, nunca como number fuera del formateo. Las tarjetas de crédito modelan ciclos, días de cierre y pago, y cuotas vinculadas. Los préstamos usan calculateAmortization() como única fuente de verdad para evitar cálculos dispersos.
La UI usa Tailwind CSS 4, shadcn/ui y componentes de Radix. La internacionalización corre con next-intl (es por defecto, en disponible). Los reportes descargables (Plus) se generan con @react-pdf/renderer y exceljs. La suscripción Plus se cobra con Stripe, con webhooks defensivos y scripts de fixture para evitar drift.
El testing cubre Vitest para unitarios/integración y Playwright para e2e, con un stack Docker local para testear contra una base aislada.
Resultado
Monarka vive en monarka.lat y ofrece una experiencia de finanzas personales completa sin la rigidez de las hojas de cálculo ni la complejidad de los ERPs. El usuario puede ver sus gastos, controlar tarjetas, planificar pagos y entender su patrimonio desde una sola interfaz.
Para Owncoding, Monarka es un ejemplo de cómo modelar dominio financiero complejo —moneda, deuda, inversión, recurrencia— en una aplicación moderna, type-safe y preparada para crecer.