A private, self-hosted personal finance tracker with a Telegram bot and receipt OCR.
Demo credentials are shown on the login page (one-click Masuk ke demo). Fake data, resets daily at 00:00 WIB.
Dompetku ("my wallet" in Indonesian) helps you track income, expenses, transfers, installments, subscriptions, budgets, savings goals, gold and money people owe you, all in one place. Log a coffee by sending "kopi 25rb" to your own Telegram bot, or snap a photo of a receipt and let AI fill in the details. Everything lives in your own Supabase database and your own Vercel deployment, so your financial data stays yours.
It is built for one person (you): a single login defined in environment variables, no sign-up pages, no shared servers. The interface is available in Indonesian and English (switch any time), and amounts support IDR and USD.
Note
Dompetku was designed with Indonesian users in mind (Rupiah, local banks and e-wallets, Antam
gold prices, chat shortcuts like 25rb / 2jt), but it works for anyone who tracks money in
IDR and/or USD.
- Live demo
- Screenshots
- Features
- Deploy your own in ~20 minutes
- Tech stack
- Project structure
- Documentation
- Local development
- Contributing
- Security
- License
- Acknowledgements
Try it without installing anything: https://demo.dompetku.ilramdhan.dev
- The demo login is shown on the login page — click Masuk ke demo to sign in with one click.
- All data is fake and resets daily at 00:00 WIB; feel free to add, edit and delete.
- AI receipt scanning, photo upload, CSV import, restore, app settings and the Telegram bot are turned off in the demo. Want to run your own public demo? See docs/DEMO.md.
All screenshots use the fictional demo data and follow your GitHub theme (light
or dark). Regenerate them with npm run screenshots (see Regenerating screenshots).

![]() Transactions: Search, filter and sort every transaction; CSV import/export and PDF. |
![]() Reports: Category trends over 6 or 12 months and a yearly recap. |
![]() Budgets: Monthly budgets with rollover and 80% / 100% alerts. |
![]() Account detail: 12-month balance, spending per category and reconciliation. |
![]() Savings goals: Progress, monthly target and projected completion date. |
![]() Gold: Antam and world gold prices with unrealised profit. |
![]() Recurring transactions: Salary, rent and top-ups posted automatically when due. |
![]() Settings: Categories, app settings and optional two-factor login. |
On your phone and in Telegram



- Income, expenses and transfers between accounts (banks, e-wallets, cash, and so on) with live balances.
- IDR and USD amounts with an automatic daily exchange rate.
- Debts and installments (paylater, loans) with payment tracking.
- Subscriptions, monthly or yearly, in IDR or USD, with optional tax.
- Account fees: transfer, top-up and monthly admin fees recorded as separate expenses.
- Recurring transactions (salary, rent, regular transfers) posted automatically when due.
- Split transactions: split one receipt across several categories.
- Up to 5 receipt photos per transaction, stored privately, plus search by receipt item name.
- CSV import with a preview, duplicate detection and optional creation of new categories or accounts.
- Monthly budgets per category, with optional rollover of unused amounts.
- Instant alerts at 80% and 100% of a budget, on the web and in the bot.
- Savings goals, optionally linked to a savings account.
- Gold savings with daily world (XAU) and Antam prices, optionally linked to an account.
- Receivables (money others owe you) with partial payments.
- Net worth that counts account balances, gold and outstanding receivables.
- Telegram bot: record transactions by chat (
kopi 25rb,gaji masuk 8jt ke BCA) or by sending a receipt photo. Every entry is shown as a preview with buttons before it is saved;/undoremoves the last one. Slash commands give balances, reports, bills, budgets and more. - Receipt OCR in the web app and the bot, using any OpenAI-compatible AI provider (for example Google Gemini or OpenAI).
- Reminders for upcoming bills via Telegram or email, plus daily, weekly and monthly reports, all scheduled by ready-to-import n8n workflows.
- Dashboard with cash flow, category breakdowns and net worth charts.
- Monthly reports, a printable yearly summary with CSV export.
- Per-account report with a balance chart and bank statement reconciliation.
- Activity log of every change.
- Your database, your server. The browser never talks to the database; only server code holds the key, and database row-level security blocks everything else.
- Single-user login with a signed,
httpOnlysession cookie and a brute-force login limit. - Optional two-factor login (TOTP) with any authenticator app.
- Privacy mode (eye icon or Shift+H) hides every amount, balance and chart value on the current device, handy when sharing your screen.
- Telegram bot answers only the chat IDs you allow.
- Backup and restore of all data as one JSON file, plus an optional weekly automatic backup to Google Drive or email via n8n.
- Error monitoring: structured server logs and optional Sentry reporting.
- Installable as an app (PWA) on phone and desktop.
- Indonesian / English interface and light / dark theme.
- Mobile-first design that works on small screens.
You need free accounts on GitHub, Supabase and Vercel. No coding is required.
- Fork this repository to your GitHub account (the Fork button at the top right of this page).
- Create a Supabase project, open SQL Editor, paste the contents of
supabase/schema.sqland click Run. - Import your fork into Vercel (or use the button below).
- Add the required environment variables:
SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY,APP_USERNAME,APP_PASSWORDandSESSION_SECRET(a random string of at least 32 characters). - Deploy, open your site and log in. Add the Telegram bot, OCR and reminders later if you want them.
Important
The button deploys the app, but you still need to run supabase/schema.sql in your Supabase
project (step 2) before logging in. Never share your SUPABASE_SERVICE_ROLE_KEY: it gives full
access to your database.
The complete, beginner-friendly walkthrough (exact clicks, optional features, updating and troubleshooting) is in docs/SELF-HOSTING.md. Every environment variable is explained in docs/ENVIRONMENT.md.
| Layer | Technology |
|---|---|
| App | TanStack Start (React 19, SSR, server functions) |
| Data & UI | TanStack Router & Query, Tailwind CSS v4, shadcn/ui (Radix), Recharts, zod |
| Database | Supabase PostgreSQL + private Storage (server-only) |
| Hosting | Vercel serverless (also runs on Lovable) |
| Automation | n8n + Telegram Bot API |
| AI | Any OpenAI-compatible API (receipt OCR and chat parsing) |
| Extras | Resend (email, optional), Sentry (errors, optional) |
| Quality | Vitest, Testing Library, ESLint, Prettier, GitHub Actions |
How it all fits together, with diagrams: docs/ARCHITECTURE.md.
src/
routes/ Pages (file-based) and the /api/public/n8n/* API used by n8n
components/ UI components (shadcn/ui in components/ui, lazy charts in components/charts)
lib/ Business logic: *.server.ts = server-only, *.functions.ts = server functions,
other files = pure, tested helpers
test/ Vitest test suites
supabase/ schema.sql — the whole database, in re-runnable sections v1–v13
n8n/ Importable n8n workflows: Telegram bot, schedules, error alerts, backup
docs/ Documentation
public/ PWA manifest, icons and self-hosted fonts
| Document | What it covers |
|---|---|
| Self-hosting guide | Step-by-step install: Supabase, Vercel, first login, optional features, updates |
| Environment variables | Reference for every setting |
| n8n, Telegram & email | Telegram bot, reminders, reports, weekly backup, Google Drive, Gmail SMTP, Resend |
| Architecture | Tech stack, directory layout, data flows, contributor rules |
| FAQ | Common questions and troubleshooting |
| Public demo | How the live demo works and how to run your own |
| n8n templates | What each workflow file does |
| Changelog | Notable changes |
| Contributing | How to propose changes |
| Security policy | How to report a vulnerability |
| Accessibility | Accessibility goals, supported environments, known gaps and how to report barriers |
You need Node.js 22 or newer (or Bun, which CI uses) and a Supabase project with the schema applied.
git clone https://github.com/<your-username>/dompetku.git
cd dompetku
npm install
cp .env.example .env # then fill in at least the five required variables
npm run dev # open the URL printed in the terminal| Command | What it does |
|---|---|
npm run dev |
Start the development server |
npm run build |
Production build |
npm run lint |
ESLint |
npm run typecheck |
TypeScript check |
npm test |
Run all tests once (npm run test:watch to keep watching) |
npm run format |
Format the code with Prettier |
npm run gen:types |
Regenerate database types (needs SUPABASE_PROJECT_ID and the Supabase CLI) |
More detail is in the local development section of the self-hosting guide.
Contributions are welcome, from typo fixes and translations to new features. Please read
CONTRIBUTING.md and the Code of Conduct first. Before
opening a pull request, make sure npm run lint, npm run typecheck, npm test and
npm run build all pass; CI runs the same checks. Contributor rules (schema sections, i18n,
privacy mode and more) are summarised in docs/ARCHITECTURE.md
and listed in full in AGENTS.md. For user-facing changes, also follow the
accessibility expectations.
Please do not open a public issue for security problems. See SECURITY.md for how to report a vulnerability privately.
Released under the MIT License. Copyright (c) 2026 Ilham Ramadhan.
Every instance also serves short, public privacy policy
(/privacy) and terms (/terms) pages written for a self-hosted deployment; they are linked from
the landing page footer. Edit src/components/legal/legal-content.ts (and the matching English
strings in src/lib/i18n.tsx) if your instance needs different wording.
- TanStack for Start, Router and Query
- Supabase for the database and storage
- shadcn/ui and Radix UI for UI components, Lucide for icons and Recharts for charts
- n8n for workflow automation
- Technology logos on the landing page from Simple Icons (CC0 1.0)
- Fonts Bricolage Grotesque, Figtree and JetBrains Mono, self-hosted via Fontsource under the SIL Open Font License 1.1 (license)
- Originally scaffolded with Lovable
If Dompetku is useful to you, please consider giving it a star. Feedback, ideas and bug reports are welcome in GitHub Issues.







