Your finances, your machine, your data. A local-first spending tracker that runs entirely on your own computer. No cloud. No accounts. No telemetry. Your transaction data never leaves your machine.
LocalLedger connects to bank accounts across Europe via the GoCardless Bank Account Data API to pull transactions, then stores and processes everything locally in a SQLite database on your filesystem. GoCardless supports 2,500+ banks in 31 countries. There is no backend server, no third-party analytics, and no data shared with anyone. The GoCardless API is used solely as a read-only bridge to fetch your bank data -- nothing is sent back.
Most budgeting apps require you to hand over your financial data to a company's servers. LocalLedger takes a different approach:
- All data stays on disk -- Transactions are stored in a local SQLite file. No cloud database, no sync service.
- No accounts or auth -- There's no login, no user system. It's your machine, so it's your app.
- No telemetry or tracking -- Zero analytics, zero phone-home behaviour. Nothing runs unless you run it.
- Fully offline after sync -- Once transactions are pulled from your bank, everything works without an internet connection.
- Open source -- Inspect every line. Verify that your data goes nowhere.
- Bank connections -- Link European bank accounts via GoCardless with QR code auth flow
- Transaction sync -- Pull and deduplicate transactions from connected accounts
- Categorization -- Manual and rule-based auto-categorization of transactions
- Spending analysis -- Daily, weekly, and monthly spending charts
- Category management -- CRUD categories with pattern-matching auto-rules
- Next.js 16 (App Router, Turbopack)
- SQLite via Drizzle ORM
- Tailwind CSS v4
- Recharts
- TypeScript
- Node.js 24+
- GoCardless Bank Account Data API credentials (sign up here)
- Install dependencies:
npm install- Create a
.env.localfile:
GOCARDLESS_SECRET_ID=your_secret_id
GOCARDLESS_SECRET_KEY=your_secret_key
- Push the database schema:
npm run db:push- Seed default categories:
npm run db:seed- Start the dev server:
npm run devOpen http://localhost:3000.
| Command | Description |
|---|---|
npm run dev |
Start dev server (Turbopack) |
npm run build |
Production build |
npm run lint |
Run ESLint |
npm run db:push |
Push schema changes to SQLite |
npm run db:generate |
Generate Drizzle migrations |
npm run db:seed |
Seed default categories and rules |
npm run db:studio |
Open Drizzle Studio GUI |
| Variable | Required | Default |
|---|---|---|
GOCARDLESS_SECRET_ID |
Yes | -- |
GOCARDLESS_SECRET_KEY |
Yes | -- |
NEXT_PUBLIC_APP_URL |
No | http://localhost:3000 |
DB_FILE_NAME |
No | file:local.db |
MIT