Virureko
Multi-user personal finance in guaraníes: accounts, budgets, recurring payments, savings goals and reports. Live at virureko.com, built with AI agents under my architecture and review.
See it live: virureko.com ↗ (opens in a new tab)- Role
- Product, architecture and deployment
- Year
- 2026
- Platform
- Next.js 16 · PostgreSQL 16
- Code
- Private
Dashboard · mobileDashboard with bottom bar and quick-add button. (opens in a new tab)
DashboardDashboard: total balance, month over month and budget alerts. (opens in a new tab)
Budgets · mobileBudgets with quick edit. (opens in a new tab)
TransactionsTransactions: filters, tags and CSV export. (opens in a new tab)
AccountsAccounts: real balance per wallet and transfers between own accounts. (opens in a new tab)
BudgetsBudgets: per-category caps and a warning when you go over. (opens in a new tab)
GoalsGoals: progress and suggested pace to hit the date. (opens in a new tab)
RecurringRecurring: confirm or skip; nothing is recorded on its own. (opens in a new tab)
ReportsReports: balance, savings rate and spending by category. (opens in a new tab)
ComparisonComparison: where you spent more than last month. (opens in a new tab)
Problem
Personal finance apps don't think in guaraníes or in how money is handled here, and they mix transfers between your own accounts with spending, so the numbers never match the bank.
Solution
Accounts with real balances, per-category budgets, recurring payments you confirm (nothing is recorded on its own), savings goals and comparative reports. Mobile-first, installable as an app (PWA), with CSV and PDF export.
Technical decisions
- 01
Strict isolation between users
Every server query is filtered by the session's user, never by an id sent from the browser, and a test suite proves nobody can see or touch someone else's data. Passwords hashed with argon2id and leaked passwords rejected; email verified with a one-time code and rate limiting.
- 02
Money as integers, never floats
Amounts are stored as integers (BigInt) in PostgreSQL and balances are derived from the transactions. Transfers between your own accounts are neither income nor spending, and goals don't move money: nothing is counted twice.
- 03
Simple, hardened deployment
Own VPS with Docker Compose: the app, PostgreSQL with no exposed port and Caddy with automatic HTTPS. Key-only SSH, firewall, fail2ban and CI with GitHub Actions. Server-rendered SVG charts and PDF from a printable page, no heavy libraries.