Releases: Bubbles840/wealthfolio-simplefin-addon
Release list
v1.24.1: don't offer to mark a transfer as a transfer
Fixed: the import notice offered "↔ Mark one as a transfer" on an in-transit transfer placeholder — a transfer the sync had already recognized, waiting for its counterpart leg to arrive in the other bank's feed. The menu filtered candidates by activity type alone, and the placeholder deliberately wears a spending type (Wealthfolio has no budget-neutral outflow type on cash accounts), so it walked straight through.
Tapping the button would have been worse than redundant: the taught rule would match the descriptor of your own bank, converting every future deposit from it into a transfer leg. Placeholders are now excluded outright.
Also fixed: the Wealthfolio database path had thirteen hand-written fallbacks in three different spellings, three of which silently skipped their feature. One constant now, and the companion complains loudly at startup if the database file is missing — a report built against a missing file describes a perfectly healthy-looking empty month, which is the one failure that must never be quiet.
Addon: install simplefin-sync-1.24.1.zip below via Wealthfolio → Settings → Add-ons.
Companion:
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml pull simplefin-sync
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d simplefin-syncv1.24.0: self-check
The daily report now tells you when something is wrong with the pipeline itself.
Every signal involved was already published and already readable — but only by running /status, and nobody runs /status unless they already suspect something. The failures that actually hurt are the ones nobody thinks to check for: an account that silently stopped syncing, a feed that went quiet weeks before the balance looked wrong. Absence is their only symptom.
The checks now run on their own and report into the message already being read:
- the sync has been failing, for how long, and with what error
- no successful sync in over 12 hours — comfortably past the 4-hour default, so an ordinary skipped run never cries wolf
- a SimpleFin account is unmapped, so nothing from it is syncing (named, because the name is the whole fix)
- an account has sent no new data in over 14 days, which SimpleFin does not report as an error
- the health signal could not be read, reported distinctly from "healthy" — a 401 rendering as a clean bill of health is how a dead connection reads as fine
Nothing is added on a healthy day. A reassurance printed every single day stops being read long before the day it is wrong; the existing ✅ synced Nh ago footer already carries proof of life.
Deliberately not a second notification channel — another stream of alerts is a stream that gets muted, and a muted channel is worse than none because it looks like coverage.
Addon: install simplefin-sync-1.24.0.zip below via Wealthfolio → Settings → Add-ons.
Companion:
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml pull simplefin-sync
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d simplefin-syncv1.23.0: the three silent-failure gaps
Closes the three known issues that had been deferred as "visible when they happen".
A dismissed charge no longer shrinks every category. Dismissing an uncategorized charge means "not spending I need to file", but its amount kept counting toward the month's pool — so one dismissed charge quietly reduced every category's figure with nothing on screen explaining why. Count and total are filtered together in SQL so they cannot describe different rows.
A refund larger than a month's spend no longer inflates a category past its budget. budget - monthSpent exceeds the budget once spend goes negative — $350 left on a $300 category — and since these figures feed the pool, one inflated category overstated all of them.
Scheduled reports retry for ~2.5 minutes (was 11 seconds). The old budget covered an instantaneous blip; a real Telegram outage is minutes. Still bounded, because a daily report an hour late describes a day already spent into.
Permanent rejections surface immediately. Bad token, wrong chat id and malformed Markdown fail identically every attempt, so they no longer consume the retry budget before being logged.
Addon: install simplefin-sync-1.23.0.zip below via Wealthfolio → Settings → Add-ons.
Companion:
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml pull simplefin-sync
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d simplefin-syncv1.22.2: no line promises money the month lacks
Fixed: a category that blew the week's pace but still held month budget rendered ⚠️ $62 over · $36 left mo — and that left mo figure ignored the pool cap, so it could exceed what every category combined had left. One report showed $36 left mo directly above 🚨 $93 over budget this month.
1.21.0 scaled the weekly figure and deliberately left month figures raw, on the rule that they state a fact about the budget. That holds for 🚨 $329 over, which promises nothing, and fails for $36 left mo, which promises spendable money exactly as a weekly figure does. The cap now applies wherever a figure is money still available, and nowhere it isn't:
- Pool healthy → unchanged.
- Pool tight → scales with everything else.
- Pool gone →
$0 left mo, agreeing with the headline instead of contradicting it. - Capping switched off → stays raw, per that mode's contract.
The other reports were audited for the same class of bug and are clean: the weekly check-in works on totals (inherently a pool), and the monthly wrap-up is retrospective.
Addon: install simplefin-sync-1.22.2.zip below via Wealthfolio → Settings → Add-ons.
Companion:
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml pull simplefin-sync
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d simplefin-syncv1.22.1: report the version the build actually is
v1.22.0 displayed itself as 1.21.0. Both halves show one constant (shared/version.ts) and the release bumped package.json/manifest.json without it. Only the version strings were wrong — the 1.22.0 features were genuinely there.
If your Sync page footer reads addon v1.21.0 · companion v1.21.0 after installing 1.22.0, this is why. Install below and it will read 1.22.1.
Also in this release:
- A tag push now verifies the tag against all three version strings in CI, before the registry login, so a mismatched tag publishes nothing. The guard test for this already existed; it just wasn't forced to run after a version bump.
- Report content said "These three apply immediately" after the weekly-capping dropdown made it four.
Addon: download simplefin-sync-1.22.1.zip below → Wealthfolio → Settings → Add-ons → install from file.
Companion:
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml pull simplefin-sync
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d simplefin-syncv1.22.0: weekly per-category amounts are now a choice
1.21.0 capped each category's weekly figure by what the month could still afford, so the report could not promise money that was gone. But that answers only one of two reasonable questions — and when the pool is tight, the capped figures collapse toward each other and stop showing which category actually has room.
So it is now a setting: Notifications → Report content → "Weekly amounts per category".
- Limited by what the month can afford (default, unchanged from 1.21.0) — figures are scaled so they cannot add up to money the month no longer has.
- The full budget for each category — Wealthfolio's own envelope view. The categories stay distinguishable, and because envelopes overstate once the pool is short, the subtitle names the pool outright:
left in each budget · only $150 left overall.
Both states are honest; they answer different questions, and the report always says which one it is showing. The monthly headline is identical either way — the setting only moves the per-category figures.
Stored as an opt-out, so existing installs keep the current behaviour with no migration.
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml pull simplefin-sync
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d simplefin-syncv1.21.0 — Weekly figures can't promise money the month lacks
Changed
A category's weekly figure can no longer promise money the month does not have.
The daily digest was printing two budgeting models at once, and they contradicted each other. The category lines are envelopes — Groceries has its own $80 whatever else happens — while the headline is a pool. With one category far over, every other envelope went on offering its full weekly allowance: money that did not exist.
Weekly figures are now scaled by what the pool can actually cover, and the subtitle says which state you're in:
| state | subtitle |
|---|---|
| room for everything | left to spend this week |
| pool short | left to spend this week · reduced to fit what is left overall |
| month spent | the month is spent — nothing left to spend this week |
The month figure on each line is untouched — that states the envelope, which is a real fact about your budget. It's the spend-this-week number that must not over-promise. Off-budget and unfiled spending count against the pool too: money gone is gone, whatever it was labelled.
One consequence worth knowing: these weekly figures now deliberately differ from Wealthfolio's per-category view, which is pure envelope budgeting.
Upgrading
Companion-side only:
docker compose pull simplefin-sync
docker compose up -d simplefin-syncv1.20.1 — One figure in the daily headline
Changed
The daily headline is one figure again.
It had grown a parenthetical — · after $100 off budget & uncategorized — which was accurate and still cluttered the one line most people actually read, putting three numbers where the question has one answer.
💰 $181 left this month · 10 days to go
Nothing is hidden: the Off budget and Uncategorized blocks directly above it still itemise every dollar involved, so the arithmetic stays checkable by looking up rather than by reading the headline twice.
The figure itself is unchanged — still net of both.
Upgrading
Companion-side only:
docker compose pull simplefin-sync
docker compose up -d simplefin-syncv1.20.0 — No more silent failures
Three fixes for the cases that fail quietly — the only kind that costs you anything when you are not watching.
Added
A transaction the bank reported but Wealthfolio refused is now announced.
Wealthfolio rejects a create when its own date+amount check reads it as a duplicate. Usually right — and once, badly wrong: a real $1,300 withdrawal was refused as a copy of its same-amount sibling from the day before, and the account was wrong by that amount for six weeks, because the refusal was logged at debug level and surfaced nowhere.
It's a message now, worded as a question rather than an alarm, since most refusals genuinely are duplicates and only you can tell which kind it is. Nothing is auto-retried — inventing a second copy of a real transaction is the worse error.
Changed
"Mark one as a transfer" shows what the rule would catch before writing it. The rule is a text match applied to everything, so a generic descriptor like ACH WITHDRAWAL would retype every such transaction as a transfer and remove all of it from spending — silently, and retroactively. The confirm step names the pattern and counts what else it matches. It also warns when an earlier rule already shadows the new one, since the first matching rule wins.
An Amazon label no rule matched is left unfiled, rather than filed under the default. Filing on a guess buried it where nothing showed it; an unmatched label now stays in the needs-a-category list, which is what the "N need a rule" count is for. Set a category — in the card or with the Change: <label> button — and it files from then on.
Upgrading
Both halves changed:
Addon: install simplefin-sync-1.20.0.zip below via Settings → Add-ons.
Companion:
docker compose pull simplefin-sync
docker compose up -d simplefin-syncv1.19.0 — Teach the sync what a transfer is
Added
Teach the sync what a transfer is, from Telegram.
The import notice now carries ↔ Mark one as a transfer. Tap it, pick the transaction, and a matching rule is written — the next sync retypes that transaction and every future one like it, so it stops counting as spending.
This exists because a keyword list can never be complete. v1.18.1 widened the built-in patterns for card payments, but the case that prompted it was Payment to Ccb Credit Card Payments — where "Ccb" is Coastal Community Bank, a string no list would ever have contained. One tap handles whatever the patterns miss, permanently, for any wording your bank happens to use.
- The rule is the payee wording with trailing reference numbers dropped, so it matches the next payment rather than one day's reference.
- Direction comes from how the transaction imported — never guessed.
- Rules are appended, so anything you wrote by hand keeps its precedence.
- Everything stays editable under Advanced → Transaction Rules.
Upgrading
Companion-side only:
docker compose pull simplefin-sync
docker compose up -d simplefin-sync