Pagos
Installable personal finance app for Peru: log payments, income and expenses in two taps, get reminded before every due date and use it offline.
- Client
- IA Systems & Data
- Year
- 2026
- Service
- Apps and software
- Role
- Full-stack technical lead
- Format
- Web app
- Status
- In production

Running household finances without missing a due date.
We wanted logging household payments, income and expenses to take two taps, no due date to slip by and a clear view of where the money goes, offline too.
An installable app that works on the device first.
We built the frontend in Next.js 16 with Dexie (IndexedDB): the app always reads and writes to a local copy on the device. A NestJS 12 backend syncs changes by cursor, resolves conflicts with last-write-wins and never hard-deletes data.
It supports shared households with capability-based permissions, multiple currencies with SUNAT's daily exchange rate, scheduled payments with reminders, credit cards with statement and due dates, installments, loans between people, budgets with goals and recurring-expense detection.
What it includes
Two-tap logging
Payments, income and expenses are logged in two taps, with templates for frequent entries.
Works offline
The app reads and writes to a local copy and syncs changes without blocking the interface.
Shared household
Invitations, capability-based permissions (manage, write and read) and private entries that don't affect the shared total.
Scheduled payments
Reminders before every due date, a payments calendar, projected end-of-month balance and cards with statement and due dates.
Budget and goals
Per-category budget, savings goals with a target date, alerts at 80% and 100% of a limit and a warning on likely duplicates.
Automation
Automatic categorization rules and recurring-expense detection, turned into a scheduled payment in one tap.
Stack and architecture
- Next.js 16
- TypeScript
- Tailwind CSS 4
- NestJS 12
- Prisma 7
- PostgreSQL 16
- Redis 7
- PWA
- Frontend
- Next.js 16 with Dexie (IndexedDB) as the local copy, TanStack Query and shadcn/ui.
- Backend
- NestJS 12 with Prisma 7 over PostgreSQL 16, Zod, BullMQ queues on Redis 7, and sign-in with Google, a local PIN or passkeys.
- Data
- Two-way cursor-based sync, with last-write-wins conflict resolution and no hard deletes.
- Infrastructure
- pnpm and Turborepo monorepo on a dedicated VPS behind Cloudflare and Caddy, with CI/CD on GitHub Actions.
What we solved
Conflict-free sync
Idempotent cursor-based protocol: the client always reads from its local copy, conflicts resolve by last write and records are flagged as deleted instead of being removed.
Integer money, never floating point
Every amount is stored in cents with its ISO 4217 currency, with no rounding errors in splits, installments and multi-currency balances.
Capabilities instead of fixed roles
The system checks capabilities (manage, write and read) rather than role names, so each household names its own roles without touching code.
In detail
- Installable and offline
- PWA
- Biometric unlock
- Passkeys
- Similar entries to detect a recurring expense
- 3


