-
Simpl'Résultat v0.15.0
StableAll checks were successfulRelease / build-and-release (push) Successful in 22m32sreleased this
2026-09-12 18:51:31 +00:00 | 171 commits to main since this releaseAdded
- Import: opening a source you have never configured now detects its format on its own — delimiter, encoding, date format, and which column holds the date, the description and the amount. Columns are recognised by their header label in French and in English (
Montant/Amount,Débit/Withdrawal,Crédit/Deposit…), and the exported layouts of Desjardins, RBC, National Bank and Tangerine are recognised by name. Detection then replays its own decision over every row of the file and reports a confidence score ("147 of 150 rows read"): above 90 % the banner is neutral, below it the banner warns and points you at the column mapping and the preview. Nothing is ever blocked by the score — it says what could be read, not whether the meaning is right. The magic-wand button is still there to re-run detection on demand, and a source that already has a saved format is never re-detected (#327, #328). - Import: the data preview is now a mandatory step of every import, no longer an optional pop-up, and it shows a signed recap of what the file will actually write: how many outflows and for what total, how many inflows and for what total, and how many rows could not be read. If inflows and outflows are swapped, an "Flip the signs" button fixes them — and because it corrects the source's configuration rather than just this preview, the next file from that bank reads correctly on its own. The confirmation screen now also states the amount mode, the sign convention and the column mapping named by header, so you can check them before the import runs (#329).
- Import: when a bank changes the layout of its export, the wizard now says so before importing. The header of every successful import is recorded on the source, and a file whose header no longer matches opens a panel listing the columns that moved, appeared or disappeared ("Amount: column 3 → 4"), with the two choices that exist: adopt the newly detected format, or keep the stored one. A purely cosmetic rename (
Montant→MONTANT ($)) is recognised as the same header and says nothing. Both the drift panel and the sign-flip button now also carry a note explaining the safe way to repair an import that was already written wrong: delete it from the import history first, then replay the file — re-importing on top of it would double the rows, since duplicates are matched on date, description and amount together (#330). - Import: your import sources and templates are now included in the encrypted backup. Exporting and re-importing your data used to wipe every import configuration and replace it with a single synthetic "Data Import" source, so restoring a backup meant reconfiguring every bank by hand. Older backup files, which do not carry them, are still restored exactly as before (#331).
- Category migration: custom categories that have no standard match can now be merged into a standard category instead of only being set aside. Each custom category in the "Custom categories" block gets the same target picker as the seeded rows — choose a standard leaf and its transactions, budgets, keywords and suppliers are reassigned to it, then the custom category is removed. Leaving a custom category unmapped keeps the previous behaviour (grouped under "Custom categories (migration)") and never blocks the migration (#259).
Changed
-
Import: the format of a source — including the amount mode (single amount, or separate debit and credit columns) and the sign convention (expenses written negative or positive) — is now stored in full on the source itself and restored exactly as you set it. Until now those two settings were only kept on templates, and reopening a configured source re-derived the mode and silently reset the convention to "expenses negative"; a source you had configured for positive expenses came back on the default at its second import. Reconfiguring a source is unchanged, but a source configured once is never guessed at again. The sign-convention selector is now hidden in debit/credit mode, where it never applied (your stored value is left untouched), and your configuration is written only once the import actually runs — abandoning the wizard at the duplicate-check step no longer leaves a half-saved configuration behind (#323, #324, #328).
-
The application now unlocks its modules per edition — Free, Base or Premium, resolved from your license key. Free keeps the Dashboard, CSV Import, Transactions, Categories, the Trends report (and the Reports hub), encrypted export/import and the changelog, with a single profile. Base additionally unlocks Budget, Adjustments, the four advanced reports (Highlights, Compare, Category analysis, Cards), multiple profiles and automatic updates. Premium additionally unlocks the full Balance module (net worth, per-security detail, market prices). Locked modules stay visible — a lock badge shows in the sidebar and on the report tiles — and opening one shows an unlock screen with an "I already have a key" shortcut to the license card; the online "Get Base / Premium" purchase button is shown but disabled for now ("coming soon"). Locking is never destructive: whatever the edition, your data is kept untouched and everything reappears as soon as a valid key is entered — on Free your active profile always stays accessible, only creating or switching to another profile is locked (#297, #298, #299, #300, #301).
Fixed
- Import: a statement whose debit and credit columns are written in that order (
Date;Description;Credit;Debit) used to have every single sign inverted — expenses imported as income and income as expenses. The two columns were told apart by their position, never by their label. They are now identified by their header, so the order they appear in no longer matters (#327). - Import: on the many banks that write
0,00in the unused column instead of leaving it empty, every expense used to import as 0,00 and simply vanished from your ledger, with no error anywhere. Amounts are now computed as credit minus debit, which needs no special case for a zero cell. A row that cannot be read in either column is reported as an error instead of being silently written as a free 0,00 transaction, and an amount column left unmapped is now reported up front rather than falling back to reading the date column (#325). - Import: amounts carrying a trailing currency code or accounting marker were read a hundred times too large —
100,00 CADimported as 10 000,00 and passed every validation, since only the leading digits were read and the rest was discarded. Such a value is now rejected as unreadable and reported on its row. Accounting forms are handled properly instead:(50,00)and50,00-both read as −50,00. The same fix applies to the CSV import of securities into a balance snapshot, where a price written150,25 CADused to be stored as 15 025 and an unreadable quantity was silently saved as a zero-value position (#325). - Import: in a file where one column uses a comma for decimals and another a period,
1.234could be read as 1234 in one place and 1,234 in the other. The decimal separator is now decided per column, from that column's own values (#325). - Import: a statement with positive amounts plus a separate "D" / "C" indicator column used to be indistinguishable from an all-positive file, so it was configured as "expenses positive" and every deposit imported as an expense. This layout is now detected and refused with an explanation, instead of being imported backwards. Re-export the statement with signed amounts, or with separate debit and credit columns (#327).
- Import: a header row whose first cell starts with digits (a column titled
2025, for example) was mistaken for a data row, and the header was imported as a transaction. Header rows are now recognised by their labels as well as their shape (#325, #327). - Data export/import: restoring a backup was not wrapped in a transaction — a constraint failure partway through would abandon the restore after the existing data had already been wiped, destroying your financial history with no rollback. The wipe and the restore now succeed or fail as a whole. Restoring into a profile that already had import templates also no longer fails on a name collision (#331).
Security
- Updated two Rust dependencies sitting on the automatic-update path, clearing six RustSec advisories:
rustls-webpki0.103.9 → 0.103.13 (certificate name-constraint handling and certificate-revocation-list parsing, including a reachable panic) andtar0.4.44 → 0.4.46 (arbitrary directorychmodby following symlinks during extraction, and mishandled PAX size headers). Both are pulled in bytauri-plugin-updater: the TLS one runs on every update check and download, while the archive one is only reached by installer formats this app does not ship — it was updated anyway rather than reasoned around. No behaviour change. One further advisory is still reported against the lockfile and does not apply to the shipped product:rsais never compiled at all, its only parent being a MySQL driver that a SQLite application never builds. It is recorded as accepted, with its justification and the conditions for removing it, instead of leaving the daily security audit permanently red. The two advisories againstquick-xmlwere accepted the same way for a few hours, then resolved outright:plist1.10.0 turned out to ship the fixedquick-xml0.41.0 (#310, #312). - Updated the build-time dependency
postcss(8.5.13 → 8.5.23), clearing GHSA-r28c-9q8g-f849 (path traversal while auto-loading a previous source map from asourceMappingURLcomment, leading to arbitrary.mapfile disclosure). Build tooling only, no runtime or behaviour change — the generated CSS is byte-for-byte identical. One advisory remains reported againstreact-router, and is deliberately left as is: it targets the React Server Components mode, which a local desktop app never runs, and no fix exists to move forward to sincereact-router-domis frozen at 7.18.1 (leaving the affected range would mean migrating to react-router v8, not bumping a version) (#311). - Updated the Rust dependency
h2(0.4.13 → 0.4.19), clearing RUSTSEC-2026-0258 (empty HTTP/2DATAframes are accepted and queued without any limit: on a stream that is not actively drained, memory grows unbounded and the queued length can overflow into a panic). Low severity, denial of service only.h2is hyper's HTTP/2 layer, and it sits on two paths this application does take: the automatic update check and download, throughtauri-plugin-updater, and the licence, authentication, market-price and feedback calls, through the app's ownreqwest. Each of those is an outbound request to a server the application itself picks, so reaching the flaw takes a hostile or compromised endpoint rather than an exposed listener — it was updated anyway rather than reasoned around, on the same grounds as therustls-webpkibump before it. No behaviour change: only the lockfile moves,Cargo.tomlis untouched (#343).
Installation
Windows : Téléchargez le fichier
.execi-dessous.
Linux : Téléchargez le fichier.debou.AppImageci-dessous.Downloads
-
Source code (ZIP)
4 downloads
-
Source code (TAR.GZ)
3 downloads
-
Simpl Resultat-0.15.0-1.x86_64.rpm
2 downloads · 9.3 MiB
-
Simpl Resultat-0.15.0-1.x86_64.rpm.sig
2 downloads · 428 B
-
Simpl Resultat_0.15.0_amd64.deb
6 downloads · 9.3 MiB
-
Simpl Resultat_0.15.0_amd64.deb.sig
4 downloads · 424 B
-
Simpl Resultat_0.15.0_x64-setup.exe
9 downloads · 5.2 MiB
-
Simpl Resultat_0.15.0_x64-setup.exe.sig
2 downloads · 428 B
-
latest.json
3 downloads · 12 KiB
- Import: opening a source you have never configured now detects its format on its own — delimiter, encoding, date format, and which column holds the date, the description and the amount. Columns are recognised by their header label in French and in English (