Releases: arangutambo/finance-tracker
Release list
0.8.0
Bills know which cycles a price change actually applies to.
- Fixed: a scheduled price change was ignored by every projection. A bill repricing on
15 Aug whose next payment is not until 8 Oct was still shown, totalled, and projected at
its old price — the new amount only took effect once the change date passed, regardless
of whether any payment remained at the old price. Per-month/per-year totals, the runway
target and "due next 30 days" now price each cycle at what will actually be charged.
Logging is deliberately unchanged: Log now and auto-log still use today's price, since
a payment made today is charged today's price. - Fixed: a bill with an End Date or Payments Left was projected past its own end in the
runway and due-within windows. - Upcoming-payments preview in the edit-bill dialog. The next eight cycles are laid out
with the price each one will be charged at, the first repriced cycle highlighted, and a
plain-language summary ("3 more payments at $89.00, then $66.50 from 10 Nov 2026"). It
updates as you type, so a change date set a few days either side of a due date shows its
consequences before you save. - Payment calendar in the recurring-payments block: a month grid of when bills actually
land, built like the trip planner's planned-expenses calendar — dots per bill, daily totals,
click a day for the detail. Overdue, normal and repriced payments are dotted differently.
Weeks with nothing due are skipped. 1 month / 3 months / 12 months buttons switch the
horizon for the session, Settings → Dashboard → Payment calendar range sets the default,
andmonths:in the block config pins it per note. - The 12-month range gets its own compact view. A year of week grids is 52 stacked rows —
the same information, unreadable. At twelve months the calendar switches to a month-per-row
heat grid: one line per month, one small cell per day-of-month, shaded in four bands by that
day's total, with the month's total down the right-hand side. Because bills recur on the same
day each month, the vertical stripes are the pattern — the 9th and the 14th being heavy
every month reads in one glance. Repriced and overdue days keep their own colour, and clicking
any cell opens the same day detail. - Fixed: skipping a cycle could invent a bill called "Skipped This Cycle". When a bill's
tag carried no item name, Skip cycle wrote a bare#log/spending/subscriptions/monthly
line, and the next parse — having no name to go on — named a bill after the marker's own
note text. Skipping that wrote another nameless line, so the ghost renewed itself every
cycle. A $0 line is now only ever a skip marker for a bill that already exists, and the
skip line always names its bill. - The bill row now leads with what the next payment costs, and says how many cycles remain
at the old price rather than only naming the change date.
Two new capture methods, and the ability to run them all at once.
- Batched queue.
obsidian://finance-capture?lines=…accepts a whole queue of
transactions in one open, so an Apple Pay automation can accumulate spending on the phone
all day and flush it with a single app switch instead of foregrounding Obsidian on every
tap. Each line is parsed independently — one bad line lands inInbox/_failed/with the
reason and never costs you the rest of the batch. - GitHub gist capture. The phone appends a capture line to a private gist and the plugin
polls it, logs what's waiting, and clears it. This is the only method that captures without
opening Obsidian and works on an Obsidian Sync vault — and the only one that works from an
Apple Watch. The drain re-reads before clearing, so a transaction added mid-sync is
preserved; if the gist was rewritten underneath it, it is left alone and says so rather than
destroying captures. - Capture methods can be switched on and off individually (Settings → Capture methods) and
are designed to run together. Quick add and hand-typed bullets always work and have no toggle. - Cross-method duplicate detection. The same purchase arriving by two different methods is
logged once. Detection compares amount + date + merchant, but only ever across different
methods orsource=values — so two identical coffees down the same pipe are still two
entries, while one Coles charge seen by both the ANZ automation and the Wise sync is one.
Configurable as skip / warn / off, with a duplicate window (1 day by default) for feeds that
settle late. Quick add is exempt: it has its own pre-submit warning, so pressing the button
always logs. - Overlap report. Settings shows which pairs of capture methods have actually been logging
the same transactions, with a Check capture methods for overlap command for the detail —
measured from what happened rather than guessed from what each Shortcut is meant to cover. - Sync capture gist now command.
- README documents both new methods with Shortcut recipes, and adds an (explicitly untested)
Android section covering Tasker / MacroDroid / HTTP Shortcuts equivalents.
0.7.0
Run "Repair daily note totals" once after upgrading.
Fixed: daily-note totals could be wrong
The running total written onto the #log/spending root line counted numbers appearing inside a transaction's own merchant or note child lines — so Shell Coorparoo 1234 added 1234 to the total, and 7-Eleven added 11.
Dashboards, budgets and every chart were always correct (they only parse tagged entry lines); the wrong number was the one written into the note. Totals now heal whenever a note is opened, and the new Repair daily note totals command fixes an entire backlog in one pass.
Runway replaces the bill reserve
The bill reserve was an envelope you funded and drew down. Runway is simpler: a read-only figure answering "how much do I need available to be safe for the next month?", computed by walking your actual bill schedule.
Keep $395.27 available for the next 1 month
Recurring bills only, between today and 2026-08-29 · 11 bills due
Pick a period (1 week to 6 months) and whether usual spending counts, both in Settings → Runway. It shows the total, per-week and per-day breakdowns, and every bill making it up. No contributions, no balance, no bookkeeping.
A $900 annual renewal is worth nothing to the figure while it is eleven months away, and worth all $900 the moment it enters the window — because that is the month you need the money.
Existing #log/income/billreserve bullets are left alone and still count as transfers rather than income.
Bills that stop on their own
Give a recurring bill an End Date or Payments Left and it retires itself — for fixed-term contracts and instalment plans. It moves to Archived labelled ended 2027-03-01 or all payments made rather than paused, and Restart clears the terms.
Push a week moves just the next due date, leaving the cadence alone.
Foreign currency in quick add
58 USD : 83.64 obsidian sync #subscriptions/yearly/obsidian-sync
Records what you were charged and what it cost, with no stored rate. The code can go either side of the number and the separator is optional. The preview shows the implied rate so you can check you typed it right. Give only the foreign amount and it says so rather than guessing.
Quick add also warns when the same amount and merchant is already logged that day, and there is now an Add button in the sidebar.
Also fixed
- The dashboard donut ignored your Default grouping setting and always used full category paths. It also drew three concentric bands whenever any one category had a subcategory, so categories without one had their wedge repeated three times in the same colour. Now two bands, and the outer ring only appears over categories that actually split.
- Settings migrations are gated on a stored
schemaVersioninstead of re-running on every load; orphaned keys from old schemas are pruned.
Clearer interface
- One filled action per row. Log now is primary when a bill is actually due; everything else is a quiet outline. A row with six controls no longer reads as six equal choices.
- Amounts read like a receipt — separated from the name and set larger.
- 27 commands became 20. Eight
Insert … blockcommands became one picker that describes each block. - Six settings sections instead of nine, with folder paths, note filenames and the merchant map behind Advanced — plus a live status line reporting what the plugin can actually read from your vault, so a wrong folder says so instead of yielding an empty dashboard.
- User-facing copy settles on trip over "holiday". Tags, frontmatter and block names are unchanged, so nothing in your vault needs editing.
Under the hood
finance-core.js is now the single source of truth, and scripts/mirror-core.js generates main.js's core IIFE from it. npm test fails if the two diverge — the hand-maintained copy had quietly drifted in four places by 0.6.0, including a default that differed between the tested and the shipped code.
Runway and forecast arithmetic works in integer cents. ~250 lines of dead code removed. Tests: 110, up from 81, including a new tests/integrity.test.js covering write→read round trips and total-healing invariants — which is what caught the totals bug.
0.6.0
New
- Yearly & quarterly reviews — Insert yearly review / Insert quarterly review compute the period's totals, best/worst month by spend, top spending categories, and a transfers summary once and insert the finished markdown at the cursor — a frozen snapshot, not a live recomputing block.
- Recurring bills log on the real date they're paid — Log now and Skip cycle log on the date the action actually happened, not the historical due date, but the schedule stays anchored to its own cadence via a new Next Due registry override (advanced from the due date just fulfilled, not from today) — so a late payment never drifts every future due date out by the same amount. Next Due is also directly hand-editable, as a manual escape hatch.
- "Recurring bills due" sidebar card — stays in the Daily Budget sidebar until each overdue/due bill is actually logged.
- Bill reserve per-cadence breakdown — weekly bills get a per-week figure; monthly (and longer) cadences get both a per-week and a per-month figure, tracked separately, plus a per-quarter combined total.
- Variable bills (utilities and the like) — mark a bill Variable and it projects monthly/yearly totals and the bill reserve off the average of its last six payments instead of just the last one; Log now on a variable bill prompts for the actual amount instead of repeating a fixed number that was never going to be right.
- Bill reserve contributions — a shared envelope you can top up like a savings goal (Contribute to bill reserve command), with a "Saved so far" figure compared against what should already be set aside.
80 tests passing (npm test).
0.5.0
New
- Recurring bill lifecycle — pausing a bill now moves it into a collapsed Archived section of the
finance-recurringblock (click to open), with Resume and a permanent Remove completely — the bill is dropped from consideration for good, even if you log another entry with the same tag later. - Edit a recurring bill — manage mode gains an Edit action: correct the amount directly, or schedule a future price change with an exact date (e.g. "this subscription becomes $15.99 on the 1st"). The new amount applies itself automatically once that date arrives.
- Recurring payments note name is now a setting — asked once during first-time setup, changeable any time in Settings → Recurring payments.
- Merchant map moved off disk — learned merchant → category associations now live in plugin settings instead of a hand-edited
Merchant Map.mdnote. Existing notes are migrated once, automatically, and then removed. Manage entries at Settings → Merchant map. - Donut chart polish — subcategory shades are now ranked by spend (biggest subcategory lightest, smallest darkest) instead of a fixed pattern, and hovering any slice shows its name, amount, and share of the total.
- README overhaul — a full command reference table, the Apple Shortcuts capture tutorial folded in from its standalone note, and 23 real screenshots covering setup, capture, quick-add, recurring payments, dashboards, goals, splits, and net worth.
Fixed
- The Recurring Payments note no longer shows up as a selectable holiday budget or savings goal in those pickers.
updateRecurringRegistryEntrywas silently ignoring amount overrides.- Settings → Holiday budgets and → Savings goals shared one unfiltered list, so a plain savings goal (no
trip_tag) would visually appear under "Holiday budgets" — each section now only lists its own notes. - Quick-add's category/tag autocomplete was inadvertently hiding every
subscriptions/...category. - Quick-add: Enter now accepts the highlighted autocomplete suggestion (same as Tab) while the popup is open, and only submits the entry once the popup has closed.
authorUrlin the manifest pointed at a dead GitHub account; corrected to the actual repo owner.- CSS: dropped
text-decoration-thicknessandcolor-mix(), neither of which is reliably supported by the older Electron builds this plugin'sminAppVersionclaims to support.
Infrastructure
- Added
package-lock.jsonand abuildscript (no bundler —main.jsis authored directly — but it verifies the release files are present). - Added a GitHub Actions workflow that generates build-provenance attestations for
main.js/manifest.json/styles.cssand attaches them to the release.
76 tests passing (npm test).
0.4.0
New
- Recurring bill lifecycle — pausing a bill now moves it into a collapsed Archived section of the
finance-recurringblock (click to open), with Resume and a permanent Remove completely — the bill is dropped from consideration for good, even if you log another entry with the same tag later. - Edit a recurring bill — manage mode gains an Edit action: correct the amount directly, or schedule a future price change with an exact date (e.g. "this subscription becomes $15.99 on the 1st"). The new amount applies itself automatically once that date arrives.
- Recurring payments note name is now a setting — asked once during first-time setup, changeable any time in Settings → Recurring payments.
- Merchant map moved off disk — learned merchant → category associations now live in plugin settings instead of a hand-edited
Merchant Map.mdnote. Existing notes are migrated once, automatically, and then removed. Manage entries at Settings → Merchant map. - Donut chart polish — subcategory shades are now ranked by spend (biggest subcategory lightest, smallest darkest) instead of a fixed pattern, and hovering any slice shows its name, amount, and share of the total.
- README overhaul — a full command reference table, the Apple Shortcuts capture tutorial folded in from its standalone note, and 23 real screenshots covering setup, capture, quick-add, recurring payments, dashboards, goals, splits, and net worth.
Fixed
- The Recurring Payments note no longer shows up as a selectable holiday budget or savings goal in those pickers.
updateRecurringRegistryEntrywas silently ignoring amount overrides.- Settings → Holiday budgets and → Savings goals shared one unfiltered list, so a plain savings goal (no
trip_tag) would visually appear under "Holiday budgets" — each section now only lists its own notes. - Quick-add's category/tag autocomplete was inadvertently hiding every
subscriptions/...category. - Quick-add: Enter now accepts the highlighted autocomplete suggestion (same as Tab) while the popup is open, and only submits the entry once the popup has closed.
authorUrlin the manifest pointed at a dead GitHub account; corrected.- Added a lockfile (
package-lock.json) for reproducible builds.
76 tests passing (npm test).
0.3.1
- improved ReadMe
- improved quickadd transactions
- improved subcategory displays
- improved recurrent transaciton management allowing archiving and better planning
0.3.0
Everything is still plain, hand-editable markdown — tagged bullets and frontmatter.
New
- Trip reflection — once a trip's end date has passed (or the note is archived), its
holiday-dashboardblock automatically becomes a reflection: total and after-trip spend, under/over budget, average per day, biggest and quietest days, a per-category table (total, avg/day, share, biggest single expense with merchant), a spend-by-day chart, and planned vs paid. Force either mode withview: live/view: reflection. - First-time setup wizard — opens automatically on a fresh install (or via Run first-time setup): pick your folders and currency, and the starter notes (
💸 Budgets,📊 Finance Dashboard,🔁 Recurring Payments,🎯 Goals) are created from templates embedded in the plugin. Never overwrites existing notes. - Quick-add autocomplete — suggestions for categories, merchants, and
owed=people, derived from what you've actually logged plus your budget table. Arrows cycle, Tab accepts, Esc dismisses, Enter always submits. Accepting a known merchant fills in its remembered category. The hand-maintained Shortcut categories setting is gone. - Quick add from the open note — optional setting: opening quick add while a daily note is active pre-fills that note's date.
- Two-ring category donut — dashboard pies now show major categories on the inner ring and every subcategory on the outer ring as shades of the parent hue, with a nested legend. The sidebar mini pie stays at major categories.
- Recurring payments management — Open recurring payments note creates a management page (
manage: trueblock) with per-bill Log now and Skip cycle (logs a $0 entry so the schedule advances without changing the remembered price), a due-next-30-days card, and a Bill reserve section: what should already be set aside for quarterly/yearly bills and the steady per-week amount that keeps every cadence covered. - Goal contributions — Contribute to savings goal command logs the contribution bullet for you; the new
finance-goalsblock shows every goal envelope with one-tap contribute, andaccount: <key>reconciles goal balances against a real account's balance snapshot (unallocated / over-allocated). - Goal archiving parity — Archive completed savings goals joins Archive finished holidays; archive summaries now include a withdrawals table.
- Compact sidebar — budgets are slim rows (name + spent/limit + thin pace bar); hover or tap a row for the detail. The Today's-entries section was removed.
Fixed
- Trip-tagged spending no longer counts toward home budgets — it is a withdrawal from the trip's savings goal and lives on the holiday dashboard. Use
type: allinfinance-queryto include it in reports. - Mini pie chart crash in the sidebar (SVG class token error).
73 tests passing (npm test).
0.2.1
Fixes the daily-note folder autodetect taking Journals per-date folder templates (e.g. Journal/Daily/{{date:YYYY}}/{{date:MM}}) literally, which made every dashboard and the sidebar show $0.00. The static folder prefix is now used, and a bad value persisted by 0.2.0 is healed automatically on load.
0.2.0
Everything is still plain, hand-editable markdown — tagged bullets and frontmatter.
New
- Recurring payments — tag a bill once with a cadence subtag (
#log/spending/subscriptions/monthly/spotify) and thefinance-recurringblock shows upcoming and overdue bills (one-tap Log now) plus per-month/per-year totals. Optional auto-log on the due day. - Unified goals — savings goals and holiday budgets share one frontmatter schema. Any goal with
target_amount+due_dateshows sinking-fund math (set-aside per week, ahead/behind pace); a holiday is a goal with atrip_tag, dates, and currency. Legacyholiday_tag/savings_goal_*notes still parse. - Multiple holidays & archiving — save for several holidays at once (per-note active toggles in settings), and Archive finished holidays freezes each ended trip's savings steps and spending record (during and after the trip) into the note before moving it out of the active set.
- Split expenses —
split=Nandowed=Name:$Xin quick-add andobsidian://finance-capture; hand-editable#log/owed/<person>child lines; budgets count only your share;finance-splitsblock, sidebar card, and a Settle up command that logs the repayment as income and marks entries settled. - Trip mode — Start trip / End trip; captures default to the trip tag and trip currency with conversion through the note's exchange rates; sidebar shows spent-today, trip budget remaining, and safe $/day.
- Forecast —
finance-forecastprojects recurring income minus bills minus trailing-90-day discretionary spend (including goal set-asides) forward N months, with a "~$X by date" headline. - Net worth — Snapshot balances logs
- $5,230.00 #log/balance/anz-plusbullets into today's note;networth-dashboardrenders the balance trend. No extra files. - Query block —
finance-query: filter by category/tag/merchant/date range, group by category/merchant/month, sum or count; views include ranked category tables with percentages, monthly income-vs-expense bars, and a cumulative balance line. - Hue-family colours — every chart gives each major category one hue with subcategory shades; pies and legends rank by group with nested subgroups.
- Daily-note folder and date format auto-detected from the Journals or core Daily notes plugin.
Fixed
- Child lines (merchant/note/owed) now attach only to their own parent bullet.
68 tests passing (npm test).
0.1.0
Initial release. Log spending as tags in your daily notes and turn them into pace-aware budget, holiday, and savings dashboards. Capture via Apple Shortcuts or the quick-add modal.