v0.1.23
0.1.23 — a recovery code, a second way into your vault
[0.1.23] - 2026-09-07
Added
A recovery code — a second way into your vault if you forget your master password (FIBR-0019) Forgetting your master password used to mean losing everything. finbreak now shows you a recovery code once, when your vault is created: keep it somewhere safe and it can unlock your vault and let you choose a new password. You can decline it, or replace or remove it later from Settings. finbreak keeps no copy of the code, so losing both it and your password is still unrecoverable. Existing vaults are upgraded automatically the next time you unlock them — nothing to do, and a copy of the old vault is taken first and only removed once the upgrade has been checked. A vault upgraded this way cannot be opened by an older finbreak.
SECURITY.md and CODE_OF_CONDUCT.md, and a private channel to report a vulnerability (FIBR-0237) There was no private way to report a security bug before this — GitHub's private advisory form was disabled on the repository, so the only channel was a public issue, which is the wrong place to put one. The form is now enabled and
SECURITY.mdpoints at it, alongside what to expect, which versions get fixes (the latest, no backports) and how to verify a signed release yourself.CODE_OF_CONDUCT.mdis Contributor Covenant 2.1.CSV import now guesses the column mapping from the file's own headers (FIBR-0297) Importing a spreadsheet for the first time no longer starts with every dropdown pointing at the first column. Headers the file already spells out — Date, Description, Amount, and common wordings like Transaction Date, Details, Narrative, Withdrawal and Deposit — are matched up for you, ignoring case and punctuation. Anything not recognised is left for you to set, exactly as before, and every guess stays visible and changeable before you import.
Changed
Batch import review no longer slows down as files are added (FIBR-0327) Working out each row's File label re-examined the whole batch, so a long batch redrew slowly.
Schema v14 indexes transfer-candidate detection (FIBR-0327) Finding transfer candidates had no index to work from, so the database built a throwaway one over every transaction each time the tab opened. Existing vaults upgrade in place on next unlock.
The time zone you pick in Settings now decides what "today" means, not just how dates look. (FIBR-0327) Pinning a time zone used to change only how timestamps were displayed. What counted as "today" — for this month's spending, the alerts and the forecast — came from your computer's own clock. If you pinned Johannesburg and travelled, on the first of the month the two disagreed and a whole month of totals moved with you. The pin now wins. If you leave it on "System default", nothing changes.
Fixed
You can no longer end up with two categories or accounts whose names look identical. (FIBR-0328) Some accented characters can be typed two different ways that look exactly the same on screen. The duplicate-name check compared the underlying letters rather than what you see, so both were accepted and nothing on screen told them apart.
Your date format now reaches the Transfers, Recurring, Forecast and Alerts screens. (FIBR-0328) They showed dates as 2026-01-05 whatever you had chosen in Settings, while the other screens obeyed you. They now match, they update as soon as you save the setting, and the Transfers and Recurring tables still sort by real date order rather than by the digits on the left.
A screen reader can now name every password and recovery-code box. (FIBR-0328) The master password, the recovery code, the new password and its confirmation, and the import wizard's custom date-format box were announced as unnamed. Each had only placeholder text, which disappears as soon as you type.
The import wizard no longer crashes if the vault locks itself while you are partway through. (FIBR-0327) finbreak locks the vault after a spell of inactivity. Several steps of the import wizard read the vault without expecting that, so leaving one open long enough and then carrying on could close the app instead of returning you to the unlock screen.
Two copies of finbreak can no longer open the same vault after a crash. (FIBR-0327) If finbreak was killed rather than closed, it leaves a file behind that the next launch has to clear away. Two launches started together both cleared it and both carried on, so two windows ended up writing one encrypted vault. Only one of them now claims it; the other stands down.
The account picker no longer arrives with an account already chosen for a statement that has none. (FIBR-0327) A row reading "— pick one —" now opens a picker saying the same, with OK held back until you choose. It used to open on whichever account came first, so confirming without touching it filed the statement against an account nobody picked.
The batch import review's Account column can be used without a mouse. (FIBR-0327) Press Return on a statement's Account cell to open the destination picker. It answered only to a click before, so a keyboard-only user could not give any statement a destination and could not finish a batch import at all.
Adding or deleting a category no longer leaves the buttons active with nothing selected (FIBR-0327) After adding, renaming or deleting a category the tree was rebuilt and nothing was selected — but Add, Update and Delete stayed available, as though the category you had been working on were still there. The same fix the Rules tab already had.
Cancelling a locked-PDF import no longer leaves the password on the wrong account (FIBR-0321) Ticking "Remember this password" stored it straight away, against whichever account the file-picker happened to be showing — which is not necessarily the one the statement belongs to. If you then cancelled, or picked a different file, that password stayed there and the account's own remembered password was lost. Both now put things back as they were. An import that finishes still moves the password to the account the transactions landed on.
Importing several statements with the same layout now asks about the columns once (FIBR-0319) If none of your saved layouts matched, finbreak asked you to describe the columns for every file in the batch — thirty spreadsheets from the same bank meant thirty identical questions. Now, once you have described the layout and given it a name, the rest of the batch uses it. Files with a genuinely different layout are still asked about.
The import preview shows amounts the way the rest of the app does (FIBR-0327) It had no currency symbol, no thousands separators and ignored the negative-amount style -- on the last screen before an import you cannot undo.
A blocked recovery from an interrupted restore explains itself (FIBR-0327) If the folder could not be written to, the app failed to start with a traceback. It now reports the vault state and leaves the saved copies intact so a later attempt still recovers.
A typed-in time zone is the one that gets saved (FIBR-0327) Typing a zone the list does not offer showed the new zone in the field and quietly kept the old one -- and the pinned zone decides what counts as today, so dates near midnight could render on the wrong day.
Closing during an update check is safer (FIBR-0327) A check or download still running at close could be cut off mid-flight, or finish afterwards and act on a window that had already gone.
A startup failure now says what went wrong instead of nothing at all (FIBR-0327) Only one kind of problem was reported. Any other left the app doing nothing when you opened it, with no message and nothing to report.
Cutting a release refuses an unpushed version bump (FIBR-0327) The tag is created on GitHub, so an unpushed bump tagged the previous commit and attached downloads built from a version the tag did not name.
A part-published release now reports itself instead of going quiet (FIBR-0327) When an upload failed midway the release scripts stopped before the check that would have said which downloads were missing -- which is how v0.1.21 went out with a signature file whose subject was gone.
A dropped download says so instead of raising the tamper alarm (FIBR-0327) A download cut short by the network was reported as a failed signature check, which is the warning reserved for a file that has been altered.
Self-update works from a folder whose name contains an apostrophe (FIBR-0327) On Linux the app closed and never reopened. Nothing about the running version could reveal it -- the fault was in the script that starts the new one.
Ticking "Date range" on Transactions no longer empties the table (FIBR-0327) The two date boxes started at the year 2000, so the first tick filtered everything away with no explanation. They now span the transactions on screen, and a range you set survives a refresh.
Very large amounts display the digits that are stored (FIBR-0327) Amounts near the app's maximum were rounded on screen, showing different digits and cents from the ones held in the vault.
Deleting a rule no longer leaves the next one selected (FIBR-0327) The highlighted row survived the delete and now held a different rule, with Edit and Delete live against it.
Exported PDFs name the month in the app's language (FIBR-0327) The period line was always English, whatever the rest of the report.
Account names render as text on the Forecast tab (FIBR-0327) An account named with something that looks like markup was drawn as markup rather than shown as typed.
The Transfers tab and the dashboard stop reading every transaction (FIBR-0327) Both resolved a handful of ids by loading the whole table, on every Home refresh. They now fetch only the rows they name.
A failed first run no longer leaves the vault open (FIBR-0327) If the sidecar write failed, the app reported locked while still holding an unlocked connection nothing would close.
Directory flush at every rename that commits a vault (FIBR-0327) A crash straight after a sidecar write could silently revert a new master password or a freshly issued recovery key, and an interrupted v1 to v2 migration could leave a v1 sidecar over a converted database -- which every later unlock reports as a wrong password over an intact vault.
A damaged settings file is now reported as a damaged settings file, not as a wrong password. (FIBR-0327) A single corrupted byte in a small unencrypted file beside the vault made unlocking fail as though you had typed the wrong password — which counts against the lock-out limit and offers to erase and start over, on a vault whose data was completely intact.
Backups written by one version stay restorable by later ones. (FIBR-0327) One internal setting recorded both what a new backup is written with and what an old backup is accepted with. Changing it — which a routine library update could have forced — would have made every backup already on your machine unrestorable, at the moment you needed it. The two are now separate, and a restore reads each backup at its own setting.
Backup export no longer fails for anyone whose home folder contains an apostrophe. (FIBR-0327) An apostrophe anywhere in the path — an
O'Brienhome folder — broke both backup export and the vault upgrade outright, every time, with no way around it. Nothing you could do about your own name.Recovering from an interrupted backup restore now puts back the whole database, and no longer offers to create a new vault over a recoverable one. (FIBR-0318) The recovery restored the database and its key file but not the database's journal files, losing any recent tail; and a crash at the wrong moment left it reading the vault as absent rather than recoverable.
An update that cannot be installed now explains itself instead of failing silently. (FIBR-0318)
Choosing Check for updates twice in a row no longer risks a crash on exit. (FIBR-0318)
Quit and Ctrl+Q now save your window layout and shut background work down cleanly. (FIBR-0318) They bypassed the close handler that does both.
The app no longer closes when the vault auto-locks while the Statements reassign picker or the Categories move-under list is opening. (FIBR-0318)
Dates in an exported PDF's transactions table now follow your chosen date format. (FIBR-0318) The table showed the stored ISO date while the same document's header used your preference.
The trend chart's month and value labels are now readable on the dark theme and in a dark PDF export. (FIBR-0318) Its axis text was left on Qt's light-theme default, which is dark on dark.
The Forecast chart's value axis now reads in the same units as the figures beside it. (FIBR-0318) It plotted cents, so the axis read 860000 next to a projected balance of R 8,600.00.
An enormous amount in a spreadsheet cell is reported as one bad row instead of aborting the import. (FIBR-0318) It previously raised an error type the import and manual-entry screens do not catch, so the action died silently.
An OFX statement carrying a transaction with no date no longer closes the app. (FIBR-0318) The row is now reported alongside the valid ones instead of raising. In a batch import it had aborted the whole run rather than one file.
Standard Bank import: a truncated statement on an overdrawn account is now refused instead of silently importing short. (FIBR-0318) The completeness check compared balances by magnitude, so a statement whose missing rows flipped the sign of the running total could pass it.
Two of our own tests failed on a developer machine because of an unrelated git setting (FIBR-0306) Nothing users see — a test-only fix. The miniature repository two tests build to check finbreak's own push checks was picking up a setting from the developer's machine, which made the tests fail on that desktop while passing everywhere else.
Security
Locking the vault now clears more of what was on screen (FIBR-0322) When the vault locks, finbreak empties the tables so decrypted rows do not sit in memory waiting for the window to be torn down. Each tab also kept its own copy of the rows alongside the table — including account numbers on the Accounts tab — and those were not being cleared. They are now.
A backup file crafted to attack finbreak can no longer exhaust your machine before you have typed a password. (FIBR-0327) Restoring a backup reads settings out of the file and acts on them before any password is checked. Three of those numbers had no upper limit, so a file built to be hostile could make finbreak claim unlimited memory, or grind indefinitely. They are now checked as the file is read.
The release scripts now bind the published Windows build to the tag being released. (FIBR-0318) A transient GitHub API failure could make the script adopt the previous release's build, sign it with the real key and publish it as the new version. Nothing compared the downloaded file against the tag.
Statement closing balances are no longer written to the log. (FIBR-0318) Nothing configures a log handler, so they reached the terminal or the desktop journal -- outside the encrypted vault.