Quick answers for everyday users and developers. Installation: SELF-HOSTING.md. Settings: ENVIRONMENT.md. Bot and automation: N8N.md.
What is Dompetku?
A self-hosted personal finance tracker: income, expenses, transfers, debts/pay-later, subscriptions (IDR and USD), budgets, savings goals, gold, receivables, recurring transactions and reports — plus an optional Telegram bot and receipt OCR. You run your own copy; there is no central service.
Is my data private?
Yes. Your data lives in your own Supabase project, and the website runs in your own Vercel account. The project author has no access to either.
- The browser never talks to the database. Only the server does, using your secret key.
- Row-level security is on with no policies, so the public Supabase keys can read nothing.
- Receipt photos are in a private Storage bucket and shown via links that expire after a few minutes.
- Login uses a signed, httpOnly cookie; you can add a 6-digit authenticator code (2FA).
- If you enable OCR, receipt photos and ambiguous chat messages are sent to the AI provider you configured — check that provider's data policy.
How much does it cost?
Usually nothing. GitHub, Supabase and Vercel free tiers are enough for one person. Optional extras: n8n is free if you self-host it (n8n Cloud is paid), Telegram is free, Resend and Sentry have free tiers, and AI OCR costs from zero (Google AI Studio free tier) to a few cents per month on paid providers.
Do I need to know how to code?
No. The self-hosting guide uses only web dashboards (GitHub, Supabase, Vercel) and copy-paste. A terminal is only needed for the optional local-development section — and even generating secrets can be done with a password manager.
Can several people use it (multi-user)?
Yes, for a family (schema v17 + v18). The APP_USERNAME login is always the owner and sees everything. In Settings → Pengguna the owner adds members with a temporary password (they must change it at first login) and picks, per wallet, View (balance, transactions, account report) or Manage (also record/edit/delete; transfers need Manage on both wallets). Members only get the dashboard, transactions, accounts and reports, computed over their wallets; gold, receivables, goals, debts, budgets, settings, the bot and the n8n API stay owner-only. Two-step login (2FA) currently protects the owner only — member 2FA is future work. Without v18, it stays a single-user app exactly as before.
Can I use it without Telegram or n8n?
Yes. The web app is complete on its own: manual entry, receipt OCR in the browser (if you set an AI key), CSV import, reports, reminders page, manual backup/restore. Telegram, n8n, Resend and Sentry are all optional add-ons.
Does it work on my phone? Can I install it?
Yes, the layout is mobile-friendly. Open your site in the phone browser → Add to Home Screen to get an app icon and full-screen view. It needs an internet connection (there is no offline mode).
Which languages are available?
Indonesian and English. Use the ID/EN switch in the sidebar (header on mobile); the choice is stored in your browser. The Telegram bot replies in Indonesian.
Can I change the currency?
Each account, transaction and subscription is IDR or USD (enforced by the database). Totals and net worth are shown in IDR, converting USD with the daily exchange rate (from open.er-api.com; FALLBACK_USD_IDR is used only if that fails before any rate is stored). Other currencies are not supported out of the box — adding one means changing the database constraints and the formatting code.
How do I change the time zone?
Set APP_TIMEZONE in Vercel (an IANA name such as Asia/Jakarta, Asia/Makassar, Asia/Jayapura, Europe/London) and redeploy. It decides what "today" means for new transactions, reminders, recurring items and the bot's "today" report. Default is Asia/Jakarta. If you use n8n, set the same zone there (GENERIC_TIMEZONE, TZ) so scheduled jobs line up.
Why is an expense called "Biaya Admin", "Piutang" or "Emas" created automatically?
These are linked transactions so balances stay correct: transfer/top-up/monthly account fees go to Biaya Admin, money lent or repaid through linked receivables to Piutang, and gold bought/sold from an account to Emas. Net worth adds outstanding receivables and gold value back, so nothing is counted twice.
Kantong vs Budget: what is the difference?
A Budget (Budget page) limits spending per category across all wallets, e.g. "Makan & Minuman at most 2 juta a month", with 80%/100% alerts. A Kantong (pocket, schema v19) splits the money inside one wallet, e.g. Mandiri → Makan 500rb and Transport 250rb, Cash → Parkir 100rb, without creating fake wallets. You choose the pocket on each transaction (or #makan in the bot); the wallet page shows what is left per pocket and how much of the balance is still unallocated (negative when you allocated more than the wallet holds). Monthly pockets start over each month; running pockets never reset. You get an alert when a pocket drops to its warning threshold or runs out. Both can be used together: a transaction can count toward a budget (its category) and a pocket (its wallet) at the same time.
How do I back up and restore?
- Download: Settings → Data backup → Download backup (JSON) — one file with all tables.
- Restore: Settings → Restore from backup → choose the file (up to 20 MB). Merge (default) updates/inserts by ID; Replace all (type the confirmation word) wipes current data first. Large backups are uploaded in chunks, so Vercel's 4.5 MB request limit is not a problem.
- Automatic: the n8n workflow
n8n/05-dompetku-backup.jsonsaves a weekly backup to Google Drive (or email). See N8N.md. - Supabase's own daily backups are only on paid plans, so keep your own copies.
Can I import data from another app or a spreadsheet?
Yes: Transactions → Import CSV. Columns: date (YYYY-MM-DD or DD/MM/YYYY), type (income/expense), amount, category, account, notes, currency (IDR/USD). You get a preview; invalid rows and duplicates are skipped, and new categories/accounts are only created if you tick the option. Yearly reports can be exported as CSV from Reports.
How do I delete everything?
Options, from gentle to final:
- Start fresh but keep the app: restore a backup with Replace all — or, in Supabase Table Editor, delete rows from the tables you want to empty.
- Delete all data permanently: Supabase → Project Settings → General → Delete project. This removes the database and receipt photos. Then delete the Vercel project (Settings → General → Delete) and, if you like, your GitHub fork (Settings → Danger Zone).
Download a backup first if you might want the data later.
My Supabase project was "paused". What happened?
On the free plan, Supabase pauses projects that have had no activity for about a week. While paused, the app shows database errors. Your data is not deleted.
- Unpause: Supabase dashboard → your project → Restore project (or Resume). It takes a few minutes. Paused free projects can be restored for a limited time (currently 90 days), so don't wait too long.
- Avoid it: use the app regularly, or let n8n do it for you — the scheduled workflow
02-dompetku-jadwal.jsoncalls the app (which queries the database) every day, which counts as activity. Upgrading to a paid Supabase plan also removes pausing.
Someone might know my password. What do I do?
With schema v17, open Profile → Change password: the new password is stored as a hash and every other device is signed out immediately. Without v17, change APP_PASSWORD and SESSION_SECRET in Vercel (changing the secret logs out every existing session), then redeploy. Consider enabling 2FA (APP_TOTP_SECRET, see SELF-HOSTING §5.5). If you think the Supabase secret key leaked, rotate it in Supabase and update SUPABASE_SERVICE_ROLE_KEY.
I changed my password in the app and forgot it.
Your hosting account is the recovery path: in Vercel set APP_PASSWORD_RESET=true → redeploy → log in with APP_USERNAME / APP_PASSWORD from the env → Profile → Change password → remove APP_PASSWORD_RESET → redeploy. While the switch is on the stored hash is ignored, so don't leave it on. See ENVIRONMENT.md.
A family member forgot their password or lost their phone.
As the owner, open Settings → Pengguna → the key icon → set a new temporary password. All of that member's sessions end immediately, and they must choose a new password at their next login. To block someone at once, switch them to inactive or delete them; their recorded transactions stay.
I lost my phone with the authenticator app.
Your Vercel account is the recovery path: delete (or replace) APP_TOTP_SECRET in Vercel → redeploy → log in with just your password → enroll a new key.
Can I use the bot in a Telegram group?
Yes. Add the bot to the group, disable its privacy mode in @BotFather (/setprivacy → Disable, then remove and re-add the bot), and put the group's chat ID (negative, supergroups start with -100) in BOT_ALLOWED_CHAT_IDS. In the group the bot only reacts to @yourbot mentions, replies to its own messages and /commands; everything else is ignored without using AI quota. Anyone in an allow-listed group can press the preview buttons. n8n users must re-import template 01. Details: N8N.md.
Can strangers use my Telegram bot?
No. The bot fails closed: only chat IDs in BOT_ALLOWED_CHAT_IDS are served, and an empty list refuses everyone before touching the database. n8n adds a first filter with TELEGRAM_ALLOWED_CHAT_IDS. All automation endpoints also require your N8N_API_KEY.
What is privacy mode?
The eye icon (or Shift + H) hides every amount, balance, chart value and gold weight on that device — useful in public or when screen-sharing. It's a per-device display setting, not encryption; percentages and counts stay visible, and exports and the bot are not masked.
Do I need an AI key? Which provider should I use?
Only for receipt OCR and understanding ambiguous chat messages. Simple messages like "kopi 25rb" are parsed without AI. Any OpenAI-compatible endpoint works; Google Gemini (gemini-2.5-flash) via AI Studio is a good free starting point. Examples: SELF-HOSTING §6.2. Set BOT_TEXT_AI=never to use zero AI tokens for chat.
Can the AI create wrong categories or save things without asking?
No. AI output is snapped onto your existing categories and accounts (falling back to "Lainnya"); it never creates new ones. Chat messages and receipt photos are shown as a preview and saved only when you tap ✅ — double taps and retries don't create duplicates, and /undo removes the last bot transaction. The exceptions are /bayar <name> (records a subscription or installment payment) and /tarik <amount> dari <account> (a cash withdrawal, which creates a cash account named Tunai if you have none): these are recorded immediately, without a preview.
How do I change the description ("Ket") of a bot preview, e.g. after a receipt photo?
Tap ✏️ Keterangan under the preview, then send the new description as a normal message (max 200 characters), e.g. dini bayar baju. The bot replies with an updated preview; tap ✅ to save. The amount, merchant, items and receipt photo stay as they were. Send /batal or tap ⬅️ Kembali to cancel; the bot stops waiting after 10 minutes, and any other button or command also ends the edit. This works for receipt, AI and quick text previews alike and needs no n8n change.
Does it support WhatsApp?
Not out of the box. The bot endpoint (POST /api/public/n8n/bot) returns plain text plus Telegram-style buttons, and the provided n8n workflows target Telegram. Simpler endpoints (/message, /ocr, /command, /reminders) return a ready-to-send message, so a WhatsApp flow in n8n is possible but you'd build it yourself.
What is the tech stack?
TanStack Start (React 19, server functions) built with Vite and Nitro, Tailwind CSS + shadcn/ui, Supabase (Postgres + Storage) via a server-only client, deployed on Vercel (or Lovable). Tests use Vitest. Details: ARCHITECTURE.md.
Can I host somewhere other than Vercel?
The build targets Vercel when the VERCEL variable is set and Lovable's runtime otherwise (vite.config.ts). Other hosts (Netlify, Cloudflare, a Node server/Docker) would need a different Nitro preset in vite.config.ts — possible, but not tested or documented here. Contributions welcome.
Do I have to re-run the database schema after updating?
Yes, it's the safe habit: after syncing your fork, paste the latest supabase/schema.sql into the Supabase SQL Editor and run it. The file is idempotent — it only adds what is missing and never deletes data. Until a new section is run, related features show a hint and the rest of the app keeps working.
Why is the app slow?
Almost always a region mismatch: the Vercel function region (vercel.json → regions, default sin1 Singapore) must be close to your Supabase region. Also run the full schema — section v9 moves report sums into Postgres, which makes dashboards faster.
How do I contribute or report a bug?
See CONTRIBUTING.md. For security issues, follow SECURITY.md instead of opening a public issue. Never paste keys, URLs of your instance, or personal financial data into issues.