Open-source personal finance software to track your money with real detail — without paying for an app or living inside a spreadsheet.
Valora helps you keep control of your finances: register income, expenses, outflows, credit cards, loans, and more, with a high level of detail. It's built for people who don't want to pay for a finance app, but also don't want to manage everything in Excel.
- Free and open. A serious personal-finance tool that costs nothing and hides nothing.
- AI without lock-in. Free AI models power smart features (spending recommendations, automatic transaction categorization, insights). Want a frontier model instead? Bring your own API key — no friction.
- Multilingual. Built to speak many languages. Spanish ships today; more to come.
- Detail-first. Track the things budgeting apps gloss over: credit cards, loans, and their real terms.
- Register income, expenses, and outflows
- Credit cards and loans tracking
- High-detail records
- AI-assisted categorization and recommendations (planned)
- Bring-your-own-API-key for frontier models (planned)
- Multi-language support (Spanish available)
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router), React 19 |
| Auth | better-auth (email/password + Google OAuth) |
| Database | SQLite via Drizzle ORM + better-sqlite3 |
| UI | Tailwind CSS 4, shadcn/ui, Radix UI, lucide-react |
| nodemailer (SMTP) | |
| Language | TypeScript |
- Node.js 20+
- pnpm
# 1. Install dependencies
pnpm install
# 2. Create your .env (see variables below)
cp .env.example .env # if present, otherwise create .env manually
# 3. Apply database migrations
pnpm db:migrate
# 4. Start the dev server
pnpm devApp runs at http://localhost:3000.
# Auth
BETTER_AUTH_SECRET=your-random-secret
BETTER_AUTH_URL=http://localhost:3000
# Google OAuth (optional)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# Database (defaults to ./data/valora.sqlite)
SQLITE_PATH=./data/valora.sqlite
# SMTP (email delivery)
SMTP_HOST=
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=
SMTP_PASS=
SMTP_FROM=pnpm db:generate # generate migrations from schema
pnpm db:migrate # apply migrations
pnpm db:push # push schema directly (dev)
pnpm db:studio # open Drizzle Studio
pnpm db:reset # reset the database
pnpm db:backup # back up the databaseValora runs on Vercel, but note: it uses SQLite on the local filesystem, which is ephemeral on Vercel's serverless runtime — data will not persist between deployments/invocations. For a real Vercel deployment, point SQLITE_PATH at a persistent/networked SQLite service (e.g. Turso) or host on a server/VPS with a persistent disk. Set all environment variables above in the Vercel project settings.
main is protected — no direct pushes. All changes go through Pull Requests.
- Branch from
main - Commit using Conventional Commits (
feat:,fix:,chore:, ...) - Open a PR against
main
Before opening a PR:
pnpm lint
pnpm typecheckMIT © Alonso David De León Rodarte