Ants Projects Hub
← finbreak

Changelog

finbreak

Every release, newest first — 23 in total.

v0.1.22

0.1.22 — keep page-break text out of statement descriptions

Changed

  • The README now explains how to make a desktop shortcut for the Linux AppImage If you pin the AppImage to your panel or add it to your applications menu, the shortcut file has to be named io.github.milnet01.finbreak.desktop — under any other name your desktop cannot tell the shortcut and the running window apart, and you end up with two finbreak icons side by side. That was not written down anywhere before.

Fixed

  • Imported credit-card statements no longer carry a stray "Continued on next page" (FIBR-0115) On a credit-card statement that runs over more than one page, the words "Continued on next page……" printed at each page break were being tacked onto the end of the transaction just above them — one messy description per page break. They are now left out. Your amounts were never affected by this; only the description text.

v0.1.21

0.1.21 — fix the Flatpak build, wrong import totals, and year-less dates

Fixed

  • A remembered statement password no longer stays on an unrelated account (FIBR-0249) When you tick "remember this password" for a locked PDF statement, finbreak has to save it before it knows which account the statement belongs to — so it saves it against whichever account was selected at the time. If the right account turned out to be a different one, the password was left sitting on both. It now moves to the correct account, and if the first account had a password of its own, that one is put back untouched.

  • No more "the day and month might be swapped" warning on a May statement (FIBR-0264) Importing a statement dated in May showed a warning that the day and month might be the other way around — but the dates were being read correctly and there was nothing to check. (May is the one month whose short and long names are the same word, which was enough to confuse the check.) The warning now appears only when the two possible readings would genuinely give different dates.

  • A date format with no year no longer files your whole statement in 1900 (FIBR-0273) On the import screen you can type your own date pattern. If that pattern had no year in it — "%d/%m" rather than "%d/%m/%Y" — finbreak accepted it and dated every single transaction in the year 1900, with no warning. It now stops and tells you the year is missing. Patterns that do carry a year, including the less common ones, are unaffected.

  • The import screen no longer re-reads the whole statement for every character you type (FIBR-0269) Typing in the date-format box on the import screen made finbreak read the entire statement file again for each character — nine full reads to type one format. On a very large statement (50,000 rows) that was about three-quarters of a second of frozen window; on a normal monthly statement you would never have noticed. It now reads the file once when you pick it and remembers what it found.

  • The import screen now has a Back button, so "go back and check the column mapping" is advice you can follow (FIBR-0270) When no rows in a statement could be imported, finbreak told you to go back and check the column mapping — but there was no way back. There is now: a Back button on the last import screen returns you to the column-mapping form, where you can fix the columns or the date format and try again without starting over. It appears only for statements that have a mapping form; files that describe their own layout (OFX, and Standard Bank PDFs finbreak recognises) never had one to go back to, and they get a message that does not mention it. If finbreak matched a saved layout for the file and skipped the form entirely, Back now opens that form with the saved layout filled in — so a saved layout that has gone wrong can finally be corrected instead of failing the same way every time.

  • An unreadable amount now says which value it could not read, instead of showing programmer text (FIBR-0271) A statement row whose amount could not be read used to show a line of internal Python text in the import preview. It now says could not read the amount "...", naming the value on your statement — the same way an unreadable date already did — or tells you the cell is empty.

  • Importing a damaged spreadsheet no longer closes the app when you change the Date column (FIBR-0268) If a statement file is damaged part-way down, the import screen now shows a message and leaves your date settings alone, instead of the app disappearing. Previously this could happen when importing several files at once and then adjusting the Date column or the date format.

  • Advice you can actually follow when no row of a PDF or OFX statement can be read (FIBR-0253) When nothing in a statement could be imported, finbreak always told you to go back and check the column mapping. Some statements never show you that screen — OFX files, and Standard Bank PDFs finbreak recognises, both of which describe their own layout — so for those the advice pointed at a screen you were never given. They now point at the reasons listed against each row underneath, which is where the explanation actually is. Spreadsheet (CSV) files and other PDFs do get the mapping screen, and they keep the original advice.

  • A file you had already imported no longer hides the rows it couldn't read (FIBR-0254) In the multi-file import table, a statement finbreak had already imported said "Already imported — nothing new in this file" while the Errors column beside it showed a count — one row telling you two different things. The status now names the unreadable rows on every outcome that can have them. A single bad row also reads "1 row couldn't be read" rather than "1 rows".

  • The Linux app-store (Flatpak) build now starts — it could not open at all (FIBR-0259) The Flatpak build announced in 0.1.20 quit instantly, before any window appeared, because it was missing a security library (Kerberos) that the Linux app-store runtime does not include. finbreak never used that library for anything — it came in attached to a piece of Qt used only to stop you opening two copies of the app at once. The library is now bundled, and the app opens normally.

    The check that was supposed to catch this has been widened too: it loaded every other piece finbreak needs but not that one, so it reported a healthy build that could not start.

  • A statement with an unreadable line that moved money is now refused, not imported with wrong totals (FIBR-0255) On a savings statement that prints no closing balance, a line the app could not read was quietly dropped and everything else imported — so your totals came out wrong by that line's amount, with nothing to tell you. The app now refuses the whole statement and says why, pointing you at your bank's CSV or OFX export. A printed 0.00 line still imports fine, as before: it moves no money, so dropping it changes nothing.

  • The built-in install check now works on a computer with no screen (FIBR-0261) python -m finbreak --self-test — the command that checks a broken install by loading every piece finbreak needs — crashed instead of answering when it was run on a machine with no display, such as a server you are logged into remotely. That is exactly the machine you would run it on, so it now falls back to drawing nothing and prints its result as normal.

v0.1.20

0.1.20 — security fix, batch import, and self-filing statements

⚠️ No downloads on this release

The build files for 0.1.20 were never attached to this page — a mistake when the release was cut, not something removed later. There is nothing to download here.

Get the latest release instead: https://github.com/milnet01/finbreak/releases/latest

Everything described below shipped, and it is all included in the latest version. If finbreak is already installed, its built-in updater will offer you the current version as normal.


Added

  • 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.

Changed

  • Behind the scenes: the build now also checks its own release scripts (FIBR-0225) The scripts and workflows that build, test and publish each release were the one part of the project nothing checked automatically — a mistake in them could ship a broken download. Two standard checkers (shellcheck, actionlint) now run on every build, alongside the ones that already check the app itself.

  • Importing a statement no longer re-sorts your whole history (FIBR-0213) An import now only categorises the transactions it just added. Before, it quietly re-sorted every automatically-categorised transaction in the vault — slow on a long history, and it could move numbers you were not expecting to change. To re-sort everything on purpose, use "Apply rules now" on the Rules tab. Matching itself is also about six times faster.

  • Accented shop names are matched consistently across import and categorisation (FIBR-0204) The same shop name can be spelled two ways behind the scenes depending on where a statement came from. finbreak now treats those spellings as identical, which mainly matters for spotting duplicate imports and for grouping recurring payments. Only affects descriptions with accented characters.

Fixed

  • 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.

Security

  • 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.

v0.1.19

finbreak v0.1.19

Added

  • Forecast and Home dashboard columns are now resizable and remembered (FIBR-0192) The Forecast tab's upcoming-events table can be resized and drag-reordered, and the three Home breakdown lists remember their column widths, like every other table in the app.

  • A "Show account numbers" tick-box on the Accounts tab, with a 30-second auto-hide (FIBR-0198) Account numbers stay masked by default, but you can now read one in full when you need it to pay someone — the tick-box reveals every account number in the table and in the edit form at once. It hides itself again after half a minute, so a number can't be left sitting on screen, and the tick never survives a lock or a restart. Note that a number you COPY while it's revealed stays on your clipboard until something else replaces it.

  • The Accounts tab is now a sortable table of Name, Type, Account number, Note and Status (FIBR-0113) Instead of one cramped line per account, accounts appear as rows you can sort, resize and reorder — and finbreak remembers the layout. Clicking Status brings the accounts that don't reconcile to the top. The account number and note FIBR-0193 added can now be entered and edited on the tab; the account number always shows as dots plus its last four digits, on screen and in the form, so a glance or a screenshot never gives it away.

  • Each account can now store an optional account number and a free-text note (FIBR-0193) Storage only — both fields live in the encrypted vault behind schema migration v13, and nothing displays or edits them yet (the Accounts screen that does is FIBR-0113). A blank field is stored as SQL NULL rather than an empty string, and an existing vault upgrades in place with every account row untouched.

Changed

  • The dashboard scrolls instead of squashing when the window is too small (FIBR-0186) The dashboard content now has a minimum readable size. Shrink the window below it and the page scrolls; the three breakdown columns keep a width you can actually read rather than compressing into slivers. It is a minimum, not a fixed size, so a larger system font or display scaling still grows the layout rather than clipping text.

  • Alerts moved off the dashboard into an Alerts button + dialog (FIBR-0185) The Home dashboard no longer carries an alerts card whose height grew and shrank with the number of open alerts, shoving everything below it up and down the page. Alerts now live behind an "Alerts (4)" button on the dashboard's top row, which opens a dialog listing each one with its own dismiss control. The button fills with the active theme's attention colour while something is outstanding and sits quiet and disabled when nothing is — each of the six themes carries its own attention colour, so it stays legible in all of them. Dismissals persist exactly as before.

  • Only one copy of finbreak runs at a time — launching it again brings the open window to the front. (FIBR-0189) Starting finbreak when it's already running no longer opens a second copy; it raises the window you already have, restoring it if it was minimised. This also keeps two copies from writing to your vault at once.

Fixed

  • Reset layout now resets column widths and order too (FIBR-0192) Window → Reset layout put the window back to its default size but left every table's columns exactly as you had dragged them. It now returns them to how they looked on a fresh install, in the same click, without needing a restart.

  • Running the AppImage no longer puts a duplicate finbreak icon in the taskbar. (FIBR-0188) The AppImage's launcher had a different name from the one the window announces, so your desktop treated them as two separate things. Takes effect from the next release's AppImage — an already-downloaded copy keeps the old launcher.

  • The import preview table now remembers your column widths between imports. (FIBR-0187) Widen a column while checking an import and it stays that way next time, like every other table in the app. You can also drag its columns into the order you prefer.

v0.1.17

finbreak v0.1.17

Release notes published retrospectively (FIBR-0203). The v0.1.17 tag was pushed on 2026-07-23 but no GitHub release was created, which meant these notes were missing from the in-app update prompt for anyone upgrading from an earlier version. No build artifacts are attached to this release — v0.1.18 and later supersede it; download those instead.

Added

  • Flatpak packaging for Flathub — the cross-distro Linux app store (FIBR-0159) finbreak can now be built as a Flatpak and submitted to Flathub — the app store that shows up in GNOME Software and KDE Discover on every Linux distro — so you'll be able to search "finbreak" and install it with one click, whichever distro you run. The Flatpak runs strongly sandboxed for the finance-security story: it has no network access at all, and can only touch a file after you pick it in the open/save dialog (nothing else on your computer is visible to it). This adds the build manifest and recipe; the live Flathub listing follows once the submission is merged.

  • Native Linux packaging (RPM + deb) via the openSUSE Build Service (FIBR-0155) finbreak can now be published as a proper native package for openSUSE, Fedora, Debian and Ubuntu — installed and updated the normal way for your distro (zypper/dnf/apt) and listed with its icon in the software centre, alongside the existing AppImage. The package bundles its own tested runtime, so it runs the exact same encryption stack regardless of what your distro ships. (This adds the build recipes and desktop/store metadata; the first live build is published from the maintainer's OBS account.)

  • A "Report an Issue" item in the menu bar (right of Donate) that opens the project's issue page in your browser (FIBR-0156) One click opens finbreak's GitHub issue form so you can quickly report a bug or request a feature — no data leaves the app (it just hands the page to your browser, exactly like the Donate links).

  • Categories can now be organised three levels deep (Type › Category › Sub-category) (FIBR-0154) Add a sub-category under an existing category (e.g. Expenditure › Groceries › Spar) directly in the Categories tab: select the parent, type the name, click Add. Renaming, moving (via "Move under…"), and deleting work at every level. Where two sub-categories share a name (Groceries › Spar and Fuel › Spar), the category pickers now show the parent so you can tell them apart. The app keeps the depth at three levels.

  • Per-release signed SHA256SUMS checksum manifest + per-platform CycloneDX SBOM (FIBR-0096) Each release now publishes a signed SHA256SUMS manifest (verify manually with sha256sum -c --ignore-missing SHA256SUMS, its .sig Ed25519-signed by the release key) and a per-platform CycloneDX SBOM of the bundled runtime dependencies — a second, independently-verifiable integrity signal and a supply-chain parts-list, complementary to the per-artifact signature the in-app updater already checks.

  • "Forgot password? Start over" — a last-resort, double-confirmed destructive vault reset on the unlock screen (FIBR-0030) For a genuinely forgotten master password with no usable backup, the unlock screen now offers "Start over": after a clear irreversible-warning and a second step where you type DELETE, it permanently erases the vault and returns you to first-run setup so you can begin fresh. The old data was already unrecoverable without the password; nothing that could be recovered is lost. The reset removes the vault's complete on-disk footprint (database, key file, and SQLite's working sidecars), and clears the old lockout/hint state, leaving your app preferences untouched.

  • Verify a backup is restorable, from Settings (FIBR-0033) A new "Verify backup…" button in Settings opens a backup file (.fbk) and checks it read-only — confirming the password is right, the data isn't corrupted, and the version is one this app can restore — and shows a short summary (schema version and how many transactions, etc.). It never touches your live data. Now you can confirm a backup is good before you ever have to rely on it.

Fixed

  • Amounts now show the currency symbol ("R 1,234.49"), with a tidy Currency column (FIBR-0153) Money used to display as "ZAR1,234.49" — the currency code jammed onto the number with no space. It now shows the proper symbol and a space, like "R 1,234.49", and the "ZAR" code moves into its own dedicated Currency column on the Transactions table. The grouping and decimal style still follow your system's locale. This applies everywhere amounts appear — the transactions list, the Home dashboard, and PDF exports.

  • Confirmed transfers now show on the Transactions tab (FIBR-0151) A transfer you've confirmed now appears in the Transactions tab's Category column as a directional label naming the other account — the money-out leg reads "Transfer to " and the money-in leg reads "Transfer from ". Previously a confirmed transfer left both rows blank there.

Security

  • Optional password hint on the unlock screen (FIBR-0029) You can now set an optional hint to jog your memory, shown behind a "Show hint" button on the unlock screen. You set it in Settings and must confirm your current password to do so. The app refuses a hint that is, or contains, your password — so it can't become a plaintext copy of your secret. Note the hint is stored unencrypted (it has to be readable before you unlock), so anyone with access to your device can read it — keep it vague. It's a memory aid, not a way to recover a truly forgotten password.

  • Copy a transaction's amount or description — and it auto-clears from the clipboard (FIBR-0032) Right-click a transaction and pick "Copy amount" or "Copy description" to put it on the clipboard. finbreak then wipes it after a short timeout (default 30 seconds, adjustable in Settings — or "Never" if you prefer) so it doesn't linger for other apps to read. It only clears the value if the clipboard still holds what finbreak put there, so anything you copied since is left alone. Your saved statement-PDF password and account numbers stay non-copyable by design.

  • Unlock throttling — repeated wrong master-password attempts are now slowed. (FIBR-0095) After a wrong password on the unlock screen, finbreak now waits a growing moment before accepting the next try (1s, then 2s, 4s, … up to 30s), and remembers the count so closing and reopening the app doesn't reset it. This is extra protection against someone repeatedly guessing your master password through the app; a correct password always clears it, so you're never locked out of your own vault.

v0.1.18

finbreak v0.1.18

Added

  • Spending alerts — flag unusual spend, a newly-appeared recurring charge, or a missed expected debit. (FIBR-0172) A quiet, dismissable alerts card on the Home dashboard: a new recurring charge that just appeared, a spending category well above its recent average, or an expected debit that didn't post. Each alert is dismissable and the dismissal sticks. Computed from data the app already holds (recurring detection + reporting); one small new dismissals table.

  • Account-level balance reconciliation — verify imported transactions sum to the bank's stated balance for every account. (FIBR-0177) Per-account reconciliation marker on the Accounts tab (✓ balances reconcile / ⚠ off by …) for current & savings accounts, checking that imported transactions bridge each statement's closing balance to the next. Bank-agnostic, no new stored data, no schema change.

  • A new Forecast tab projects your balance forward from confirmed recurring income and expenses. (FIBR-0171) The forecast starts from a real, current balance — each imported statement's closing balance, brought up to date with the transactions imported since — and draws a projected-balance line to a chosen horizon (end of this month, 30, 60 or 90 days). When no statement has recorded a balance yet, it honestly shows the projected net change from zero instead of a made-up balance. A provenance line names each account and statement the starting figure came from.

Changed

  • The update prompt now shows what changed in every release you skipped, not just the newest one. (FIBR-0152) If you were three versions behind, "What's new" only described the newest release. It now lists each release between your version and the one on offer, newest first. The check reads the release list from the same GitHub endpoint it already used — no new network surface — and if that read fails you simply get the single set of notes as before.

  • The update download now shows real progress instead of a permanently-full striped bar (FIBR-0108) The "Downloading…" bar fills up as the update arrives. If the server doesn't say how big the file is, the bar keeps its old busy look rather than guessing.

  • The Forecast tab's "excluded accounts" note now states the rule positively — "only current and savings balances are spendable cash". It used to list "credit, loan and investment", which quietly left out accounts of type "other" — they were excluded from the forecast anchor too, but the note never said why. (Debt sweep DS02.)

Fixed

  • Forecast starting balance no longer counts credit-card and loan debt as cash (FIBR-0179) A statement for a credit card or loan prints its closing balance as the amount you OWE, the opposite sign to the way finbreak stores transactions. The Forecast tab was adding that owed figure into your projected balance as though it were money you have, and any card purchase since the statement moved it the wrong way. The forecast now anchors on cash accounts only (current and savings); every other account type — debt, investment, and "other" — is listed as excluded, with the reason. If a debt account is the only one with a recorded balance, the forecast honestly shows a projected change from zero instead.

  • The Recurring and Transfers tabs now show amounts with the currency symbol and thousands grouping (e.g. “R 1,234.50”), matching the rest of the app. (FIBR-0168)

  • CSV import no longer crashes on a corrupt or truncated file — it now reports a friendly “not valid CSV” message. (FIBR-0165)

Security

  • Updates install the exact bytes that passed the signature check (FIBR-0170) The verified download is now re-written from memory immediately before install, instead of handing over the file it had been read from — closing a window in which the payload could have been swapped on disk.

  • The Argon2id acceptance floor is now separate from the vault-creation parameter, so a future increase in password-hashing strength cannot lock existing vaults out. (FIBR-0166)

  • The auto-update check now enforces HTTPS on redirects, not just the first request, so it cannot be silently downgraded to plaintext. (FIBR-0167)

v0.1.16

finbreak v0.1.16

Fixed

  • OFX import now files each transaction under the date the bank printed. (FIBR-0042) A timezone-stamped OFX date (e.g. an evening transaction in a UTC-5 zone) was being shifted to UTC, which could file it under the next day — and, at a month boundary, under the wrong statement. Dates are now kept exactly as posted on the statement.

  • Delete-statement confirmation no longer over-states the loss on an overlap. (FIBR-0149) When you delete a statement that shares transactions with another one you keep, the confirm dialog previously counted all of the statement's transactions and warned "this cannot be undone" — even though the shared ones now survive under the overlapping statement. It now names the actual number that will be removed (often 0) and reassures that the shared rows stay.

  • Deleting a statement no longer loses transactions another overlapping statement still covers (FIBR-0148) If two of your statements' periods overlapped (say a monthly statement and a quarterly one covering the same weeks), deleting one used to silently delete the transactions they shared — even though the statement you kept still covered them. Now those shared transactions are handed over to the statement you keep, and only transactions nothing else accounts for are removed.

v0.1.15

finbreak v0.1.15

Changed

  • finbreak stays fast and responsive as your transaction history grows (FIBR-0098/0071/0026/0025) The vault now keeps quick-lookup indexes on the columns finbreak searches most (dates, accounts, categories, statement periods, and the duplicate-check key), so listing, filtering, importing, and de-duplicating stay fast even on a multi-year vault instead of slowing down as rows pile up. The database also switches to a faster write mode (WAL) so the screen stays responsive while a large statement imports. Existing vaults gain the speed-ups automatically the next time you unlock them; your data is untouched.

Fixed

  • Category tree can no longer loop back on itself. (FIBR-0141) Editing a category to sit under itself or one of its own sub-categories is now refused with a clear message, instead of silently creating a loop that could confuse the parts of the app that walk the category tree.

  • PDF/CSV statement import no longer fails every row when the bank's date layout isn't ISO (FIBR-0146) The import wizard used to ask for the date layout as a raw programmer code (%Y-%m-%d), so a statement printed day-first (or any other layout) failed every row with a wall of cryptic "time data … does not match format" text. finbreak now reads the actual dates, guesses the layout, and offers a plain-English picker (with a "Custom…" escape hatch) plus a live "Dates read as: …" preview — so the common case just works and a wrong guess is caught before import, never a silent wrong-day. When a row still can't be read it shows a friendly message naming the value, and a whole-import banner points you at the date control when nothing lands. Reported by an external Windows tester (165-row all-error import).

v0.1.14

finbreak v0.1.14

Changed

  • Reworked the Home dashboard so the breakdown is the primary surface (FIBR-0143) The Income / Spending / Transfers breakdown is now the hero: three side-by-side columns, each with its own pie, a coloured heading with the big total, and an expandable drill-down. A slim Net strip sits above; a recurring-money card and the monthly-trend chart (demoted to a bottom strip) sit below. No money figure changes — the same integer-exact aggregations, only rearranged on screen.

v0.1.13

finbreak v0.1.13

Added

  • Recurring-money detection (FIBR-0142) — a new Recurring tab that spots subscriptions and regular income (FIBR-0142) finbreak now scans your history and suggests recurring charges and income (weekly / fortnightly / monthly / yearly), which you Confirm or Dismiss. Confirmed transfers are excluded, and one merchant's charges across several accounts group into a single item. Amounts stay exact-integer (money-safe); the per-month equivalents feed a summary the upcoming dashboard card will show.

v0.1.12

finbreak v0.1.12

Added

  • Expandable dashboard drill-down — open the Income / Spending / Transfers totals into categories, shops, and individual transactions (FIBR-0138). The Home dashboard's three headline numbers are now openable, in a tree below the donut and trend charts. Click Spending to break it into your categories, open a category down to a single one, then see the transactions grouped by shop with a count (e.g. "Woolworths ×3"), and open a shop to see each purchase (date + amount). Income opens the same way; Transfers opens by account pair (e.g. "Current → Savings ×2"). Every figure is still summed from the real stored amounts — the shop grouping only decides which line a transaction sits under, never how much it is.

v0.1.11

finbreak v0.1.11

Added

  • Built-in category library — common merchants are now auto-categorised out of the box (FIBR-0139). A bundled, per-release merchant library guesses categories for new transactions, so a fresh vault no longer imports everything Uncategorised. It runs after your own rules and only on rows you haven't set by hand, so your rules and manual picks always win. Guessed rows show a small "~ guess" tag you can override with a click, and a Settings toggle (on by default) turns the whole thing off.

v0.1.10

finbreak v0.1.10 — themes, Windows in-app auto-update, and more

Added

  • Forget a remembered bank-statement password, per account. (FIBR-0128) The Accounts screen now marks each account whose locked-PDF statement password the app remembered while importing, and adds a "Forget statement password" button to clear it. The password itself is never shown — you only see which accounts have one saved.

  • Themes — six finance-flavoured looks plus "Follow system", with a sleeker design. (FIBR-0127) Settings → Theme now offers six looks (three light — Ledger, Parchment, Mint; three dark — Midnight, Graphite, Emerald) or "Follow system", which tracks your computer's light/dark setting and switches instantly when it changes. Picking a theme applies it straight away — no Save needed. The whole app got a modern polish pass: soft gradient/glow accents on buttons and fields, and highlighted rows (hover, selection, and alternating stripes) in the tables. The toolbar icons re-colour themselves to suit the chosen theme. Your choice is remembered and applies from the moment the app opens, even before you unlock.

  • Windows in-app auto-update — the Windows app now offers, verifies, and installs a new version, then reopens itself, matching the Linux AppImage. (FIBR-0131) Opt-in and off by default, like on Linux. Each download is checked against finbreak's own signature before anything runs. Because a running Windows program can't overwrite its own file, a tiny helper waits for finbreak to close, swaps in the new version, and reopens it. (Windows may still show a one-time "unknown publisher" notice until the separate code-signing step lands.)

  • Auto-lock can now be set to "Never" — the app won't lock itself while idle. Settings → Auto-lock after → Never disables the idle timer. The password is still required when you open the app, and you can still lock any time with the Lock button (FIBR-0135).

Changed

  • The About box shows the version on its own line, above the tagline. A small readability tweak — "finbreak 0.1.10" on the first line, then "A private, offline personal-finance vault." beneath it.

Fixed

  • Statements now has a toolbar button with an icon (was reachable only from the View menu). Added a Statements glyph to the toolbar, placed after Transactions to match the tab order (FIBR-0136).

  • Auto-update: a download that fails after an idle auto-lock no longer disrupts the lock screen. If the vault auto-locked while an update was downloading and the download then failed, the app would close the re-opened unlock prompt and show a stray "Update failed" box over the lock screen. The failure handler now stays silent once its prompt is gone (FIBR-0054 close).

  • Embed the finbreak icon in the Windows .exe (was PyInstaller's default console-stub icon). (FIBR-0134) Make the Windows app file show finbreak's donut icon in Explorer instead of a generic black terminal icon.

  • Windows: the app no longer flashes a console (command-prompt) window on launch. (FIBR-0132) The Windows .exe is now frozen as a GUI app (--windowed) instead of a console app, so no black cmd window appears before the window opens.

v0.1.9

finbreak v0.1.9 — PDF export, encrypted backups, and a Windows build

Added

  • Windows build (testing) — a self-contained finbreak.exe. (FIBR-0015) finbreak can now be packaged into a single Windows .exe (no Python needed) by the on-demand windows-build CI workflow, so friends can test it on Windows. The SQLCipher vault engine moved to a cross-platform wheel (sqlcipher3-wheels, the same SQLCipher 4.12.0), so your existing vaults and backups open unchanged. The .exe is unsigned for now — Windows SmartScreen may warn ("More info → Run anyway") — and there is no auto-update on Windows yet (replace the old .exe to update).

  • Encrypted backup export & restore — save a portable, password-protected .fbk backup of your vault and restore it later. (FIBR-0014) Export a .fbk from Settings, keyed by a separate backup password you choose. If you ever forget your master password, restore the backup from the unlock or first-run screen with the backup password plus a new master password — you never need the old one. The backup is fully encrypted (AES-256); restoring an existing vault moves the old one safely aside rather than deleting it.

  • Export a password-protected PDF report (FIBR-0013). (FIBR-0013) File → Export report as PDF… (and the toolbar) opens a dialog to choose which sections to include (summary / charts / transactions), the period, and which accounts (all or a chosen subset — with combined totals plus a per-account summary line). Optionally set a password to AES-256-lock the file so only you can open it; leave it blank for a normal unencrypted PDF. Pick a Light or Dark theme. Confirmed internal transfers are excluded from the summary and charts but shown and marked in the transaction list.

Changed

  • Category pickers now group by Income / Expenditure type. (FIBR-0123) The Set-category and Rule dialogs and the Transactions category filter now list categories under non-selectable Income / Expenditure headers and tag every row "Name (Type)", so two same-named categories under different Types (e.g. an income vs an expenditure "Lottery") are distinguishable both in the open dropdown and the collapsed box.

Downloads: Linux → the .AppImage (+ .sig); Windows (testing) → finbreak-0.1.9-x86_64.exe (unsigned — SmartScreen: More info → Run anyway; no auto-update on Windows yet).

v0.1.8

finbreak v0.1.8

What's new

Added

  • Dashboard on Home — an income-vs-spending summary for a period you choose (defaults to last month and remembers your choice), a pie chart of where your money went by category, and a month-by-month trend chart. Money moved between your own accounts never counts as spending or income.
  • Searchable, filterable Transactions tab — find rows by description and filter by date range, account, and category (any or all at once). The transaction list moved off Home to make room for the dashboard.
  • Drag-to-reorder table columns, with your layout (order + widths) remembered across sessions, on every data table.

Fixed

  • Auto-update now reliably reopens the app after installing. The relaunch helper was loading the wrong libraries and dying before it could reopen finbreak. Note: the copy performing the relaunch is the one you're updating from, so you may need to reopen manually one more time on the update to this version — the update after this one should reopen on its own.

v0.1.7

finbreak v0.1.7

finbreak v0.1.7

Added

  • Transfers tab — finbreak now spots money you move between your own accounts and asks you to confirm it. (FIBR-0011) Moving money between your own accounts (a credit-card payment, a transfer to savings) shows up as two lines — money out of one account and the same amount into another. finbreak now finds these matched pairs and lists them under a new Transfers tab, where you Confirm or Reject each. Only confirmed pairs stop counting as spending or income; nothing is hidden without your say-so, and rejected pairs are remembered so they aren't offered again.
  • Data tables now sort on a column click and remember your column widths. (FIBR-0117) Click a column heading (Statements, Transfers, Home) to sort by it; click again to flip ascending/descending. Amounts and dates sort by real value, not as text. Each table remembers your column widths and last sort, restoring them next time.

Changed

  • The toolbar icons now have gentle colour that brightens on hover. (FIBR-0116) Each toolbar button has its own soft, muted colour that lights up to a vibrant version when you point at it — tuned to your current light or dark theme.
  • The app icon now has softly rounded, transparent corners instead of a hard square tile. (FIBR-0118)

Fixed

  • Auto-lock now resets on activity (inactivity timer), so it no longer locks mid-use. (FIBR-0114)
  • Credit-card statements whose transactions continue onto a page without a repeated column header no longer fail to import. (FIBR-0112)

The AppImage is signed with the finbreak release key; finbreak-0.1.7-x86_64.AppImage.sig is the raw Ed25519 signature. In-app auto-update (opt-in) verifies it against the built-in public key before installing.

v0.1.6

finbreak v0.1.6

Fixed

  • After installing an update, finbreak now reliably reopens itself. (FIBR-0054) Previously the app could close after updating without coming back — it tried to start the new version before the old one had fully shut down, and the new copy died in the collision. It now waits for the old version to exit completely, then launches the new one, and records a small diagnostic log so any future hiccup leaves a trace. (Note: because the fix lives in the update machinery, it only takes effect from the NEXT update after this one — the update into this version may still need one manual reopen.)

  • Credit-card statements that open in credit now import correctly. (FIBR-0106) Some Standard Bank credit-card statements print a plain-English sentence mentioning the "balance brought forward" before the real opening-balance row. finbreak was reading the figure from that sentence (which is actually the closing amount), so the statement failed to import with "this statement didn't add up." It now reads the true opening balance and imports as expected.

v0.1.5

finbreak v0.1.5

Added

  • Choose how negative amounts look. In Settings (and when first creating your vault) you can now show money-out with a minus sign (-25,000.00) or in accounting brackets ((25,000.00)), and turn red/green colouring on or off. Default is minus with colour on; brackets are there so anyone used to accounting statements keeps the familiar look. It's display-only — your stored amounts never change — and switching either option updates the open Home tab straight away. (FIBR-0105)

Changed

  • The update prompt now shows "what's new" inline. The "a new version is available" box shows the release notes right there in the window, instead of a button that opened the release page in your browser. No extra internet access — the notes come with the update information finbreak already downloads. (FIBR-0054)

v0.1.4

finbreak v0.1.4

Fixed

  • The app now reopens itself after installing an update. Previously it closed but didn't relaunch — you had to reopen it manually. The relaunch now spawns a fresh, detached copy of the updated app (with PyInstaller's restart signal set) instead of re-executing in place, which couldn't replace the still-mounted AppImage.

Note: because the old running version performs the relaunch, updating 0.1.3 → 0.1.4 still needs one final manual reopen. From 0.1.4 onward, updates reopen automatically.

Signature-verified AppImage — the .sig next to it is checked automatically on update.

Full changelog: CHANGELOG.md

v0.1.3

finbreak v0.1.3

Added

  • Choose your time zone and date/time format (Settings + first-run). Statement timestamps (the "Imported" column) now show in your time zone instead of a raw UTC value, and you can pick how dates and times are written (e.g. 2026/07/11 vs 11 July 2026, 24-hour vs 2:30 PM). Set it in Settings or when first creating your vault; leave it on System default and finbreak follows your computer automatically. Changes apply immediately — no restart.

Signature-verified AppImage — the .sig next to it is checked automatically on update.

Full changelog: CHANGELOG.md

v0.1.2

finbreak v0.1.2

Fixes the updater and a couple of rough edges found while testing.

Fixed

  • The update check now works on every Linux distribution. On v0.1.0/v0.1.1 it could silently do nothing — no prompt ever appeared — on any distro whose security-certificate location differs from the one the app was built on. finbreak now ships its own trusted certificate set and uses it directly.
  • The Rules button on the toolbar now has an icon (was text-only).

Added

  • Help → Check for updates… — check on demand, with a clear result every time (an update is offered, you're up to date, or it couldn't reach the internet). Works even if automatic checks are turned off.

Early preview — please report issues.

v0.1.1

finbreak v0.1.1

A small follow-up to v0.1.0.

Changed

  • The About box now shows the running version (e.g. "finbreak 0.1.1 — …"), so you can tell at a glance which build you're on — and confirm an update actually took effect.

If you're on v0.1.0 with Check for updates on startup enabled (Settings), finbreak will offer to update to this release on next launch.

Still an early preview — please report issues.

v0.1.0

finbreak v0.1.0

Early pre-alpha preview of finbreak — a private desktop app that breaks down where your money goes from your own bank statements, fully offline with no bank linking.

This first release mainly establishes the signed update channel: turn on Check for updates on startup in Settings and the app can detect and install signature-verified updates (Linux AppImage).

Linux (x86_64): download finbreak-0.1.0-x86_64.AppImage, make it executable (chmod +x), and run. The .sig file is the Ed25519 signature the app verifies updates against.

Expect rough edges — please report issues.