Pagos
PWA local-first de finanzas personales para Perú: registra pagos, ingresos y gastos en dos toques, no olvida ningún vencimiento y muestra a dónde va el dinero, incluso sin conexión.

Sobre el Proyecto
Pagos es una PWA de finanzas personales pensada para el contexto peruano: registra pagos, ingresos y gastos en dos toques, avisa antes de cada vencimiento y muestra con claridad a dónde va el dinero del hogar.
Como Full-Stack Lead, diseñé la arquitectura completa: frontend en Next.js 16 con Dexie (IndexedDB) para un modelo local-first que siempre lee y escribe sobre el espejo local del dispositivo, y un backend en NestJS 12 con un protocolo de sincronización por cursor (push/pull) que resuelve conflictos por última escritura y nunca borra datos físicamente.
El sistema soporta hogares compartidos con roles por capacidad (gestionar/escribir/leer), multi-moneda con tipo de cambio SUNAT diario, pagos programados con recordatorios push, tarjetas de crédito con fecha de corte y pago, cuotas, préstamos entre personas, presupuesto flexible con metas y detección automática de gastos recurrentes.
Detalles Técnicos
- RolFull-Stack Lead
- Año2026
- FrontendNext.js 16, Dexie (IndexedDB)
- BackendNestJS 12, Prisma 7
- EstadoEn Producción
- ArquitecturaPWA Local-First
STACK TECNOLÓGICO —
Stack Completo:
Next.js 16, Dexie (IndexedDB), TanStack Query, shadcn/ui
NestJS 12 (ESM), Prisma 7, Zod, BullMQ
Protocolo push/pull por cursor, resolución de conflictos por última escritura
Google OAuth, PIN local y passkeys (@simplewebauthn)
FUNCIONALIDADES —
Alta de pagos, ingresos y gastos optimizada para completarse en dos toques, con plantillas para movimientos frecuentes.
La app lee y escribe siempre en un espejo local (IndexedDB); un motor de sincronización por cursor envía y trae cambios sin bloquear la interfaz, incluso sin conexión.
Invitaciones, permisos por capacidad (gestionar/escribir/leer) y transacciones privadas marcadas como 'mío' que no afectan el total compartido.
Recordatorios push antes de cada vencimiento, calendario de pagos, saldo proyectado a fin de mes y tarjetas de crédito con fecha de corte y pago.
Presupuesto flexible por categoría, metas de ahorro con fecha objetivo, alertas al 80% y 100% del límite, y aviso al detectar un posible duplicado.
Reglas de categorización automática y detección de gastos recurrentes tras 3 ocurrencias similares, con creación de programados en un toque.
Desafíos Técnicos y Soluciones
Diseñé un protocolo de sincronización por cursor (POST /sync/push, GET /sync/pull) idempotente, donde el cliente siempre lee de su espejo local y los conflictos se resuelven por última escritura, sin borrado físico de registros (deletedAt).
Todo monto se maneja como amountMinor (céntimos) con su moneda ISO 4217, evitando por completo errores de redondeo de punto flotante en cálculos de splits, cuotas y saldos multi-moneda.
El sistema pregunta por capacidades (household.manage | write | read) en lugar de nombres de rol fijos, permitiendo que cada hogar nombre sus propios roles sin tocar el código.
IMPACTO —
Notas Técnicas
Monorepo pnpm + Turborepo (apps/web, apps/api, packages/shared). Frontend Next.js 16 con Dexie (IndexedDB) para el espejo local y TanStack Query; backend NestJS 12 (ESM) con Prisma 7 sobre PostgreSQL 16, WebSockets con Socket.IO, colas con BullMQ y Redis 7. Autenticación con Google OAuth, PIN local y passkeys vía @simplewebauthn. Desplegado en producción sobre un VPS propio detrás de Cloudflare y Caddy, con CI/CD por GitHub Actions.