Releases: quietapps/QuietFinance
Releases · quietapps/QuietFinance
Release list
Quiet Finance 3.0.2
Changelog
All notable changes to QuietFinance (Quiet Finance) are documented here.
The format follows Keep a Changelog.
Version headings match semver derived from git log (newest-first). Xcode MARKETING_VERSION reads the same numeric line (e.g. 2.4 ≡ 2.4.0); CURRENT_PROJECT_VERSION is the build.
[3.0.2] - 2026-06-14
Added
- Full multi-currency support — accounts and receivables can use any of frankfurter.app's 31 currencies (EUR, GBP, JPY, AUD, …), not just USD/INR. Each snapshot freezes a per-currency rate table (
ratesPerUSD); the new rates editor in snapshot creation and the snapshot editor shows one row per currency in use with a single "Fetch all" action (one network request for every pair) and manual entry as fallback. Locking now requires a positive rate for every currency the snapshot actually uses — a USD-only snapshot needs none. Existing data migrates automatically (the frozen USD→INR scalar is re-encoded losslessly; locked values never change), and the legacyusd_to_inr_rateCSV column and sort field keep working. Display currency becomes a searchable menu (in-use currencies first); the FX history panel charts any frozen pair. - What-if scenario modeling — new Scenario screen forks any snapshot into an in-memory sandbox: tweak account values, add hypothetical items (a purchase, windfall, new loan), and compare against the baseline with delta net worth, before/after allocation bars, and the goal-ETA shift ("16 months sooner"). Deliberately never persisted, exported, or backed up — real data is untouched by construction. Entry points: sidebar, snapshot row menu, command palette.
- Five insight widgets (toggle/reorder in Settings → Dashboard widgets): Milestones (on-track/behind vs goal date + progress to the next round-number milestone), Currency exposure (net-worth share per currency with an "if INR weakens 10%…" sensitivity line), Debt payoff (trend payoff ETA + a live "pay extra per month" slider), Net change rate (per-month/quarter average from snapshot deltas, honestly labelled as savings + market combined), and Allocation drift (actual vs target with a concrete "move ~$X from Cash → Investment" hint).
- Welcome flow + getting-started checklist — fresh installs choose "Start fresh" or "Explore with demo data" instead of silently receiving seed data; a dashboard checklist (person → account → first snapshot → optional goal) deep-links each step and derives progress live from the store. Existing installs never see it. Replay from Settings → Data or the palette.
- Command palette upgrades (⌘K) — fuzzy matching with prefix/word-boundary scoring, recents on empty query (recently fired actions + recently opened entities), and new actions: New Account, Toggle Theme/Stealth/Compact, Export Full History CSV, Import CSV, Show Welcome Guide, Fork Latest Snapshot as Scenario.
- Filter presets + memory — Breakdown and Trends remember their last-used grouping/filters/range across visits and gain a Presets menu (save current, apply, delete).
- CSV import preview — importing now shows a dry-run sheet first: detected format, valid/issue row counts with line numbers, what would be created, and sample rows. Nothing is written until confirmed.
- Copy to clipboard — right-click the hero figure, KPI cards, or Breakdown rows for "Copy value" / "Copy row as CSV". Suppressed in stealth mode so blurred values can't be exfiltrated.
- Text size setting — Settings → Display → Text size (Default/Large/Larger/Largest) scales every label and number app-wide, including the custom Geist/Instrument Serif faces macOS Dynamic Type doesn't reach.
- Reminder interval setting — the snapshot reminder cadence is now configurable (30/60/90/180 days), and Settings warns with a System Settings deep link when notifications are denied.
- VoiceOver chart summaries — the hero sparkline, composition donut, and country bar now announce spoken summaries ("12 snapshots from Mar 2023…, change +25%"); stealth-blurred amounts are hidden from VoiceOver entirely.
Changed
- Dashboard rebuilt for speed — the 1,550-line dashboard view was decomposed into per-widget structs with a single pure compute pass: category totals now come from one sweep over snapshot values (previously fifteen filter+reduce sweeps), snapshots are sorted once per refresh, liquidity analysis moved out of the render path, and the change observers no longer allocate arrays every frame. Rendering and numbers are unchanged.
- FX fetch is resilient — transient failures (network hiccups, 5xx, 429) retry up to three times with backoff; every successful fetch now writes per-pair audit rows to the rate history.
- Failures are no longer silent — snapshot lock/unlock/delete and account deletes report save errors via a new toast system and roll back cleanly; a failed lock-time backup warns instead of being discarded; backup prune/copy failures are logged; CSV import alerts list the exact failing line numbers; undo now explains when a restore is impossible because a parent entity was deleted.
- Editor sheets auto-focus their Name field on open, so entity creation is fully keyboard-driven.
Fixed
- ~25 crash-prone force unwraps removed across forecasting, trends series-building, year-in-review, reports drilldowns, sparklines, and seed data — empty or single-snapshot datasets can no longer crash data-dependent computations.
- Unresolvable store URL no longer hard-crashes at launch — it now lands in the same in-memory safe mode as a corrupt store, with a recovery banner.
- Stale cached totals on locked snapshots — deleting an account, merging accounts, undoing a delete, importing CSV rows into an existing snapshot, or changing an account's currency now invalidates affected snapshot caches, so list and dashboard totals fall back to live math instead of showing outdated numbers.
- Notification permission race — the reminder scheduler no longer schedules before authorization resolves, and only prompts when permission is undetermined.
[3.0.1] - 2026-06-08
Added
- Inflation-adjusted (real) net worth — a "Real %" toggle on Trends restates the whole trajectory into today's purchasing power using an assumed annual inflation rate, so growth can be read in constant dollars. Forecast, CAGR, and range-change KPIs follow the toggle. Rate is configurable in Settings → Inflation rate (default 3%/yr; set to 0 to hide the toggle).
- VoiceOver support for KPI cards and the Trends chart — KPI cards now expose a combined accessibility label/value, and the otherwise-silent Trends chart announces a spoken summary (current value, range change, snapshot count, real/nominal basis).
Changed
- Graceful launch on a damaged data file — if the on-disk store can't be opened (corruption or schema mismatch), the app no longer hard-crashes on every launch. It falls back to a temporary in-memory "safe mode", leaves the on-disk file untouched for recovery, and shows a banner pointing to Settings → restore. Backup/reminder writes are skipped in safe mode so good backups aren't overwritten with a bad store.
Fixed
- Theme bugs: currency toggle flipped to dark, and "System" needed two clicks — the app pinned only the window chrome's appearance imperatively and never set a SwiftUI color scheme, so dynamic color tokens re-resolved against the OS appearance on any re-render (e.g. switching display currency turned content dark while the control still read "Light"). Theme is now driven solely by
preferredColorScheme, and the imperativewindow.appearancepath was removed. The "System" option resolves to the live OS scheme as a concrete.light/.darkvalue (via a newSystemAppearanceObserver) instead ofnil— passingnildid not re-resolve the dynamic colors in the same render pass, which is why selecting System used to take a second click to take effect; it now lands on the first click and still tracks System Settings changes. - Unreadable "draft" badge in Classic + dark mode — the emphasized pill used near-white text on a near-white fill (its background token inverts to near-white in dark). The label now uses the background token as its foreground, so it reads in both light and dark.
- Low-contrast labels in Classic + dark mode — allocation bar-segment labels now pick black or white ink from each segment's actual rendered luminance (was hardcoded black, invisible on dark segments); debt-bar diagonal stripes, empty-state illustration icons, and the Reports heatmap empty-cell dash were also lightened for legibility on dark backgrounds.
- False anomaly flags on the Dashboard — the outlier detector now requires a meaningful residual standard deviation (epsilon guard), so floating-point noise across near-identical snapshot deltas can no longer be amplified into a spurious ≥2σ alert.
Removed
- Dead Xcode template files —
Item.swiftandContentView.swift(unused since the app was scaffolded) were deleted.
[3.0.0] - 2026-05-21
Added
- Keyboard-first snapshot creation — Return advances focus to the next account field in the snapshot editor; hint text shows the shortcut. ⌘S saves draft without lifting hands from keyboard.
- Snapshot share card — "Copy card" button in the snapshot editor header renders a branded PNG (net worth, delta pill, date) and copies it to the clipboard. Ready to paste into any chat or doc.
- Anomaly flag on Dashboard — statistical outlier detection (≥2σ from trailing mean of consecutive % deltas). A banner on the hero widget surfaces unusual jumps or drops with the magnitude in sigmas.
- Year in review panel — trailing-12-month summary sheet: net change + %, highest net worth snapshot, best and worst quarter, biggest mover account. Accessible from the Dashboard hero widget.
- Breakeven calculator in Goal panel — whe...
Quiet Finance 3.0.1
[3.0.1] - 2026-06-08
Added
- Inflation-adjusted (real) net worth — a "Real %" toggle on Trends restates the whole trajectory into today's purchasing power using an assumed annual inflation rate, so growth can be read in constant dollars. Forecast, CAGR, and range-change KPIs follow the toggle. Rate is configurable in Settings → Inflation rate (default 3%/yr; set to 0 to hide the toggle).
- VoiceOver support for KPI cards and the Trends chart — KPI cards now expose a combined accessibility label/value, and the otherwise-silent Trends chart announces a spoken summary (current value, range change, snapshot count, real/nominal basis).
Changed
- Graceful launch on a damaged data file — if the on-disk store can't be opened (corruption or schema mismatch), the app no longer hard-crashes on every launch. It falls back to a temporary in-memory "safe mode", leaves the on-disk file untouched for recovery, and shows a banner pointing to Settings → restore. Backup/reminder writes are skipped in safe mode so good backups aren't overwritten with a bad store.
Fixed
- Theme bugs: currency toggle flipped to dark, and "System" needed two clicks — the app pinned only the window chrome's appearance imperatively and never set a SwiftUI color scheme, so dynamic color tokens re-resolved against the OS appearance on any re-render (e.g. switching display currency turned content dark while the control still read "Light"). Theme is now driven solely by
preferredColorScheme, and the imperativewindow.appearancepath was removed. The "System" option resolves to the live OS scheme as a concrete.light/.darkvalue (via a newSystemAppearanceObserver) instead ofnil— passingnildid not re-resolve the dynamic colors in the same render pass, which is why selecting System used to take a second click to take effect; it now lands on the first click and still tracks System Settings changes. - Unreadable "draft" badge in Classic + dark mode — the emphasized pill used near-white text on a near-white fill (its background token inverts to near-white in dark). The label now uses the background token as its foreground, so it reads in both light and dark.
- Low-contrast labels in Classic + dark mode — allocation bar-segment labels now pick black or white ink from each segment's actual rendered luminance (was hardcoded black, invisible on dark segments); debt-bar diagonal stripes, empty-state illustration icons, and the Reports heatmap empty-cell dash were also lightened for legibility on dark backgrounds.
- False anomaly flags on the Dashboard — the outlier detector now requires a meaningful residual standard deviation (epsilon guard), so floating-point noise across near-identical snapshot deltas can no longer be amplified into a spurious ≥2σ alert.
Removed
- Dead Xcode template files —
Item.swiftandContentView.swift(unused since the app was scaffolded) were deleted.
Quiet Finance 3.0.0
[3.0.0] - 2026-05-21
Added
- Keyboard-first snapshot creation — Return advances focus to the next account field in the snapshot editor; hint text shows the shortcut. ⌘S saves draft without lifting hands from keyboard.
- Snapshot share card — "Copy card" button in the snapshot editor header renders a branded PNG (net worth, delta pill, date) and copies it to the clipboard. Ready to paste into any chat or doc.
- Anomaly flag on Dashboard — statistical outlier detection (≥2σ from trailing mean of consecutive % deltas). A banner on the hero widget surfaces unusual jumps or drops with the magnitude in sigmas.
- Year in review panel — trailing-12-month summary sheet: net change + %, highest net worth snapshot, best and worst quarter, biggest mover account. Accessible from the Dashboard hero widget.
- Breakeven calculator in Goal panel — when a goal target date is set, a "Monthly needed" stat shows the savings rate required to reach the goal by the deadline.
- Modern design system — a refreshed visual layer built on the Quiet Apps design tokens (cool neutral palette, Quiet Blue
#1E88E5accent, Geist Mono numerics, 14px card radius, layered shadows). New design is the default for all users; existing design is preserved as Classic. - Design switcher in Settings — Settings → App design lets users toggle between New and Classic with visual preview swatches and an "Active" badge. Switching is instant and does not affect any data or functionality.
Changed
- Classic icon redesigned and set as default — new brand-blue gradient (#3D93D8→#0E4E8A) with ascending snapshot bars and a glow dot. All AppIcon sizes regenerated from source. Fresh installs and existing users who had Dusk migrate automatically; existing custom choices are preserved.
- Vault icon redesigned — distinct dark ink gradient (#222436→#0B0D11) with a concentric arc / timeline motif. True n=5 superellipse, matches Quiet Apps icon standard.
- Strata icon redesigned — distinct cool slate gradient (#23303F→#0D111A) with left-aligned horizontal allocation bars. True n=5 superellipse, matches Quiet Apps icon standard.
- All icons standardised — switched from
CGPath(roundedRect:)to a true parametric n=5 superellipse with 9% transparent safe-area ring, matching the Quiet Apps macOS 26 icon standard across Classic, Vault, and Strata. - Settings layout — display and UI panels (App design, Display, App icon, Dashboard widgets, Category colors, FX rate) on the left; system panels (Security, Reminders, Auto backup, Export, Import, Data) on the right. Both columns center-aligned in the content area.
- PDF export logo — Dashboard PDF header now renders the current app icon instead of the legacy "L" placeholder glyph.
- Trajectory chart fill — area fill in the net worth trajectory chart (Dashboard and Trends) uses Quiet Blue in modern mode and the ink color in classic mode, replacing the near-white slab that appeared in dark mode.
Fixed
- SwiftUI "Publishing changes from within view updates" warning in Sidebar — selection binding now defers the mutation with
DispatchQueue.main.async. - PDF export crash (
No ObservableObject of type AppState found) — stealth mode modifier converted from@EnvironmentObjectto@Environmentkey with a safe default;ImageRendererisolation no longer triggers a fatal error. - Design switch crash when sheets were open — removed
.id(app.useModernDesign)from the detail stack; design changes propagate through environment without destroying the view subtree.
Quiet Finance 2.6.0
Changelog
All notable changes to QuietFinance (Quiet Finance) are documented here.
The format follows Keep a Changelog.
Version headings match semver derived from git log (newest-first). Xcode MARKETING_VERSION reads the same numeric line (e.g. 2.4 ≡ 2.4.0); CURRENT_PROJECT_VERSION is the build.
[Unreleased]
[2.6.0] (1) - 2026-05-21
Changed
- App renamed to Quiet Finance — product name, bundle identifier (
app.quiet.QuietFinance), backup folder (QuietFinance-Backups), and all file prefixes updated. LegacyFinanceTracker-*backup files remain readable.
[2.5.0] (5) - 2026-05-08
Added
- Account merge — combine two accounts into one. Use it when a broker is renamed or duplicates appear; history is preserved on the surviving account, with overlapping snapshot values summed and cost basis combined.
- Bulk edit accounts — select multiple accounts and update person, country, asset type, status (Active / Retired), or group label in a single action. Each field is opt-in, so untoggled fields stay untouched.
- Multi-select mode in All Assets — a "Select" toggle reveals row checkboxes plus an action bar with Select all / Clear, and triggers for Bulk Edit and Merge.
Changed
- All Assets row highlight — selected rows are visually emphasized while in selection mode.
- Merge preview — the merge sheet shows moved snapshots, overlap behavior, and the combined cost basis before confirmation. A currency-mismatch guard blocks merges across different native currencies to avoid silent FX conversion of stored values.
[2.5.0] (4) - 2026-05-09
Added
- Accounts CSV import — re-import the Accounts list export back into the store. Format is auto-detected against the Full history CSV.
- Auto-lock when idle — re-engage the App Lock after a configurable period of in-app inactivity. Picker in Settings → Security: Off / 1 / 5 / 15 / 30 / 60 min.
- Sortable column headers — every grid (Accounts, People, Countries, Asset Types, Receivables, Snapshots, Diff, Breakdown, Trends). Click cycles ASC → DESC → unsorted with an arrow indicator; preference persists per-table.
- Watchlist on Dashboard — pin accounts from the Accounts grid (star icon) to a dashboard panel showing current value and delta vs prior snapshot. Click a row to focus the account.
- Drag-reorder accounts — grip handle on each Accounts row; custom ordering persists across launches and is the default sort.
Changed
- CSV import upserts accounts — re-importing the Accounts list now updates currency, institution, notes, active flag, cost basis, and asset type on existing rows instead of skipping duplicates. Summary reports updated vs unchanged counts.
- New entry forms default to display currency — New Account, New Receivable, and New Country preselect the user's chosen display currency instead of always USD.
- Deleted items in sidebar Recent are now struck through and disabled; clicks no longer silently no-op.
- Recent list trimmed from 6 entries to 5.
- Friendlier import error when the supplied CSV matches neither Full history nor Accounts list format.
[2.5.0] (1) - 2026-05-08
Added
- App lock on launch — Touch ID, Apple Watch unlock, or system password before the UI appears. Defaults to on; toggle in Settings → Security.
- Stealth mode — blurs every amount across Dashboard, KPI cards, breakdowns, and snapshot list; hover to reveal individual values.
- Menu bar item — net worth + QoQ delta in the system menu bar, refreshes every minute, click to open or refresh.
- Goal target date + progress — set a date alongside the value, get a progress bar, trend ETA, and "on track / behind" pacing.
- Net-worth forecasting — linear and CAGR projection with ±1σ confidence band on Trends; toggle method.
- Liquidity / runway panel — cash on hand, average monthly net change, runway in months at current burn rate.
- Cost basis per account — optional starting basis; "Unrealized" column on accounts shows gain/loss vs current value.
- QoQ heatmap in Reports — quarters × categories grid coloured by quarter-over-quarter Δ%.
- Snapshot completeness badge — chip on snapshot list and editor showing filled vs missing rows; missing rows highlighted red in editor.
- Stale-account flag — accounts whose last 3 snapshot values are within 0.5% are tagged STALE.
- Auto-backfill new accounts into past unlocked snapshots when opened, so values can be added retroactively. Same for receivables (with start-date awareness).
- ⌘K command palette — fuzzy jump to any screen, snapshot, account, person, country, or quick action; arrow keys + Enter to fire.
- Pinned snapshot tabs above the snapshot list for fast switching between recent / important snapshots.
- Recently viewed list in the sidebar (expanded mode) — last 6 accounts and snapshots clicked.
- Customizable Dashboard widgets — show / hide / reorder all panels via Settings, including drag-and-drop.
- Per-person "Include in net worth" toggle — track parents / partners alongside without inflating own totals; "OFF NW" badge surfaces excluded accounts. Toggle directly from the People grid.
- Inline-editable People grid — name, color, "In NW" toggle, "Active" toggle, and a quick-add row at the bottom are all edited directly in the table; no editor sheet.
- Inline-editable Countries grid — code, name, flag (click to open picker), color, default currency, and inline add row. Editor sheet retired.
- Person isActive flag — archived persons hide by default via "Show inactive" header toggle; rendered dim. Net-worth aggregation still uses the separate "In NW" flag.
- Sidebar collapse + resize — auto-collapse to icons below 140 pt with hover labels, draggable divider, manual toggle button, last expanded width remembered.
- Compare bar on Dashboard — segmented "vs Previous / vs Year ago" drives the hero delta chip and KPI deltas.
- Hover tooltips on Trends total chart and Account history chart — vertical rule + point + annotation card with date and value.
- Three-level breadcrumb —
Screen › Filter › Snapshotin TopBar, with active snapshot context where it matters. - Pre-cached snapshot totals on lock for fast Dashboard / list rendering.
- Backup verify counters for Receivables and Receivable Values.
- Two new app icon options: Vault and Strata, alongside Quiet Finance default and Classic.
- Money Flow view in the snapshot diff screen — Sankey-style visual showing how each account's value moved between two snapshots, with new and dropped accounts highlighted.
Changed
- App display name is now Quiet Finance everywhere user-facing (was "Finanace Tracker"). Bundle name fixed so the Dock tooltip and About panel match.
- New default app icon — gold L monogram with ledger lines on a dark squircle. Old icon kept as "Classic" option.
- Hero on Dashboard — embedded full-width sparkline below the figure (previously a separate panel), inline delta chip beside the number, eyebrow + compare bar on a single row, footnote moved below.
- Hand cursor appears on every clickable element — buttons, chips, theme toggle, share icon, slice rows, search results, and more.
- ⌘S saves any open editor sheet; Esc closes; if there are unsaved changes Esc / Cancel prompts to save / discard / cancel.
- Enter triggers the primary button on every confirmation dialog and popup (delete, restore, lock, unlock, reset, save, etc.).
- Snapshot editor rows sort alphabetically by account name.
- Search dropdown results now open the relevant editor / detail sheet directly instead of just landing on the screen.
- Active snapshot chip is always pinned in the TopBar across all screens; placeholder shown when no snapshots exist yet.
- Color-coded chart series — Account history, Account detail trajectory, and Reports drilldown chart now use the asset-type's category color instead of single ink.
- Click on a Dashboard donut slice navigates to Breakdown filtered to that slice (no hover-redirect side-effect).
- App icon picker tiles redesigned: smaller previews, tighter spacing.
- Backup file naming moved to
Quiet Finance-*prefixes; legacyQuietFinance-*files still listed and restorable. - Verify backup summary is now a wrapping multi-line readable line with full label names instead of a truncated single line.
- Settings → Security panel redesigned with grouped row icons, status meta, and dedicated disclaimer; placed at the top of the right column.
- Sidebar shows the chosen app icon (instead of a static "L"); resize is now smooth (no jitter from per-frame disk writes).
- Account editor removes the unused "Group" field. Adds optional cost-basis input.
- Empty-state screens replace the lone "—" with a contextual SF Symbol illustration in a subtle disc.
- KPI deltas automatically switch label and reference between QoQ and YoY based on the Dashboard compare bar.
Fixed
- Dock and Finder tooltip showing QuietFinance; now reads Quiet Finance.
- Sidebar resize jitter under live drag.
- Several confirmation dialogs missing default Enter shortcut.
- Snapshot editor: receivables and newly-added accounts not appearing in older snapshots — now auto-backfill on open (unlocked snapshots only).
[2.4.0] - 2026-05-01
Source: git 121f19c
Added
Receivable/ReceivableValueSwiftData models;Snapshot.receivableValuesrelationship.- Receivables management UI:
ReceivablesView,ReceivableEditorSheet. - CSV and PDF export paths extended for receivable rows.
- Dashboard treatment for pending receivables (shown outside net worth).
Changed
- App schema and navigation updated for receivables; QuietFinanceApp SwiftData
Schemaincludes new m...