1
Budget Tracker OneFile

Where am I right now?

Your dashboard is ready when you are.

Add a transaction, import a bank statement, or load demo data to explore. Your information stays on this device — no account, no sync.

Quick Add
Type
How much?
Which account?
Category
What was it for?
When?
Spending by Category
Last 6 Months
Category Progress (this period)
Date Range
Type
Account
Category
Search
Date Type Category / Note Amount
Accounts
Categories & Monthly Limits
Recurring Rules
Categorisation Rules
Report Builder

Generate a summary over any date range. Live preview below — the PDF export captures exactly what you see.

Date Range
Title (optional)
Notes (optional, included in the report)
Formatting
Currency Symbol
Position
Decimals
Decimal Separator
Thousands Separator
Date Format
Budget Period
Start of Month Day the budget period begins (1–28). Lets you align with your pay cycle.
Backup & Restore
Categorisation Starter Pack

Load a bundled set of 67 categorisation rules for common South African merchants and bank-fee patterns (Woolworths, Engen, Netflix, MTN, bank charges, IB transfers, and more). Existing rules are preserved — duplicates are skipped.

Reset

Wipes all settings, accounts, categories, and transactions. Cannot be undone. Export a backup first.

Quick Start

Five steps from a fresh install to a dashboard that mirrors your real money. Everything you set is stored in this browser and picks up exactly where you left off next time.

  1. Add your accountsBudget tab → Accounts. Add the cheque account, savings, credit cards. Rename or deactivate the default "Cash" account. Opening balance is what you have right now; opening date is today.
  2. Tune the categoriesBudget tab → Categories. Keep what you use, delete what you don't, set monthly limits where it matters (Groceries, Eating Out, Fuel). Limits drive the dashboard progress bars and alerts.
  3. Set your period startSettings → Budget Period. Align it to your pay date if it isn't the 1st of the month. The whole dashboard shifts to that cycle.
  4. Capture transactionsDashboard → Quick Add for fast income/expense entry, or Transactions tab → New for transfers and edits with descriptions.
  5. Read the dashboardKPIs at the top, account strip below, category progress with green / amber / red, two charts, and live alerts when categories cross 90% or balances pile up.
FAQ
Data & privacy
Where is my data stored?
In this browser's localStorage, on this device. Nothing is sent to a server. Clearing browser site data wipes it — Export Full Backup first if you care about the data.
How do I move my data to another machine or browser?
Settings → Export Full Backup (JSON) on the source machine. On the new one, Settings → Import JSON and pick the file. Replaces your current state with the backup.
Why can't I delete an account?
Account records are permanent — only deactivate. This protects months of categorised history from a wrong "delete this account" click. To wipe an account's footprint, deactivate it and bulk-delete its transactions from the Transactions tab.
I captured transactions against "Cash" before adding my real account. Now what?
Two paths. Either rename "Cash" to your real account name (Budget tab → edit) — zero migration if those were really from that account. Or filter the Transactions tab by Cash, select all, click Reassign account, and pick the destination.
Accounts & transfers
How do credit cards work?
A credit card is an account with a negative balance — spending makes it more negative ("more owed"). Pay it off with a transfer from your cheque account to the credit card account; both balances move toward zero. The dashboard displays liability balances as "R5,200 owed" rather than as raw negatives.
Why aren't transfers in the Income or Expense KPIs?
Two paths handle transfers correctly. (1) Manual entry: pick the Transfer type when adding a transaction — one record adjusts both accounts and the row is excluded from gross totals (grey "Transfer" pill in the ledger). (2) CSV import: bank statements expose transfers as paired income+expense rows on two accounts. Categorise the outgoing leg as Transfer Out and the incoming leg as Transfer In — both ship as default categories with an excludeFromTotals flag, so account balances update normally but the rows skip Income / Expense KPIs and the spending pie.
How do I handle bank transfers between my own accounts at import?
Bank statements show transfers as paired rows: an outgoing (expense) on the source account, an incoming (income) on the destination. Make a categorisation rule for each side — e.g. IB TRANSFER FROM → Transfer In, IB TRANSFER TO → Transfer Out — with the corresponding Type Constraint (income or expense) so the rule only fires on the right leg. Future imports auto-apply. The Transfer In / Transfer Out categories ship as defaults; if your live ledger predates them, add them manually before importing the rules.
Budgets & recurring
Why does my budget period start on a different day?
Settings → Budget Period → Start of Month. Set it to your pay date (e.g. 25) and the whole dashboard recomputes — Income/Expense KPIs, category usage, the trend line. Range is 1–28 to dodge month-end edge cases.
How do recurring rules work?
Budget tab → Recurring Rules → + Add Rule. Set label, type, amount, account, category, and day of month (1–28). The rule auto-creates a transaction every month on app open. Auto-created entries show an Auto badge in the Transactions list and have Origin = "recurring". Safeguards: idempotent (one fire per due date even on multiple opens), absence-summary banner if you've been away (≥ 2 created in one open), next-due date shown on every rule, and a "deactivate this?" suggestion if you delete its transactions often.
Importing & categorising
How does CSV import work?
Transactions tab → Import CSV. Three steps: Upload (file + account + optional saved profile), Map columns (date column + format, amount column with sign convention or separate debit/credit columns, description, optional reference; live preview of parsed rows), Review (every row tagged Duplicate / Categorised / Rule / Uncategorised, override any per-row, pick a category for uncategorised rows, then Import). Save the mapping as a profile (e.g. "FNB Cheque") so future imports skip straight to Review. Auto-detect runs on upload: skip-row counts pre-fill from where the first and last date-bearing rows are; the column dropdowns and date format pre-fill by scoring each column for date-likeness, amount-likeness, and text-likeness. Statements with a separate balance column (FNB) are handled — the column with negative values wins amount. Statements with debit + credit pairs are detected as such. Adjust any dropdown if the live preview looks wrong; saved profiles always override auto-detect on re-import.
My imported transactions aren't changing my balance. Why?
Each account has an Opening Date that gates which transactions count toward its balance. If the opening date is later than the import dates, those rows are filtered out of accountBalance(). The import wizard's Review step warns when this happens and offers a one-click Backdate to <earliest tx date> action. If you missed it: Budget → Accounts → edit the account, set the Opening Date to one day before your earliest imported transaction, save. The dashboard recomputes immediately.
What is the SA starter rules pack?
A bundled set of ~67 categorisation rules covering common South African merchants and bank-fee patterns — Woolworths, Engen, Netflix, MTN, Discovery, Outsurance, Sasol, Takealot, bank charges, IB transfers, and more. Load it via the Dashboard banner that appears on first run (if you have no rules), the inline button in Budget → Categorisation Rules when the list is empty, or anytime from Settings → Categorisation Starter Pack. Existing rules are preserved — duplicates are skipped on load. All insurance brands land in "Insurance (other)" by default; re-categorise per-rule if you'd prefer (e.g.) Discovery → Health.
How does auto-categorisation learn?
Two ways. (1) Add rules manually in Budget → Categorisation Rules — pattern (contains / starts_with / equals / regex) maps to a category. (2) When you edit a transaction and change its category, a non-blocking toast offers to make a rule from the description. Each rule can also carry an optional Description override — useful when the bank text is opaque (e.g. APPLE.COM/CORKClash of Clans subscription); on import the override fills the row's description so it's instantly readable. Lower priority numbers win when multiple rules match. Rules apply during CSV import and you can manage / deactivate any of them later.
How do I apply a new rule to transactions I already imported?
Two paths. (1) Per-rule: open Budget → Categorisation Rules → click the rule. The "Apply to existing transactions" section has two actions — Fill empty fields (safe, only updates blanks; preserves manual edits) or Overwrite all matching (replaces description + category on every match). (2) Ledger-wide: Budget → Categorisation Rules → Re-apply… runs every active rule against every transaction, in priority order, with the same two modes. Useful after editing many rules at once.
How do I find a specific rule when I have 100+?
Every Budget grid (Accounts, Categories, Recurring Rules, Categorisation Rules) has a search bar above the list. Categorisation Rules searches across pattern, description override, and category name — so typing Subscriptions finds every rule pointing at that category. Search is session-only (resets on reload) and snaps the active page back to 1.
The dashboard says "X transactions uncategorised this period" — what should I do?
Click the Review link in the alert. The Transactions tab opens filtered to uncategorised rows in the current period. Click any row (or its pencil icon) to assign a category. If the same merchant text comes up repeatedly, accept the toast that pops up after re-categorising — it creates a rule so future imports auto-bucket. Or pre-empt: Budget → Categorisation Rules → + Add Rule.
Reports
What's the Reports tab for?
Generate a summary over any date range — this period, last 3/6/12 periods, year to date, or a custom from/to. The live preview shows KPIs (Income, Expenses, Net, Budget Used, all scaled to the range), the spending pie + income/expense trend, account balances at the end of the range, a category breakdown, and the full transaction list. Click Download PDF in the panel header to save what you see — the PDF captures the same content (charts as images, tables paginate automatically). The PDF library lazy-loads on first use, so the first export needs an internet connection; subsequent exports work offline.
Offline, mobile & updates
Does it work offline?
Yes, after the first load. Everything runs in your browser. Charts and PDF reports use libraries loaded from a CDN on first use, so the first run that needs them requires an internet connection; after that the app works offline.
Which browsers are supported?
Current versions of Chrome, Edge, Firefox, and Safari. Chrome and Edge produce the cleanest PDF reports.
Does it work on phone or tablet?
Yes — visit https://azad.co.za/onefile/budget-tracker/app/ in Safari (iOS) or Chrome (Android) and add to home screen. Same tool, runs offline after first load.
The app seems stale. How do I update?
When a new version deploys, the next launch shows a "New version available" toast at the bottom of the screen — tap Reload and the app refreshes against the new bundle. iPadOS occasionally needs a second close-and-reopen for the service worker to pick up the update; if the toast doesn't appear after the first relaunch, swipe up from the App Switcher to fully close the PWA and reopen.
Keyboard shortcuts
Keyboard shortcuts?
Press 16 to switch tabs (Dashboard, Transactions, Budget, Reports, Settings, Help) when you're not typing in a field. Esc closes any open modal.
Roadmap
What's coming next?
Weekly / yearly recurring frequencies. Multi-currency, hierarchical category groups, rollover budgeting, savings goals, year-over-year reports, and net-worth tracking are tier 2.