Import a whole folder of statements in one go (FIBR-0085)
Pick several statement files at once — a year of monthly PDFs, a mix of
CSV, OFX and PDF, whatever you have — and finbreak works through them
without stopping to ask at each one. Anything it genuinely cannot get
past, it asks for up front: passwords for locked PDFs, and the column
layout for a spreadsheet it has not seen before. After that it runs on
its own.
Then it shows you one screen listing every file: where each one is
going, how many transactions are new, how many are duplicates you
already have, and how many lines it could not read. You set the account
for anything it could not work out itself, and nothing is written until
you press Import all. Files it already has are marked "already imported"
rather than added twice, and a file that fails is reported with the
reason and skipped — it never stops the rest.
Picking a single file works exactly as it always did.
Statements now file themselves under the right account (FIBR-0086)
When you import a statement, finbreak reads the account number printed
on it and pre-selects the matching account for you, with a line saying
why it chose that one. If it is an account finbreak has never seen, it
offers to create it, pre-filled from the statement. You can always
change the choice, and nothing is imported until you press Import.
Where it cannot be sure, it does not guess: a statement matching more
than one account, or carrying no readable number, leaves the choice
exactly where you set it and says why it could not decide.
Credit-card statements are deliberately left alone. The number they
print under "account number" is the account that PAYS the card, not the
card itself — so reading it would file every card statement under your
current account.
The dashboard now tells you what your month did, in a sentence (FIBR-0231)
A short line at the top of Home says in plain words what happened to
your money — "September cost you R2,340 more than your usual month.
Most of it was one thing — Vet, R1,900 more than usual." — instead of
leaving you to work it out from the charts. "Your usual month" is the
three months before it, compared like for like.
It is deliberately quiet. When the month is ordinary it says so in a
few words. When there isn't enough history to know what usual means,
when the month hasn't happened yet, or when it holds no spending at
all, it says nothing rather than guessing. Mid-month it says "so far"
and keeps that qualifier in every sentence, so a partial month never
reads as a finished one.
Two things it will not do. It never blames a routine bill for a month
it did not move: the cause is a merchant's spending above that
merchant's own normal, so your rent — identical every month — explains
nothing and is never named. And it never tells you a month was better
than normal when the arithmetic says otherwise; the "take that out"
sentence is chosen by what is actually left over, not by which
direction the month moved.
Year periods render nothing — that needs a year-over-year comparison,
which is its own feature.
Delete several statements at once, and a Delete all button (FIBR-0202)
The Statements tab takes a plural selection too, and a new Delete all clears every recorded import. The warning message states truthfully what the batch will destroy: the obvious way to build it would have said nothing is permanently removed while in fact destroying transactions. Change account still works on one statement at a time, and deleting a single statement reads exactly as it did before.
Confirm or reject several suggested transfers at once (FIBR-0201)
The Transfers tab's suggested list now takes a plural selection — click rows to tick them in or out, then Confirm or Reject the lot. Trusting eight of twelve suggestions is one click, not eight. If two of the rows you picked share a transaction only one can be confirmed, and the status line now says so rather than quietly reporting a smaller number.
Standard Bank statements now tell you when a line couldn't be read (FIBR-0252)
If a line on a Standard Bank statement could not be read — a waived fee
printed as 0.00, a garbled date — finbreak used to throw that fact away.
It would tell you "53 added" with no hint that anything had been skipped.
Now the skipped line is counted and shown: it appears in the import
preview as an Error row, in its right place among the others, and the
summary line counts it. When you import a folder of statements at once,
the review screen's Errors column shows the count per file instead of
always reading blank. Nothing about which transactions import has
changed — the same rows land, with the same totals; you are simply told
what didn't.
This affected every Standard Bank statement layout. CSV and OFX imports
already reported unreadable lines this way.
Standard Bank PDF import: a statement whose opening or closing balance is too large to store is now refused with a message instead of crashing the import (FIBR-0224)
A crafted statement printing balances beyond the storage limit could
reconcile against itself and so clear every integrity check, then fail
at the final save step with an error the import wizard could not show.
Both balance figures are now checked where they are converted — on
every statement layout, including the one that derives its closing
balance from its printed column totals.
An OFX file with an unusable closing balance is reported, not a silent dead end (FIBR-0223)
A <LEDGERBAL> amount too large to store used to kill the import
step with no message and no rows — either while reading the file or,
for a slightly smaller figure, at the moment you pressed Import.
Both now say so: "this OFX file's closing balance is not a usable
amount".
Typing a huge number like 1e999999 into the Add-transaction Amount field no longer kills the dialog (FIBR-0222)
The value overflowed the decimal scaling one step before the 64-bit
size check could reject it, and that failure was a class the dialog
did not catch. It now shows "amount is too large to store", like
every other rejected amount.
Manual entry now accepts an amount written the way your computer writes numbers (FIBR-0219)
If your system writes numbers the European way — 1.234,56 — you can now
type an amount back exactly as finbreak displays it. The plain 12.34 form
keeps working everywhere, so nothing you type today stops working.
When a typed number could genuinely mean two different things, finbreak
asks instead of guessing: 1,500 might be one thousand five hundred or
one and a half, and guessing wrong on a money field is off by a factor of a
thousand. The message names both readings in your own number format. One
consequence worth knowing: on a comma-decimal system, a three-digit tail
after a dot (1.500, 1234.500) is now refused rather than stored as 1.5 —
type 1,50, 1.50 or 1500 instead.
Importing a bank statement is unchanged and stays independent of your
desktop's language, so the same file imports to the same numbers on every
machine.
A Standard Bank current-account statement that imported nothing at all now imports (FIBR-0190)
Standard Bank prints its current-account statements in more than one
layout. One of them heads the money-out column Payments and money-in
Deposits — and finbreak recognised neither word, so it fell back to
its general-purpose PDF reader, which could not tell the columns apart on
a page with no ruled lines. The result was an import that offered zero
transactions out of a hundred and eighty-two.
finbreak now reads that layout directly. It also checks its own work
against the Payments and Deposits totals the statement prints on its last
page: if the two disagree, the import is refused with an explanation
rather than silently dropping the rows it missed.
The Forecast no longer says "only" when your cash total is complete (FIBR-0216)
If you held any credit card or investment account, the projected
balance always carried a "(... only)" note suggesting it was partial — even
when every current and savings account had been counted.
Alerts: each dismiss button is now named, and dismissing is twice as fast (FIBR-0216)
The dismiss buttons were a bare ✕ with no name, so a screen reader
announced several identical unnamed buttons. Each now says which alert it
dismisses. Dismissing also worked out your whole alert list twice per click;
now once.
Quit is reachable from the lock screen, and Ctrl+Q now works (FIBR-0216)
The whole File menu was switched off while locked, and Quit lives in
it — so on the screen finbreak starts on there was no menu route to exit.
Quit needs no vault, so it stays available, and it is now the app's first
keyboard shortcut.
The Transactions, Statements and Export toolbar buttons now light up on hover (FIBR-0215)
Three of the thirteen toolbar buttons were stuck in neutral grey: they
never brightened under the cursor and never changed shade when you switched
theme, unlike the other ten.
Faint grey text and Ledger's focus outline are easier to see (FIBR-0214)
Column headers and unselected tabs were slightly too pale to meet the
accessibility guideline on three themes, and Ledger's gold focus outline was
too faint. All four are nudged just enough to pass — you would not spot the
difference side by side. Links in the release-notes panel now use the theme's
full accent colour instead of a washed-out tint.
The vault locking itself mid-action no longer closes the app (FIBR-0211)
Five places read your data a moment after an auto-lock could have
fired — on the Forecast tab, when deleting a category, and three times on the
Rules tab. Each now stops quietly, like every other handler, instead of
letting the error escape.
A damaged window settings file no longer stops finbreak from starting (FIBR-0210)
Every value read from window.ini now falls back to its default
instead of raising: an empty or non-numeric last_tab, and a truncated
geometry / window_state / window_size. Previously any of these made the
app unlaunchable until the file was deleted by hand. The same guard was added
to the saved table-column layouts, where a corrupt entry took down the tab
being built.
Update and Delete on the Accounts tab now grey out when no account is selected (FIBR-0204)
They used to stay clickable after the list refreshed, and clicking them
did nothing at all — no change, no message. Because the form still showed
the account's details, it looked as though your edit simply had not
worked. They now grey out, so it is clear you need to pick the account
again.
The import preview now shows which rows are duplicates (FIBR-0204)
The preview marked every row "OK" even when the summary said some were
duplicates, so you could not tell which transactions were about to be
skipped. Duplicate rows are now labelled as such.
Your chosen timezone is no longer reset by saving an unrelated setting (FIBR-0204)
If your pinned timezone was one this computer did not list — which can
happen after moving a vault between machines, since timezone names get
renamed over the years — opening Settings and saving anything at all
silently switched you back to the system default, shifting timestamps
near midnight onto the wrong day.
Closing finbreak while it checks for updates no longer crashes it (FIBR-0204)
Quitting shortly after startup, or while an update was downloading, could
end in a crash dialog instead of a clean exit.
Refreshing a tab no longer moves which row a button acts on (FIBR-0204)
With a table sorted and a row selected, anything that refreshed it — such
as saving a change in Settings — could quietly move the selection to a
different row, so a Confirm or Delete acted on something you had not
chosen. Refreshing now clears the selection instead.
A duplicate category name no longer misfiles your spending (FIBR-0204)
If you created a category on the Income side with the same name as a
built-in spending one — an "Insurance" for payouts received, say — the
built-in shop list started filing your actual insurance payments under
Income. Your totals stayed right, but the categories did not.
A damaged statement file no longer closes the app when you pick it (FIBR-0204)
A stray quotation mark in a CSV could make finbreak vanish the moment you
chose the file, with no message. It now tells you the file cannot be
read, like any other bad import.
A month-end debit order no longer drifts to the 28th in the forecast (FIBR-0204)
A payment due on the 31st was projected onto 28 February and then stayed
on the 28th for every following month — the 29th in a leap year. The
forecast now returns to month-end the way the bank does: 31st, 28th or
29th in February, then 31st and 30th again.
Selected-row text is now readable on every theme (FIBR-0204)
On Ledger, Parchment, Mint and Emerald the highlighted row used near-white
text on a light accent colour, well below the readable-contrast standard.
Emerald was the worst. The colour is now chosen by measuring the actual
contrast, so all six themes pass — no palette had to be redesigned.
The Forecast tab no longer says "no known balance" when it has your credit-card statement (FIBR-0204)
If the only balance finbreak had was from a credit card, it told you
there was no balance yet and never mentioned the card — so you would go
looking for a statement you had already imported. It now names the
account and explains that only current and savings balances count as
spendable cash.
Two copies of finbreak can no longer open the same vault at once (FIBR-0204)
Launching finbreak twice in quick succession — a double-clicked icon, or
an update relaunch racing a manual start — could leave both copies
running against the same encrypted file, which nothing else in the app
guards against. The second copy now steps aside properly.
Second dependency-audit stage: pip-audit -s osv alongside the existing PyPI-source run (FIBR-0227)
The quality gate now checks dependencies against two advisory
databases instead of one. The PyPI Advisory Database and OSV.dev are
different databases and neither is a superset; only OSV.dev imports
the OpenSSF Malicious Packages feed, which is what catches a hijacked
or typosquatted release that carries no CVE at all — the failure mode
a CVE-only view structurally cannot see. Both stages are kept; the
second is a flag on a tool already installed, not a new binary, so
osv-scanner is deliberately not added. Costs ~28s on every gate run.
Release builds now use exact, tamper-proof versions of their build tools (FIBR-0226)
The helper tools GitHub runs when building a finbreak release were
named by a moving label ("version 7"), which whoever owns that tool
can silently repoint at different code — and that code would end up
inside a signed download. Each is now nailed to one exact, unchangeable
version, with an automatic weekly check that keeps them current rather
than frozen. The build also stops leaving its access token lying around
where later steps could read it, and a new checker (zizmor) fails the
build if any of this is ever undone.
Updated the library that checks update signatures to its patched version (FIBR-0221)
cryptography 49.0.0 had a published flaw (CVE-2026-69247). finbreak
uses it to verify that a downloaded update really came from us, so it is
now pinned to the fixed 50.0.0. Nothing else changed — the version bump
needed no code changes.
Backups are harder to attack, and survive a power cut (FIBR-0212)
Restoring a maliciously-crafted backup file can no longer make
finbreak allocate half a gigabyte of memory before you have even logged in.
Saving a backup now flushes the folder entry to disk, so a power cut straight
after "Backup saved" cannot leave you with no file at all. And a backup written
into a shared folder can no longer be hijacked by a file planted there in
advance.
Another user on the same computer can no longer stop finbreak starting (FIBR-0204)
finbreak's single-instance marker lived in a shared system folder, so any
other account could take the name and make finbreak exit silently with no
window. It now lives in your own private runtime folder.
Exported PDF reports are written private to you, and can no longer overwrite another file (FIBR-0204)
An exported report — which lists your dates, shops and amounts, and is
unencrypted unless you set a password — was written readable by other
accounts on the same computer. It is now owner-only. The temporary file
it is built through also refuses to follow a symbolic link, so it cannot
be used to overwrite something else.