A local-first ledger and budget for Cayman bank statements.
Drop in the PDF statements your bank gives you; FinGraph reads every line, proves it against the statement's own balances, and shows where the money goes. Nothing leaves your computer.
Cayman banks don't offer live feeds to budgeting apps, so FinGraph works from the PDF statements you download once a month. A 5-pass scanner reads each statement and proves it against its own balances. Where a bank only gives a download (RBC's CSV or OFX), FinGraph imports that too, one account per account in the file, and holds it for you to check, since a download prints no opening balance to prove it with. Your rules, a directory of Cayman businesses and Smart Triage then sort the transactions. On top of that sit a budget, a forecast for the weeks between statements, and your net worth, in KYD or USD, across personal and business workspaces.
Everything lives in ~/.local/share/fingraph/: the ledger, kept copies of your statements and
backups. FinGraph goes online for two things only: once a day it asks GitHub whether a newer
release is out (Preferences → General turns it off), and, if you switch it on, it downloads daily
exchange rates (only currency codes and dates are sent). Your ledger never leaves the machine.
![]() |
![]() |
| A budget filled from what you actually spend | Every transaction, searchable, with inline categories |
![]() |
![]() |
| Every statement reconciled to the cent, gaps by month | Smart Triage: answer once per merchant |
Every screenshot here uses the built-in demo data (simulated statements for made-up accounts), never a real ledger.
Download the package for your distro from the latest release:
| Distro | Install |
|---|---|
| Ubuntu 26.04+, Debian 13 | sudo apt install ./fingraph_0.2.15-1_amd64.deb (use apt, not dpkg -i, so dependencies come too) |
| Fedora 42+ | sudo dnf install ./fingraph-0.2.15-1.x86_64.rpm |
| openSUSE Tumbleweed | sudo zypper install --allow-unsigned-rpm ./fingraph-0.2.15-1.x86_64.rpm |
| Arch | sudo pacman -S --needed git base-devel && git clone https://github.com/Stolly345/fingraph && cd fingraph/packaging/aur && makepkg -si |
All four are tested installing and starting in clean containers. You need GTK 4.14 and libadwaita 1.6 or newer, so Debian 12 and Ubuntu 24.04 are too old.
pdftotext(poppler) is required: it gives the scanner every word with its position. The packages pull it in.tesseractis recommended. It reads statements that are only pictures, such as redacted or scanned ones.
sudo apt install poppler-utils tesseract-ocr libgtk-4-dev libadwaita-1-dev
cargo run -p fingraph --releasePackages: cargo build --release, then cargo deb -p fingraph --no-build and
cargo generate-rpm -p crates/fingraph. For Arch, put the new version and the .deb's sha256 in
packaging/aur/PKGBUILD and run makepkg --printsrcinfo > .SRCINFO. Same-version .debs need
sudo apt install --reinstall …, so every release gets a new version number.
The first time it opens, Getting Started walks you through setup. After a welcome page, its steps are:
- Choose your workspaces.
- Download your statements from each bank's online banking.
- Put them in one folder, which FinGraph watches.
- Let FinGraph read them.
- Sort what it didn't recognise.
- Set up a budget, including your big yearly bills.
- Learn the monthly routine.
The guide stays in the main menu and remembers where you stopped. To explore without your own data, the empty Overview and the guide both offer Load Demo Data: a simulated year for a personal and a property-business workspace, across all five banks, in KYD and USD.
- Save last month's statements into the watched folder; FinGraph reads them when it opens. Or use Import Statements… in the main menu, or drop them on the Statements page.
- Answer anything it asks (see Importing statements), and anything waiting in To Review.
- Run Monthly Close on the Budget page.
- Between statements, Outlook shows where balances are heading and what's safe to spend.
Sidebar, in order:
| Page | Ctrl+ | What it shows |
|---|---|---|
| Overview | 1 | Ten headline cards in two rows (net cash flow for a year, a month and a fortnight, each measured as a 12-month average, the date range or the actual period; left to spend this month; savings rate; next big bill; cash runway; Age of Money; subscriptions; reconciliation), Big Bills Coming Up and Big Bills Over the Next 12 Months, and six charts; a Review banner while merchants wait for an answer |
| Net Worth | 2 | What you own and owe over time, goals, and debt payoff |
| Budget | 3 | This month against your plan, rollovers, non-monthly bills, watchlists, and where the money went |
| Outlook | 4 | Balances until the next statement, safe to spend, the month's bills, and Age of Money |
| Transactions | 5 | Every transaction: search, filter, edit, split, attach receipts |
| Combined Statement | 6 | Chosen accounts month by month with one running balance |
| Statements | 7 | Every statement read, its reconciliation, coverage by month, and anything waiting for approval |
| What Changed | 8 | Price rises, bill spikes, possible double charges, fees, and category drift |
| Subscriptions | 9 | Recurring charges and what they really cost a year |
Below the pages, Accounts lists each account with its last balance a statement confirmed (red when it's money owed). Click one to open that account's overview.
The main menu (☰) has Import Statements…, Reports & Export, Rules & Categories, Business Directory, Bank Profiles, Preferences (Ctrl+,), Getting Started and About.
ⓘ buttons. Every card on Overview, Budget, Outlook and Net Worth has an ⓘ next to its title. Hover over it to see how to read the card, or click to keep the explanation open.
The header shows only the controls the page uses: the date range, and KYD | USD. Ctrl+F searches transactions and Ctrl+O imports.
-
Banks: Butterfield, Scotiabank, Cayman National (CNB), RBC and the CICSA Credit Union.
-
Five passes:
- Find the bank.
- Find the columns.
- Read the rows.
- Check every running balance.
- Check that opening balance + transactions = closing balance.
Statements that are only pictures are read with OCR.
-
Declared layouts. Each bank profile writes down its layout: whether the amount comes before or after the description, the bank's own summary labels, and which account types have been checked against a real statement. A statement that breaks the layout gets a note naming the rule. This catches statements that add up but are still wrong.
-
Unreadable lines. Anything the scanner can't read is shown in the Scan Report, with a one-click Convert to turn a skipped line into a transaction.
- New accounts are asked about ("Is this your account?"), never added silently. Accounts are matched on bank + last four digits + currency.
- Repeat periods. A second file for an account and period you already have asks before replacing it, so the same statement can't count twice.
- Statements held for review. These stay on the Statements page as Waiting for review, and
their transactions count nowhere until you Approve them:
- statements that don't reconcile
- statements read by OCR
- the first statement of each account type from a bank
- statements that break the bank's layout
- Re-reading. Rescan All (Preferences, or Rules & Categories) re-reads every kept statement. Your edits are kept, and it backs up first.
The steps are tried in this order:
- Your rules. A rule can be limited to an amount (only when CI$ 125.00) or match a reference number.
- Transfers between your accounts and credit card payments.
- A directory of 1,270 Cayman businesses and online services, plus the US and Canadian stores, restaurants, airlines and hotels people from Cayman use when they travel. It only files money going out: a deposit from a business in it (pay from an airline, a refund) is asked about instead.
- Keyword guesses (MARKET → groceries, DIGITAL → subscriptions).
- Whatever's left goes to To Review. There's one card per merchant with every charge listed; answer it once and the answer is applied to past and future statements. Suggestions come from how you filed similar charges.
- Workspaces: Personal, Business, Rental and so on, or a consolidated view across any set.
- Business expenses: a business-expense flag on transactions.
- Splits: for example, the rental's share of one receipt.
- Business owes you: cards track personal money spent on the business until it's paid back.
- Projects (tags): total landed cost, including freight and customs duty.
-
Setting it up:
- Monthly amounts per category, filled from what you usually spend (the median of the last six months).
- Setup wizard (7 steps): pay cycle, gross pay and deductions; other income and loan payments; big yearly bills; a budgeting method; spending; savings and paying down debt; and which account does what (pay, bills, everyday spending, big-bill money, savings, debt). It does the arithmetic, including how much flexible spending must shrink to reach the goal.
- Budgeting methods: 50/30/20, 70/20/10 (the 10% pays down cards and loans until they're cleared, then it's saved), 80/20 pay yourself first (one weekly allowance), zero-based (every dollar gets a job before you can save), or your own numbers. The method step shows what each one means with your figures. Needs are kept at what they usually cost and wants are trimmed to fit, so mark each category a Need or a Want. Your pension counts toward the savings share.
- Cancelled something? Mark it Cancelled in the setup or on the Subscriptions page (click the amount). It stops counting, and comes back by itself if it ever charges again.
- More than one car? The + on a big bill adds another like it (a motorcycle's insurance, a second car's licence).
- Big yearly bills: the setup asks about the costs a normal month never shows. These include car and home insurance, HOA or strata fees, vehicle licence, school terms, memberships, travel, and Christmas. Bills seen in your statements are filled in. Each one gets a monthly set-aside, which comes out of what you can save.
-
During the month:
- Alerts when a category is over budget, or 85% used early in the month.
- Fixed vs variable expenses, and a 12-month savings projection, both on budget and on trend.
-
Changing it:
- Rollovers: leftovers carry over to the next month.
- Money moves cover an overspend.
- Set-asides for yearly and quarterly bills (Budget → Non-Monthly Bills).
- Watchlists cap a merchant (Amazon CI$ 150).
-
Monthly Close takes you through the month once its statements are in. It checks they're all there, sorts what's new, settles the budget, ticks off the regular bills (paid, missed, or not on a statement yet), updates goals, and ends with a summary and a Report Card to save or print.
-
Take it with you (Budget → Budget Plan):
- Budget Plan (PDF, save or print). Page 1 has a tick-box payday checklist (move this much to each account, leave this much), the bills due in the next month and big bills in the next three, weekly spending limits, and where your savings lead. The detail pages cover every category against what it usually costs, every big bill with what should be saved by now, the arithmetic, and what cancelling saved you.
- Report Card (PDF) for a month: saved, spent and income against the plan, how the month scored against your method (needs, wants and saving as shares of what came in), what to do next, and every category's budget against what you spent.
- Calendar file (.ics) of the next 12 months. It has your paydays with the checklist, every regular bill with a reminder three days before, and big bills two weeks before. Open it in any calendar app. Importing a newer one updates the events rather than doubling them.
- Outlook covers the weeks before the next statement arrives:
- each bank account's estimated balance until then
- the lowest point ahead
- safe to spend per day
- the month's bills
- Age of Money: how long money sits before it's spent
- Net Worth:
- statement balances plus assets and debts you value by hand, over time
- goals (save up, or pay a card down) with on-track status
- debt payoff: highest rate first vs smallest balance first, with rates read from your interest charges
![]() |
![]() |
| Outlook: balances until the next statement | Net Worth: what you own and owe, over time |
- Receipts: drop a PDF or photo on a transaction.
- Exports: CSV, QIF, OFX 1.0.2, QuickBooks QBO per account, a P&L, and a P&L with every receipt for your accountant.
Money is rust_decimal::Decimal end to end, stored as the exact string plus integer cents next to
its currency. The KYD/USD peg (1 KYD = 1.20 USD) is the default rate; a rate printed on a statement
wins for that transaction.
| Bank | Checked against | Status |
|---|---|---|
| Scotiabank | 34 real statements: chequing, Amex, Mastercard; KYD and USD | Reconciles to the cent, layout verified |
| Cayman National | 1 real (redacted, third-party) savings statement, read by OCR | 95 of 95 transactions, reconciles |
| Butterfield, RBC, CICSA | Simulated layouts only | Untested on a real statement |
For the three untested banks, the first statement of each account type is held for review. To bring one up to accuracy:
- Use Bank Profiles → Test PDF. To pass, the statement must be recognised as the right bank, reconcile to the cent, and have no layout notes.
- Use Save Layout Sample…. It keeps every word's position, the dates, amounts and headings,
and turns names, merchants and account numbers into
xxxand000. Samples go incrates/fingraph-core/tests/fixtures/private/, which git ignores, and become tests. - Approve the first import after comparing it with the PDF.
| Path | What |
|---|---|
crates/fingraph-core |
No GUI. Scanner (parser/: profiles, multipass, dates, reconcile, OCR), ledger and import rules (db.rs), rules and triage (rules.rs), learning (learn.rs), directory (merchants.rs, data/merchants.tsv), splits, reimbursements, attachments and coverage (workflows.rs), insights.rs, budget.rs, outlook.rs, wealth.rs, exports, preferences, demo statements |
crates/fingraph |
The app, one file per page or dialog: dashboard, wealth, budget, close, outlook, transactions, statement, statements, changes, rules, review, account, export, directory, profiles, preferences, guide, wizard, split, owed, txedit. Cairo charts are in charts.rs; the shell, sidebar, menu and shared helpers are in main.rs |
packaging/ |
Desktop entry (PDF/CSV/OFX "Open With"), icon, Arch PKGBUILD |
Add one line per business to crates/fingraph-core/data/merchants.tsv:
KEYWORDS<TAB>Name<TAB>Category[<TAB>fallback]
HOME GAS|HOMEGAS Home Gas Gas
- Matching: keywords match whole words. Punctuation and apostrophes are ignored, and a trailing S is allowed. The earliest match in the statement text wins, then the longest.
- Generic words: never add a generic word on its own.
fallback: marks a payment platform (Google, Apple) that gives way to the service it billed.
Sharing what you've taught it. Main menu → Share Merchant Hints… lists the shops you categorized that the directory didn't know (or got wrong), each with the category you chose. It leaves out amounts, dates, accounts, balances, income, transfers, and payments by transfer, cheque or deposit, which name people. Untick anything you'd rather keep and save the file. FinGraph never sends it: attach it to a new issue and the shops go into the next release's directory.
Rebuild after editing. To browse the directory in the app, use main menu → Business Directory. It shows search, how often each business appears in your statements, keyword guesses, and Override… to make your own rule. For a one-off, answering in To Review or adding a rule is quicker and always wins.
cargo run -p fingraph-core --example scan -- statement.pdf # scanner report for one PDF
cargo run -p fingraph-core --example ledger -- reapply # re-run rules, card payments, directory
cargo run -p fingraph-core --example ledger -- rescan # re-read every kept statement
cargo run -p fingraph-core --example ledger -- cards # recognise credit card payments
cargo run -p fingraph-core --example ledger -- reset # forget learned rules and categoriesClose the app first, and back up from Preferences → Data. Run from the app instead, Rescan and Reset back up on their own.
cargo test --workspace # 70 tests: banks and layouts, OCR, import rules, ledger, rules, directory, budget, insights, exports
cargo test -p fingraph-core -- --ignored real # also scans your own statements in ~/.local/share/fingraph/documents
cargo test -p fingraph-core -- --ignored private # layout samples in tests/fixtures/private/
cargo clippy --workspace --all-targetsDebug builds can screenshot any page without a person at the keyboard. For example:
FINGRAPH_DB=/tmp/x.db FINGRAPH_DEMO=1 FINGRAPH_VIEW=budget FINGRAPH_SHOT=out.png cargo run -p fingraphThat uses a scratch ledger. Never point FINGRAPH_DB at your real one.
The README screenshots in docs/screenshots/ were taken this way from a fresh demo ledger, with
Fill From My Spending pressed on Budget (FINGRAPH_CLICK="Fill From My Spending") so the budget
has something in it.
MIT or Apache-2.0, at your option (LICENSE-MIT, LICENSE-APACHE).







