github we-promise/sure v0.7.1
Sure v0.7.1 - Bank Sync cleanup, Statement Vault and DS overhaul

latest release: v0.7.2-alpha.1
5 hours ago

Another big release, folks (see the stats below if you don't believe me!)

The most visible change is probably the Bank Sync refresh. It’s cleaner, easier to follow, and just feels better than what we had before. Gone is the confusing "information only" screen, with separate Providers setup.

image

A second major addition is Statement Vault, which gives us a much better workflow for uploading, organizing, and verifying statement coverage.

image

The other thing that deserves a real mention is the design system overhaul. A lot of the product feels sharper in this release because a lot of UI work landed across shared primitives, component migrations, accessibility fixes, and consistency improvements throughout the app. This was a substantial part of the cycle.

There are also a lot of smaller but still meaningful improvements across dashboard exploration, banking reliability, linked account behavior, and general polish.

One useful way to frame the size of this release is the raw volume: v0.7.1 includes 206 merged PRs, which makes it larger than v0.7.0 by this count. Roughly a quarter of those PRs were design-system related or design-system-driven, so this wasn’t just a feature release — it was also a broad product-quality pass.

Recent release stats

Release — Month    Issues   PRs Closed
v0.6.5 — 2025-11       27   101 PRs (+1 hotfix / 7 PRs)
v0.6.6 — 2025-12       22    55 PRs (+1 hotfix / 2 PRs)
v0.6.7 — 2026-01       56   162 PRs
v0.6.8 — 2026-02       48   113 PRs
v0.6.9 — 2026-03       73    92 PRs
v0.7.0 — 2026-04       73   129 PRs (+3 hotfixes / 8 PRs)
v0.7.1 — 2026-05      105   206 PRs

Mobile Debug Builds

This release includes debug builds of the mobile applications. Download from the Assets area below.

  • Android APK: Debug build for testing on Android devices
  • iOS Build: Unsigned iOS build (requires code signing for installation)

Note: These are debug builds intended for testing purposes. For production use, please build from source with proper signing credentials.

What's Changed

  • fix: skip DemoFamilyRefreshJob in self-hosted mode by @wps260 in #1578
  • Move versioning from Rails initializer to .sure-version file by @jjmata in #1587
  • Fix SimpleFIN inverting Loan account balances by @GermanDZ in #1574
  • fix: run TestFlight upload on v* tags by @sure-admin in #1582
  • fix: currency being ignored for properties by @thiagodsti in #1556
  • fix: change postal_code column from integer to string by @thewillwilson in #1585
  • Improve error handling with user-friendly messages and classification by @jjmata in #1591
  • fix: Enable and persist notes and tags on split child transactions (#1535) by @xingxing21 in #1552
  • Added ability to bulk-edit transaction names for multiple selected transactions by @DataEnginr in #1553
  • Fix invite code being consumed on failed registration in invite-only mode by @francmart514 in #1576
  • Performance improvements in balance sync cache by @wps260 in #1581
  • fix(mobile): stop app icon source overwrite by @sure-admin in #1594
  • fix(imports): preserve account status from backups by @JSONbored in #1603
  • fix(budgets): stop auto-matched transfers leaking into category cards by @gariasf in #1588
  • fix(imports): preserve Sure opening balance history by @JSONbored in #1595
  • fix: use ProviderLoader for AuthConfig.sso_providers when DB providers enabled by @thewillwilson in #1614
  • refactor(design-system): single-source design tokens via DTCG JSON by @gariasf in #1604
  • feat(api): expose complete account export state by @JSONbored in #1597
  • fix(design-system): give cyan-900 a darker value than cyan-800 by @gariasf in #1619
  • feat(tokens): add $version field + document versioning policy by @gariasf in #1620
  • feat(design-system): live tokens reference page in Lookbook by @gariasf in #1618
  • feat(api): expose valuation history index by @JSONbored in #1596
  • feat(api): expose rule export endpoints by @JSONbored in #1602
  • feat(api): add recurring transaction endpoints by @JSONbored in #1600
  • fix(design-system): make inline <code> visible in prose dark mode by @gariasf in #1625
  • chore(design-system): replace dead Bootstrap classes with Sure tokens by @gariasf in #1621
  • feat(api): accept Sure NDJSON imports by @JSONbored in #1601
  • feat(api): expose import status details by @JSONbored in #1599
  • Optimize and Fix provider price fetches for sold securities and batch queries by @wps260 in #1580
  • refactor(i18n): standardize product name placeholder in import mappings by @sentry[bot] in #1631
  • fix(recurring): make account-scoping migration resilient to legacy duplicates by @sure-admin in #1623
  • ci: use include on matrix for runs-on by @Alxandr in #1649
  • feat(api): expose reset status polling by @JSONbored in #1598
  • fix: send first-time SnapTrade users to connect flow by @sure-admin in #1613
  • fix(mercury): support named multiple API connections by @JSONbored in #1627
  • feat(api): expose family exports by @JSONbored in #1632
  • fix(chat): eager pending AssistantMessage to fix Turbo subscribe race (#1657) by @tajchert in #1658
  • feat(auth): add WebAuthn MFA credentials by @JSONbored in #1628
  • feat(api): expose family settings by @JSONbored in #1645
  • feat(api): expose rule run history by @JSONbored in #1646
  • refactor(design-system): migrate fg-* utilities to text-* and remove namespace by @gariasf in #1626
  • feat(exports): preserve recurring transactions by @JSONbored in #1638
  • Add assurance vie to investment subtypes by @HugoleDino in #1665
  • feat(api): support idempotent valuation writes by @JSONbored in #1637
  • fix(design-system): replace undefined utility classes and broken /N modifiers by @gariasf in #1660
  • chore(design-system): swap raw gray classes for semantic tokens in settings/ by @gariasf in #1652
  • chore(design-system): swap raw gray classes for semantic tokens in holdings/ by @gariasf in #1654
  • chore(design-system): swap raw gray classes for semantic tokens across remaining views by @gariasf in #1655
  • feat(erb-lint): add DeprecatedClasses cop for raw gray utility classes by @gariasf in #1656
  • feat(exports): include holding snapshots by @JSONbored in #1643
  • fix(auth): surface exact OIDC issuer mismatches by @sure-admin in #1666
  • feat(investments): add India investment subtypes and exchange support by @ahnv in #1659
  • feat(api): expose securities and price history by @JSONbored in #1642
  • feat(api): expose import row diagnostics by @JSONbored in #1644
  • fix(auth): hash MFA backup codes by @JSONbored in #1629
  • Fix OpenAI Responses API stream error handling by @GermanDZ in #1669
  • Performance improvements in holding calculation pipeline by @wps260 in #1579
  • Fix SSO icon rendering for mixed-case provider icons by @sure-admin in #1674
  • feat(accounts): Highlight matching activity search text in entry names by @bugbug11111 in #1671
  • Revert "feat(accounts): Highlight matching activity search text in entry names" by @jjmata in #1682
  • feat(api): expose balance history by @JSONbored in #1641
  • feat(entries): Add amount validation and robustify monetizable concern by @sentry[bot] in #1680
  • fix(transactions): Ignore blank date in entry params by @sentry[bot] in #1688
  • feat(api): expose budget state by @JSONbored in #1640
  • Update link text for new account to use translation by @royto in #1690
  • feat(api): expose sync status by @JSONbored in #1635
  • feat: add Hungarian (hu) localization by @brandonvers in #1677
  • feat(api): allow creating categories via API by @GermanDZ in #1676
  • feat(api): expose provider connection health by @JSONbored in #1636
  • perf(accounts): kill sidebar/sparkline N+1s and cache the sidebar by @GermanDZ in #1683
  • Fix avg_cost to return per-share cost basis by @EdeAbreu23 in #1692
  • [codex] Complete Sophtron account mapping by @jjmata in #1698
  • feat(exports): preserve transfer decisions by @JSONbored in #1639
  • Reject revoked OAuth tokens in API v1 authentication by @jjmata in #1711
  • fix(transactions): update dialog content class for new transaction view by @thomasbaker9010251 in #1693
  • feat(enable-banking): safe pending transaction merge with sync re-import prevention by @CrossDrain in #1709
  • feat(splits): add exclusion support for splits and improve rendering by @CrossDrain in #1661
  • [codex] Add Sophtron manual sync fixes by @jjmata in #1714
  • docs(agents): add Design System Hygiene checklist for UI PRs by @gariasf in #1732
  • refactor(design-system): extend DS::Alert and migrate 9 inline alert blocks by @gariasf in #1731
  • i18n(es): fill high-value locale gaps by @sure-admin in #1733
  • Bank Sync cleanup by @jjmata in #1710
  • Mobile: custom proxy headers + small login UX fixes by @tajchert in #1748
  • feat(api): add transaction idempotency keys by @JSONbored in #1729
  • fix(design-system): DS::Alert alignment, accessibility, and hierarchy polish by @gariasf in #1734
  • feat(exports): add attachment manifest by @JSONbored in #1728
  • feat(api): add import preflight validation by @JSONbored in #1755
  • test(recurring): prove export roundtrip semantics by @JSONbored in #1727
  • fix(api): include disabled-account transaction history by @JSONbored in #1723
  • fix(enable-banking): import transactions missing transaction_id and entry_reference by @CrossDrain in #1767
  • feat(providers): add Kraken exchange sync by @JSONbored in #1759
  • feat(recurring): allow marking transfers as recurring by @gariasf in #1589
  • fix(imports): import raw balance records by @JSONbored in #1724
  • fix: correct SnapTrade cash activity signs by @sure-admin in #1634
  • Scope SnapTrade orphan cleanup to current family by @jjmata in #1769
  • Constrain Lunchflow base URL to trusted endpoint by @jjmata in #1768
  • fix(binance): support CRYPTO: prefix and USD stablecoins by @plind-junior in #1771
  • feat(mobile): add suggested questions to empty chat screen by @felixmuinde in #1773
  • fix(ds/dialog): use existing i18n namespace for close button label by @plind-junior in #1776
  • feat: opening_balance_date and opening_balance(i18n) by @IamTaoChen in #1377
  • feat(exports): add rule operand references by @JSONbored in #1726
  • fix(sso): preserve user-edited name across OIDC logins by @plind-junior in #1777
  • feat(mobile): add mass delete for chats by @felixmuinde in #1779
  • Add Interactive Brokers Provider by @gian-reto in #1722
  • ci: split unit and system test jobs by @sure-admin in #1787
  • fix(enable-banking): fix pending→posted auto-claim producing badge, duplicate, and wrong date by @CrossDrain in #1783
  • fix(enable-banking): gracefully skip PDNG fetch for ASPSPs that don't support it by @CrossDrain in #1789
  • feat(sync): add Brex provider connections by @JSONbored in #1752
  • fix(simplefin): treat Vanguard/Fidelity cost_basis as total when needed by @plind-junior in #1772
  • Mobile releases workflow fix by @jjmata in #1790
  • fix(exports): align CSV roundtrip contracts by @JSONbored in #1725
  • feat(statements): add account statement vault by @JSONbored in #1753
  • fix(mobile): respect system navigation bar inset on chat screen by @felixmuinde in #1784
  • feat(balance): Preserve historical balances as waypoints for linked accounts by @CrossDrain in #1663
  • Add period navigation arrows to Reports view by @joaocbatista in #1756
  • fix(enable-banking): preserve claimed pending date on subsequent syncs by @CrossDrain in #1797
  • fix(a11y): add skip-link and aria-current="page" to application layout by @oxtensor in #1781
  • fix(rules): count blocked rule transactions by @steadyfall in #1782
  • chore: GitHub workflow to auto-deploy PRs to Cloudflare by @jjmata in #880
  • fix(preview): use worker list metadata for cleanup by @sure-admin in #1799
  • feat(i18n): extract hardcoded English strings to locale files by @brandonvers in #1806
  • chore(ci): upgrade GitHub Actions to Node 24-compatible versions by @sure-admin in #1810
  • Retry Enable Banking sync with provider-corrected date range by @sure-admin in #1801
  • Add super_admin debug event log by @sure-admin in #1816
  • Add Actual Budget CSV import flow by @sure-admin in #1830
  • fix(pwa): serve manifest for html accept headers by @sure-admin in #1828
  • feat: beta features toggle + Beta pill primitive by @gariasf in #1829
  • feat(i18n): add Hungarian translations for strings extracted in #1806 by @brandonvers in #1817
  • fix(ibkr): correct historical cash/non-cash split for linked accounts by @CrossDrain in #1813
  • feat(i18n): complete Catalan translations + extract residual hardcoded strings by @gariasf in #1836
  • i18n(en): hardcode 'One error' in sso_providers errors_title singular form by @gariasf in #1854
  • refactor: rename beta features gate to preview features by @gariasf in #1837
  • fix(design-system): bump --color-success for WCAG 1.4.11 contrast by @gariasf in #1838
  • fix(design-system): DS::Toggle focus ring, role=switch, and semantic tokens by @gariasf in #1843
  • fix(design-system): DS::FilledIcon decorative-vs-meaningful API by @gariasf in #1842
  • fix(design-system): DS::Disclosure focus ring + motion-safe chevron rotation by @gariasf in #1841
  • fix(design-system): DS::Button a11y audit — focus ring, touch target, type default, icon-only label by @gariasf in #1840
  • feat(theme): broadcast theme:change event so SVG/canvas consumers can repaint by @gariasf in #1839
  • refactor(design-system): migrate 38 hand-rolled provider buttons to DS::Button / DS::Link (#1715 §5 part B) by @gariasf in #1860
  • fix(design-system): DS::Link a11y — distinguishable default, icon-only label, external-link hardening by @gariasf in #1844
  • fix(design-system): DS::Tooltip a11y — focusable trigger, keyboard parity, Esc dismiss by @gariasf in #1845
  • fix(design-system): DS::Dialog a11y — role, aria-modal, aria-labelledby, heading_level by @gariasf in #1846
  • fix(design-system): DS::Tabs a11y — WAI-ARIA tab pattern + keyboard nav by @gariasf in #1847
  • fix(design-system): DS::Select a11y — fix aria-expanded, listbox keyboard nav, label binding by @gariasf in #1848
  • refactor(design-system): migrate single-color tokens to @theme + lint @Utility /N footgun by @gariasf in #1849
  • refactor(design-system): migrate orphan btn-- buttons to DS::Button / DS::Link (#1715 §5 part A) by @gariasf in #1859
  • feat(design-system): split DS::Menu into strict action-list + new DS::Popover by @gariasf in #1850
  • fix(entry): Guard entryable_attributes for non-transaction entries in bulk_update! by @sentry[bot] in #1877
  • fix(imports): prevent MissingTemplate for JSON requests in index by @sentry[bot] in #1875
  • optimize net_category_totals() by using memoized cache by @bittensorrider in #1881
  • fix(helm): skip Redis/DB auto-wiring when extraEnv override is set by @luckyPipewrench in #1868
  • feat(dashboard): zoom into cashflow sankey categories by @tajchert in #1807
  • fix(destroy): prevent UnknownAttributeError in DestroyJob rescue by @sentry[bot] in #1852
  • feat(imports): verify Sure NDJSON import readback by @JSONbored in #1869
  • feat(design-system): add DS::SearchInput primitive (closes #1715 §3) by @gariasf in #1853
  • feat(design-system): DS::Disclosure :card variant + migrate 14 provider items (#1715 §6) by @gariasf in #1855
  • feat(design-system): migrate 3 provider panels to DS::Disclosure :card (#1715 §6) by @gariasf in #1856
  • feat(design-system): DS::Disclosure :card_inset variant + migrate ibkr_panel + settings/_section (#1715 §6) by @gariasf in #1857
  • feat(design-system): DS::Disclosure :inline variant + migrate indexa_capital + snaptrade panels (#1715 §6) by @gariasf in #1858
  • feat(design-system): extend DS::Pill with badge mode + semantic tones (#1751 PR A) by @gariasf in #1902
  • fix(settings/debugs): replace 2 raw palette tokens (DS drift) by @gariasf in #1903
  • fix(views): guard against nil entry.date in partials by @sentry[bot] in #1878
  • fix(settings/debugs): migrate in-cell <details> to DS::Disclosure :inline by @gariasf in #1916
  • refactor(transactions): migrate 5 transaction badges to DS::Pill (#1751 PR B) by @gariasf in #1917
  • refactor(providers): migrate provider badges to DS::Pill (#1751 PR C) by @gariasf in #1918
  • docs(ds-toggle): warn against external hidden_field_tag with same name by @gariasf in #1925
  • refactor(misc): migrate misc badges to DS::Pill (#1751 PR D) by @gariasf in #1919
  • fix(design-system): DS::Disclosure :default summary_content layout by @gariasf in #1929
  • fix(design-system): DS::Menu :icon_sm variant for dense action lists by @gariasf in #1930
  • fix(design-system): restore dark-mode contrast on Toggle + destructive borders by @gariasf in #1932
  • refactor(views): migrate 6 residual inline alerts to DS::Alert by @gariasf in #1933
  • fix(admin/users): parent space-y-6 for sibling section spacing by @gariasf in #1934
  • Use date comparisons for interval thresholds by @hendriksen-mark in #1923
  • refactor(transactions): migrate transfer_match badges to DS::Pill by @gariasf in #1939
  • Prevent Brand Fetch client ID autofill by @jakearmstrong59 in #1914
  • fix : account destroyed cascade transfer destruction then … by @arumaio in #1795
  • fix(enable_banking): match bank list search against BIC, not just name by @dripsmvcp in #1874
  • chore(helm): bump pipelock to 2.5.0 and surface 2.5 config by @luckyPipewrench in #1913
  • perf: use jemalloc as the default allocator by @ahnv in #1910
  • Add automatic not-gittensor PR labeling by @sure-admin in #1957
  • fix(locale): Handle blank locale submission gracefully by @sentry[bot] in #1876
  • fix(i18n): standardize product name interpolation in import mapping descriptions by @sentry[bot] in #1956
  • fix(messages): handle blank content submission gracefully by @sentry[bot] in #1938
  • fix(trades): prevent MissingTemplate for Turbo Stream requests on update/create failure by @sentry[bot] in #1893
  • fix(views): clear Rule 2 + Rule 5 findings from weekly DS drift (#1951) by @gariasf in #1955

New Contributors

Full Changelog: v0.7.0-hotfix.3...v0.7.1

Don't miss a new sure release

NewReleases is sending notifications on new releases.