github we-promise/sure v0.7.2

4 hours ago

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 PWA: back/X buttons untappable in wizard layout (budget edit) by @lolimmlost in #1076
  • Fix: Yahoo Finance provider Cookie/Crumb Auth by @happytechca in #1082
  • refactor: Improve enable banking panel rendering context by @sentry[bot] in #1073
  • fix: maintain activity tab during pagination from holdings tab by @tedawf in #1096
  • feat(helm): add Pipelock ConfigMap, scanning config, and consolidate compose by @luckyPipewrench in #1064
  • Add external AI assistant with Pipelock security proxy by @luckyPipewrench in #1069
  • feat: Enable Skylight ActiveJob probe for background worker visibility by @happytechca in #1108
  • Add Pipelock operational templates, docs, and config hardening by @luckyPipewrench in #1102
  • Backfill category for pre-#924 investment contribution transfers by @luckyPipewrench in #1111
  • Add safe-area padding for PWA on import page by @alessiocappa in #1113
  • Add budget rollover: copy from previous month by @lolimmlost in #1100
  • fix: Parse transfer date parameter by @sentry[bot] in #1110
  • Fix uncategorized budget category showing incorrect spending by @lolimmlost in #1117
  • Complete Spanish (es) translations across all locale files by @andreugordillovazquez in #1112
  • Replace whole-file pipelock exclude with inline suppression by @luckyPipewrench in #1116
  • Expand AI docs: external assistant, MCP, architecture, troubleshooting by @luckyPipewrench in #1115
  • Add dynamic assistant icon: OpenClaw lobster SVG for external assistant by @jjmata in #1122
  • Remove fixed height on budget chart by @alessiocappa in #1124
  • feat: Enhance holding detail drawer with live price sync and enriched overview by @happytechca in #1086
  • Fix holdings table on mobile by @alessiocappa in #1114
  • New select component by @alessiocappa in #1071
  • Fix [1018]: Add Date field when entering Account Balance by @michelroegl-brunner in #1068
  • Fix nil-key collision in budget category hash lookups by @lolimmlost in #1136
  • Group users by family in /admin/users by @jjmata in #1139
  • Feat: add missing German locals by @michelroegl-brunner in #1065
  • Enhance logging in search_family_files.rb for vector store debugging by @jjmata in #1033
  • fix(helm): use expected health endpoint by @imnotjames in #1142
  • Guard error.message with rescue in LLM failed-usage recording by @jjmata with @Copilot in #1144
  • Enable Google SSO account creation in Flutter app by @jjmata in #1164
  • Check for pending invitations before creating new Family during SSO log in/sign up by @jjmata in #1171
  • Enforce one pending invitation per email across all families by @jjmata in #1173
  • Add default family selection for invite-only onboarding mode by @jjmata in #1174
  • Make categories global by @sokie in #1160
  • Fix: Remove blank amount from transaction entry parameters by @sentry[bot] in #1178
  • Move account logo determination in dedicated method by @alessiocappa in #1190
  • Add "Transaction account" as rule condition filter by @alessiocappa in #1186
  • Require admin role for API family reset endpoint by @jjmata in #1189
  • Fix Plaid link script loading and first-sync account linking by @chasestech in #1165
  • Administer invitations in /admin/users by @jjmata in #1185
  • Add post-trial inactive Family cleanup with data archival by @jjmata in #1199
  • Feat: Add QIF (Quicken Interchange Format) import functionality by @happytechca in #1074
  • feat: add pending transaction manual merging tool by @AdamWHY2K in #1088
  • feat(transaction): add support for file attachments using Active Storage by @itsLeonB in #713
  • Document admin-only reset auth in OpenAPI docs by @jjmata in #1198
  • feat: Add duplicate button when a transaction is selected by @RenzoMXD in #1123
  • Feat: Add default user account and consolidate account actions in menu by @happytechca in #1130
  • feat(balance): Incremental ForwardCalculator — only recalculate from changed date forward by @happytechca in #1151
  • Documentation for review AI Assistant features, MCP and API additions by @onel in #1168
  • Remove unused DeveloperMessage model by @jjmata in #1207
  • EnableBanking: Use transaction_date when other options fail by @jabbink in #1215
  • Respect manually selected account type in SimpleFIN liability logic by @milorw in #1214
  • Add scheduled DemoFamilyRefreshJob to rebuild demo data daily by @jjmata in #1217
  • feat: scope Mercury account uniqueness to mercury_item by @claytonlin1110 in #1032
  • chore(deps): bump json from 2.18.1 to 2.19.2 by @dependabot[bot] in #1225
  • chore(deps): bump bcrypt from 3.1.20 to 3.1.22 by @dependabot[bot] in #1227
  • FIX schema drift and snaptrade and mercury issues by @sokie in #1232
  • feat(vector-store): Implement pgvector adapter for self-hosted RAG by @eureka0928 in #1211
  • Initial split transaction support by @sokie in #1230
  • Fix NameError: rename migration file to match class name by @jjmata in #1234
  • Restore legacy Plaid migration constant alias by @jjmata in #1235
  • Fix pgvector migration to only run when explicitly configured by @jjmata in #1239
  • Fix rule condition merchant dropdown to show all merchants by @eureka0928 in #1240
  • Fix select is hidden inside dialog by @yxuko in #1196
  • Bump pipelock image from 0.3.2 to 1.5.0 by @luckyPipewrench in #1238
  • Add privacy mode to blur financial data across the app by @ChakibMoMi in #1055
  • Refactor report and dashboard table layouts to semantic HTML by @eureka0928 in #1222
  • Split UI by @sokie in #1245
  • Add GET /api/v1/summary endpoint and display net worth on mobile home by @dwvwdv in #1145
  • Move debug logs and logout actions to settings screen by @dwvwdv in #1146
  • Add "logo" variant in account dropdown on transfer form by @alessiocappa in #1241
  • Fix home page double AppBar inconsistency with settings/more pages by @dwvwdv in #1250
  • Provider merchants enhancement by @sokie in #1254
  • Fix decimal separator handling in money input fields by @jjmata in #1176
  • fix: Resolve infinite sync loop on SnapTrade setup accounts page by @falcononrails in #1256
  • Full .ndjson import / reorganize UI with Financial Tools / Raw Data tabs by @jjmata in #1208
  • Adapt holdings to number inputs by @sokie in #1258
  • Add rswag API docs routes for development mode by @jjmata in #1259
  • Fix SimpleFIN holdings confusing market value with cost basis (#1182) by @jjmata in #1261
  • chore(deps): bump activestorage from 7.2.2.2 to 7.2.3.1 by @dependabot[bot] in #1263
  • Updated list of Canadian registered accounts by @CYBRXT in #1265
  • chore(helm): bump pipelock to v2.0.0 with trusted domains and redirect profiles by @luckyPipewrench in #1266
  • Fix missing privacy blur on split transaction amounts in drawer by @jjmata with @Copilot in #1275
  • Fix dashboard mobile: require press-and-hold to reorder sections by @lolimmlost in #1210
  • Lock connection_pool gem by @sokie in #1284
  • Add appearance setting for 2 column layout by @sokie in #1285
  • Add Kosovo to country list by @vegimcarkaxhija in #1066
  • Fix selected account and Transaction/Transfer Tabs changes by @yxuko in #1220
  • Perf: Index Balance::SyncCache lookups by date to eliminate O(N×D) scans by @happytechca in #1081
  • Family sharing by @sokie in #1272
  • Added option to skip TLS verification for mailer by @fkrauthan in #1291
  • Default production SSO provider source to YAML to avoid boot-time schema errors by @jjmata with @Copilot in #1278
  • Sort Accounts dropdown alphabetically on uploads by @r-jeffries in #1290
  • Providers sharing by @sokie in #1273
  • Recurring scoping implementation by @sokie in #1300
  • Show inflow/outflow totals for transfer filter by @lolimmlost in #1134
  • Mobile: Add theme selection (light/dark/system) to settings by @felixmuinde in #1213
  • feat(mobile): Add animated TypingIndicator for AI chat responses by @felixmuinde in #1269
  • Added ca_file option to use the SSL_CA_FILE specified file if present by @fkrauthan in #1302
  • Fix/issue 954 enable banking duplicate transactions by @0xRozier in #988
  • Add transaction fee support to trades by @happytechca in #1248
  • Record dividends and interest as Trades in investment accounts by @happytechca in #1311
  • Split transactions and privacy quick fixes by @sokie in #1315
  • Fix NoMethodError on nil entryable in account activity feed by @happytechca in #1316
  • Missing translation fallback for account subtypes by @jjmata in #1325
  • Fix NoMethodError on nil accountable for logo color by @sentry[bot] in #1334
  • Add CoinStats exchange portfolio sync and normalize linked investment charts by @falcononrails in #1308
  • fix: add hex color validation to Category model and form (to resolve #1247) by @boul2gom in #1341
  • Update Docker Compose file for AI optional features by @jjmata in #1349
  • Fix unable to add trades with manual ticker by @Browndw4 in #1343
  • Restore monotonic Android versionCode for mobile releases by @jjmata with @Copilot in #1348
  • fix: instantiate RuleImport before generating rows by @tomerh2001 in #1354
  • Fix: target="_blank" to contact button by @yunwei-zh in #1359
  • Fix RuleImport parsing for valid JSON values by @tomerh2001 in #1358
  • fix(ui): move repeat icon to the center on recurring transactions page by @KenTandrian in #1365
  • fix: enhance text contrast for prose headings, and blockquote paragraphs in dark mode on the Guide page by @briian365 in #1369
  • Fix opacity for excluded transactions and implement keyboard navigation by @mike-lloyd03 in #1332
  • fix: resolve flaky chats system test race condition by @happytechca in #1375
  • fix: prevent NoMethodError in foreign_account? when account family is nil by @sentry[bot] in #1376
  • QIF imports: Add date format auto-detection and manual override by @happytechca in #1368
  • collect transaction stats after sync in EnableBanking provider by @smurfpandey in #1388
  • Enable selenium service in devcontainer for system tests by @paramburu in #1340
  • Update ruby-lsp-rails 0.4.6 → 0.4.8 and ruby-lsp 0.24.1 → 0.26.9 by @jjmata in #1389
  • added collect_health_stats to enablebanking syncer by @smurfpandey in #1390
  • Add Quick Categorize Wizard by @mikaelhm in #1386
  • Fixed crypto and loan add menus by @CYBRXT in #1306
  • Update and add Portuguese translations for various features by @gamboajorge49 in #1344
  • Polish localization: complete translations, pluralization fixes, and reusable locale audit tooling by @UberDudePL in #1356
  • fix: allow high precision for security prices in trade forms (to solve #1323) by @boul2gom in #1342
  • Quick Categorize Wizard — follow-up fixes by @mikaelhm in #1393
  • fix(mobile): Allow users to copy text from chatbot responses by @felixmuinde in #1394
  • Add Binance support, heavily inspired by the Coinbase one by @boul2gom in #1317
  • refactor(accounts): Improve destroy_later atomicity and add controller error handling by @sentry[bot] in #1395
  • Refactor: Use Encryptable concern in CoinbaseItem by @boul2gom in #1339
  • Make parent budgets auto-aggregate from subcategory edits by @jjmata with @Copilot in #1312
  • Add throttling and cross-rate for twelve data by @sokie in #1396
  • feat(select): improve merchant dropdown behavior and placement controls by @IamTaoChen in #1364
  • Fix balance sheet dashboard section on iPhone by @Browndw4 in #1318
  • feat: Allow creating budgets up to 2 years ahead by @grrtt49 in #925
  • docs: add Yahoo Finance IPv6 troubleshooting note by @sure-admin in #1404
  • Exposing transaction FX rate by @paramburu in #1099
  • Fix Binance USD converter custom rate keyword by @jjmata in #1414
  • feat(mobile): render assistant messages as markdown by @felixmuinde in #1405
  • Expand financial providers by @sokie in #1407
  • fix(binance): fix hmac signature by using same parameter order in request and sign by @boul2gom in #1425
  • Add binance security provider for crypto by @sokie in #1424
  • Move back to brandfetch by @sokie in #1427
  • Fix DemoFamilyRefreshJob demo email config lookup by @jjmata in #1426
  • Fix potential timing attack in Sidekiq Web UI auth by @the-spectator in #1429
  • fix(accounts): add duplicate action to activity view by @tedawf in #1418
  • feat(enable-banking): enhance transaction import, metadata handling, and UI by @boul2gom in #1406
  • Fix trade drawer header width regression by @jjmata in #1415
  • Feature: tabbing between income and expenses persists entered data by @BurningDog in #1422
  • add transfer-icon at transactions by @IamTaoChen in #1431
  • Investments currency fix by @sokie in #1436
  • Fix overlapping in transaction name by @alessiocappa in #1435
  • ui(sidebars): add subtle vertical separators and improve sidebar collapse behavior by @boul2gom in #1416
  • Add GitHub Actions workflow to discover and run LLM evaluations by @jjmata in #1439
  • fix(enable-banking): refactor error handling and add missing GIN index by @boul2gom in #1432
  • Add DeFi via Coinstats by @romainrbr in #1417
  • FIX networth chart dashboard by @sokie in #1449
  • Add default currency to price and fee fields by @smurfpandey in #1444
  • Add improvements from security providers to FX providers also by @sokie in #1445
  • Fix transactions page crash when no accounts exist by @alexkreidler in #1453
  • Ipv6 support by @sokie in #1437
  • Fix module specifier path for parse_locale_float import by @sure-admin in #1456
  • feat: add currency management for families with enabled currencies by @tedawf in #1419
  • Add category support to transactions by @dwvwdv in #1251
  • Budget page refactor: split into(All - Over Budget - On Track) by @IamTaoChen in #1195
  • Fix transaction search account scope bypass by @jjmata in #1460
  • feat: Add table-divider class and use it in investments summary section by @alessiocappa in #1463
  • fix: adjust style in new budget tab and sections by @alessiocappa in #1464
  • fix: values visible in privacy mode by @yunwei-zh in #1473
  • Add previous messages to LLM response context / fix OpenAI regressions by @jjmata in #1384
  • feat(mobile): Add biometric lock for app resume by @felixmuinde in #1474
  • fix: preserve Generic investment subtypes in account creation form by @xinmotlanthua in #1465
  • feat: Import pending transactions from Enable Banking only if option is enabled by @alessiocappa in #1476
  • fix(Enable Banking): Restore legacy fallback for credit card balance calculation by @alessiocappa in #1477
  • EnableBanking: use remittance for CARD-* names and merchants by @danez in #1478
  • feat(helm): CNPG resource limits/requests by @dariogmori in #1487
  • feat(settings): improve currency preferences UI by @tedawf in #1483
  • Fix loan account subtype not persisting on create by @sure-admin in #1491
  • chore(pipelock): bump chart default to v2.2.0, add CI scan badge by @luckyPipewrench in #1494
  • SimpleFIN: setup UX + same-provider relink + card-replacement detection by @luckyPipewrench in #1493
  • Complete French translations for views, models, and settings by @andronedev in #1501
  • Feature: AI sidebar hidden by default for members and guests if AI is disabled by @BurningDog in #1510
  • Add Sophtron Provider by @rockywang2025 in #596
  • Close privacy mode gaps on accounts, budget editing, and account activity by @jjmata with @Copilot in #1495
  • security: sanitize exception messages in v1 API responses (FIX-11) by @dgilperez in #1521
  • Prevent long category labels from overflowing or crowding adjacent controls by @jjmata with @Copilot in #1498
  • fix: Table divider display issue on Safari by @alessiocappa in #1522
  • Add Google Cloud Storage Support for Active Storage by @itsLeonB in #1523
  • Feature: improve transfer matcher UI copy by @BurningDog in #1526
  • fix(storage): properly fallback to GCS_KEYFILE when GCS_KEYFILE_JSON is blank by @itsLeonB in #1531
  • fix: Budget tabs issues on mobile by @alessiocappa in #1534
  • Feature: remember value of chart period selector by @BurningDog in #1528
  • Hide nested budget categories in the Budget spent donut by @jjmata with @Copilot in #1544
  • feat(mobile): lock chat input while bot is responding + 20s timeout by @felixmuinde in #1538
  • feat(ci): improve LLM eval visibility in GitHub Actions by @sure-admin in #1546
  • Upgrade Android Gradle Plugin to 8.9.1 and Gradle to 8.12 by @felixmuinde in #1547
  • Add automated Google Play Console upload for mobile releases by @jjmata in #1548
  • fix(localization): update API usage instructions to include product name placeholder by @briian365 in #1555
  • Fix budget donut chart hiding center content on segment hover by @xingxing21 in #1551
  • fix(transfers): Set accounts when rendering new form after conversion or argument errors by @sentry[bot] in #1561
  • fix(android): remove dead buildscript block and kotlin_version reference by @xingxing21 in #1567
  • Fix IndexaCapital sync, account setup, and balance/type bugs by @GermanDZ in #1562
  • 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 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
  • fix: invert non-gittensor label condition by @sure-admin in #1960
  • fix(settings): preserve OpenAI form input on validation failure by @dripsmvcp in #1862
  • fix(preview): only redeploy on preview-cf label changes by @sure-admin in #1980
  • fix: Avoid overlay in provider section on mobile by @alessiocappa in #1990
  • fix(i18n): use %{product_name} in api_keys usage_instructions (#1505) by @Rene0422 in #2000
  • feat: Add pagination in merchants page by @alessiocappa in #1965
  • feat(ibkr): compute net_market_flows from IBKR equity equity delta and trade flows by @CrossDrain in #1970
  • fix(account): show activity label for accounts supporting trades by @xBlaz3kx in #1993
  • fix(settings): add nil-safe operator to Current.family.can_manage_subscription? by @sentry[bot] in #2006
  • fix(family-sharing): prevent silent data loss when rehoming or removing users by @dripsmvcp in #1896
  • fix(holdings): carry provider cost_basis forward to calculated rows past snapshot date by @CrossDrain in #1818
  • fix: Keep with auto for category badge by @alessiocappa in #1963
  • fix(enable_banking): clear stuck pending flag when ASPSP reuses same transaction_id by @CrossDrain in #1982
  • feat(binance): add full account sync and transaction processing by @briian365 in #1822
  • fix(jobs): delegate recurring-transaction sync gate to Sync.for_family by @galuis116 in #1975
  • fix(views): DS drift — sankey tooltip tokens by @glorydavid03023 in #1996
  • feat(reports): add Period Return card to Investment Performance by @CrossDrain in #1962
  • fix(enable_banking): migrate select_bank dialog to DS::Pill and DS::Link by @glorydavid03023 in #1997
  • fix(plaid): surface configuration/product-access errors from the Link flow (#1792) by @Rene0422 in #1991
  • fix(balance): derive waypoint start from day's flows to prevent double-counting and phantom bumps by @CrossDrain in #2031
  • fix(currencies): add DOGE entry to config/currencies.yml (#2008) by @Rene0422 in #2030
  • feat(settings): add reviewed category merge flow by @JSONbored in #1754
  • refactor(imports): back PDF imports with statements by @JSONbored in #1786
  • fix(transactions): migrate transaction filter searches to DS::SearchInput by @glorydavid03023 in #1998
  • feat(assistant): add get_budget function for budget tracking by @wolstad in #1966
  • ci(preview): isolate preview deployment tooling by @JSONbored in #2025
  • chore(i18n): complete Chinese locale coverage by @ashanzzz in #2010
  • fix(ai-chat): disable submit on empty input instead of surfacing 'Content missing' (#1697) by @jeffrey701 in #1872
  • feat(i18n): add Vietnamese (vi) locale by @tanoggy in #2043
  • ci(preview): split PR image builds from trusted deploys by @JSONbored in #2057
  • fix(charts): auto-fit donut center text to inner ring (#2002) by @Rene0422 in #2017
  • fix(merchants): preserve manual merchant edits across provider sync by @dripsmvcp in #1981
  • fix(snaptrade): import non-primary-currency cash as cash holdings by @dripsmvcp in #1979
  • chore(ci): pin GitHub Actions to commit SHAs (#1811) by @jeffrey701 in #1870
  • Add HTTP timeout config to Provider::Github Octokit client by @bittensorrider in #2061
  • Perf/dashboard endpoint optimization by @bittensorrider in #1897
  • fix(reset): scope family financial data resets by @JSONbored in #1835
  • fix(dashboard): make Outflows widget responsive to its container, not the viewport by @gariasf in #2059
  • ci(preview): stabilize Cloudflare preview deployments by @JSONbored in #2062
  • fix: Replace platform-wide broadcast_refresh with sync toast by @ahnv in #1964
  • feat(ai): add Anthropic provider with chat parity (1/5) by @gariasf in #1983
  • fix(family): include HSA depository accounts in tax-advantaged exclusion by @galuis116 in #2004
  • Fix Start month on Last 6 Months report off by 1 by @joaocbatista in #2070
  • fix(transactions): include enable_banking in pending/confirmed status filter by @JPette1783 in #1885
  • ci(preview): stabilize image push and readiness diagnostics by @JSONbored in #2084
  • fix(tests): avoid account statement coverage rollover collision by @sure-admin in #2102
  • fix: Do not show pagination if no merchants are available by @alessiocappa in #2115
  • feat(transactions): add inline tag creation and search in txn form by @tedawf in #1719
  • fix(categories): avoid index N+1 queries by @JSONbored in #2089
  • feat(ai): Anthropic batch ops + LLM cost ledger (2/5) by @gariasf in #1984
  • feat: Move "Merge" action for merchants/categories in sub menu by @alessiocappa in #2114
  • perf(transfers): narrow auto-transfer candidate search by @JSONbored in #2080
  • feat(goals): balance-derived + pledges by @gariasf in #1798
  • fix(migrations): scope admin-backfill to a MigrationUser model (#1716) by @jeffrey701 in #1871
  • perf(sparklines): avoid full account loads for linked charts by @JSONbored in #2128
  • feat(provider): Akahu integration by @failing in #1921
  • fix: replace hand-rolled badges with DS::Pill in admin users view by @Kelvinchen03 in #1988
  • refactor(charts): extract shared chart-tooltip className to one source by @gariasf in #2106
  • fix(ds-pill): default show_dot per mode (badges clean, markers keep dot) by @gariasf in #2107
  • chore(ds-pill): migrate budget-category status badges to DS::Pill (#1751) by @gariasf in #2111
  • fix(recurring): match transfer pairs so Cleaner stops mis-retiring transfers by @gariasf in #2110
  • feat(ds): extract DS::ProgressRing primitive; migrate goal card (#1899) by @gariasf in #2112
  • fix(ds): unify SSO sign-in buttons on DS::Button; drop bespoke Google CSS by @gariasf in #2152
  • fix IncomeStatement performance issue by @bittensorrider in #1947
  • ci(preview): fix Cloudflare registry image deployment by @JSONbored in #2124
  • chore(rubocop): ignore generated schema spacing by @JSONbored in #2125
  • feat(imports): validate Sure NDJSON before publish by @JSONbored in #1833
  • feat(ai): Anthropic native PDF processing (3/5) by @gariasf in #1985
  • fix(helm): normalize appVersion to strip leading v (#2050) by @jeffrey701 in #2156
  • feat(i18n): complete Spanish (es) locale coverage for provider & transaction views by @glorydavid03023 in #2159
  • feat(i18n): complete German (de) locale coverage for provider & transaction views by @glorydavid03023 in #2158
  • fix(ds): dark-mode token parity — contrast & state fixes by @gariasf in #2139
  • fix(accounts): honor stored return_to after subtype account creation by @gariasf in #2109
  • Pass APP_BUNDLE_ID into iOS archive by @jjmata in #2169
  • feat(imports): add SureImport session batches by @JSONbored in #1785
  • fix(goals): scope funding-account picker to the current user's accessible accounts by @gariasf in #2172
  • feat(ds): elevate dropdown overlays and stabilize selection check gutter by @gariasf in #2161
  • fix(goals): default goal currency so it survives a failed create by @gariasf in #2171
  • feat(enable_banking): support MFA/decoupled banks and harden session … by @trahloff in #2174
  • fix(mobile): parse locale-aware transaction amounts by @JSONbored in #2130
  • fix(ds): .table-scroll — wide tables scroll instead of clipping by @gariasf in #2148
  • fix(balance-sheet): preserve disabled-account net worth history by @JSONbored in #1730
  • feat(ds): semantic color — neutralize decorative green/red on reports by @gariasf in #2144
  • fix(ds): cross-viewport lock — consistent auth mode-switch by @gariasf in #2149
  • fix(ds): chart flat-state — hairline trendline, not a bisecting rule by @gariasf in #2150
  • feat(mobile): add transaction metadata editing by @JSONbored in #2131
  • feat(dashboard): unify per-widget period selectors into one picker by @gariasf in #2162
  • ci(preview): render Cloudflare config from trusted template by @JSONbored in #2207
  • Fix SSO provider settings updates (preserve client_secret, persist default_role) by @jjmata in #2210
  • fix(goals): UI polish — submit validation, container-responsive cards, picker & filter fixes by @gariasf in #2160
  • fix(ds): canonical transaction-row — stop category pills truncating by @gariasf in #2147
  • feat(merchants): add raw data import (csv) for merchants by @xBlaz3kx in #1992
  • chore(ci): finish Node 24 GitHub Actions migration by @sure-admin in #2221
  • fix(mobile): redact sensitive diagnostic logs by @JSONbored in #2199
  • feat(ds): DS::SegmentedControl — fix invisible dark selected pill by @gariasf in #2145
  • fix(ds): one height rail for icon and text buttons by @gariasf in #2202
  • fix(sync-toast): morph refresh, defer behind modals, DS conformance by @gariasf in #2105
  • perf(transactions): preload new form options by @JSONbored in #2189
  • perf(reports): collapse investment flow aggregates by @JSONbored in #2190
  • fix: Savings Goal Marked Reached While Still Short by @jonathanchang31 in #2180
  • feat(ai): default Anthropic installs to pgvector RAG (4/5) by @gariasf in #1986
  • fix(ds): dark-parity for bespoke green status badges by @gariasf in #2142
  • feat(ds): DS::EmptyState primitive by @gariasf in #2146
  • test(goals): pledge-delta integration coverage (follow-up to #2178) by @gariasf in #2206
  • feat(mobile): add privacy-safe Sentry instrumentation by @JSONbored in #2201
  • fix(preview): surface postgres startup failures and reset attempt timings by @sure-admin in https://github.com/we-promise/sure/pull/2217
  • fix(charts): restyle hover tooltips with soft shadow + larger radius by @gariasf in https://github.com/we-promise/sure/pull/2029
  • feat(i18n): complete Brazilian Portuguese (pt-BR) locale coverage for provider & transaction views by @glorydavid03023 in https://github.com/we-promise/sure/pull/2220
  • feat(i18n): complete Dutch (nl) locale coverage for provider & transaction views by @glorydavid03023 in https://github.com/we-promise/sure/pull/2218
  • feat(mobile): show account detail context by @JSONbored in https://github.com/we-promise/sure/pull/2231
  • fix(mobile): make offline transaction replay idempotent by @JSONbored in https://github.com/we-promise/sure/pull/2232
  • Respect CoinStats wallet rate limits by @dan-dr in https://github.com/we-promise/sure/pull/2251
  • feat(ai): self-host settings UI for Anthropic provider (5/5) by @gariasf in https://github.com/we-promise/sure/pull/1987
  • feat(ai): route LLM batch & PDF flows through Setting.llm_provider by @gariasf in https://github.com/we-promise/sure/pull/2265
  • fix(imports): import Actual rows with blank payee by @JSONbored in https://github.com/we-promise/sure/pull/2282
  • Fix prerelease version-bump job: add PR fallback for protected branches by @jjmata in https://github.com/we-promise/sure/pull/2224
  • perf(sync): scope transfer matching after account sync by @JSONbored in https://github.com/we-promise/sure/pull/2230
  • fix(ds): use DS::Disclosure for investment-performance expander by @gariasf in https://github.com/we-promise/sure/pull/2243
  • fix(ds): replace invalid bg-surface-default token with bg-surface by @gariasf in https://github.com/we-promise/sure/pull/2244
  • fix(ds): canonical destructive red → red-500 (token + button) by @gariasf in https://github.com/we-promise/sure/pull/2245
  • fix(ds): migrate SSO amber warning surfaces to DS::Alert / DS::Pill by @gariasf in https://github.com/we-promise/sure/pull/2246
  • fix(ds): migrate remaining amber notice boxes to DS::Alert(:warning) by @gariasf in https://github.com/we-promise/sure/pull/2247
  • fix(ds): convert_to_trade price warning — fix dead dark:, use warning token by @gariasf in https://github.com/we-promise/sure/pull/2249
  • fix(ds): route remaining literal yellow warning surfaces onto --color-warning by @gariasf in https://github.com/we-promise/sure/pull/2250
  • fix(ds): balance-sheet weight alignment + category pill padding by @gariasf in https://github.com/we-promise/sure/pull/2275
  • fix(ds): add-account menu — right-size close + clickable rows by @gariasf in https://github.com/we-promise/sure/pull/2276
  • fix(ds): dark-mode hover — alpha-black-25 → surface-hover on date-nav triggers by @gariasf in https://github.com/we-promise/sure/pull/2287
  • fix(ds): unify tab/chip controls on DS::SegmentedControl (#8) by @gariasf in https://github.com/we-promise/sure/pull/2284
  • refactor(settings): consistency pass — header-less settings_section + guides by @gariasf in https://github.com/we-promise/sure/pull/2279
  • fix(ds): sync-settings env notice → DS::Alert (was invisible: undefined warning-* classes) by @gariasf in https://github.com/we-promise/sure/pull/2278
  • fix(settings): preserve content scroll position per page across navigation by @gariasf in https://github.com/we-promise/sure/pull/2277
  • feat(ds): one canonical focus ring across primitives by @gariasf in https://github.com/we-promise/sure/pull/2140
  • fix: EODHD lookup for EU mutual funds with EUFUND exchange code by @Kelvinchen03 in https://github.com/we-promise/sure/pull/2212
  • feat(mobile): align theme foundation with Sure tokens by @JSONbored in https://github.com/we-promise/sure/pull/2237
  • feat(mcp): OAuth 2.1 auth for MCP — connect Claude.ai with your Sure login by @thewillwilson in https://github.com/we-promise/sure/pull/2234
  • fix(enable-banking): tolerate any 422 on PDNG fetch (#1805) by @Rene0422 in https://github.com/we-promise/sure/pull/1889
  • fix(sharing): scope import account selects to accessible_by (#1803) by @dripsmvcp in https://github.com/we-promise/sure/pull/2194
  • fix(mobile): regenerate stale Sure tokens on main by @sure-admin in https://github.com/we-promise/sure/pull/2296
  • Fix Plaid sync failure for loan subtypes missing from Loan::SUBTYPES by @BeltaKoda in https://github.com/we-promise/sure/pull/2298
  • feat(cashflow): deep-link category labels to filtered transactions by @thewillwilson in https://github.com/we-promise/sure/pull/2083
  • fix(preview): bind :3000 instantly and bound diagnostics posts by @JSONbored in https://github.com/we-promise/sure/pull/2286
  • Add support for dividend, deposit, withdrawal, and interest trade types to Trades API by @thebandit in https://github.com/we-promise/sure/pull/1761
  • fix(ds): route mercury/ibkr provider panels onto sibling tokens by @gariasf in https://github.com/we-promise/sure/pull/2290
  • refactor(settings): debugs page onto settings_section by @gariasf in https://github.com/we-promise/sure/pull/2289
  • fix(ds): goals — uniform New-goal → grid spacing by @gariasf in https://github.com/we-promise/sure/pull/2288
  • feat(mobile): standardize money typography and semantic amount color by @JSONbored in https://github.com/we-promise/sure/pull/2331
  • chore(deps): upgrade Rails 7.2 → 8.1 by @JSONbored in https://github.com/we-promise/sure/pull/2301
  • fix(ds): neutral text for goals status callout by @gariasf in https://github.com/we-promise/sure/pull/2312
  • fix(dashboard): apply two-column layout at xl breakpoint, not 2xl by @gariasf in https://github.com/we-promise/sure/pull/2310
  • fix(dashboard): align sankey zoom-out button with section header by @gariasf in https://github.com/we-promise/sure/pull/2313
  • fix(ds): normalize legacy tooltip spacing to one recipe by @gariasf in https://github.com/we-promise/sure/pull/2311
  • fix(settings): give the MCP copy button success feedback by @gariasf in https://github.com/we-promise/sure/pull/2314
  • fix(chat): clear assistant bubble on destroy so the chat doesn't hang on Thinking by @gariasf in https://github.com/we-promise/sure/pull/2315
  • chore(deps): bump yard from 0.9.37 to 0.9.42 by @dependabot[bot] in https://github.com/we-promise/sure/pull/2335
  • chore(deps): bump css_parser from 1.21.1 to 1.22.0 by @dependabot[bot] in https://github.com/we-promise/sure/pull/2336
  • fix(ds): shrink dialog close button to size sm by @gariasf in https://github.com/we-promise/sure/pull/2309
  • chore(i18n): remove dead transfers.form.* exchange-rate keys by @augustocbx in https://github.com/we-promise/sure/pull/2293
  • fix(sync): discover nightly provider items reflectively by @sure-admin in https://github.com/we-promise/sure/pull/2334
  • fix(ds): canonical separators and destructive tokens in usage/rules tables by @gariasf in https://github.com/we-promise/sure/pull/2332
  • fix(ds): migrate goals color picker back to DS::Disclosure (no_margin body option) by @gariasf in https://github.com/we-promise/sure/pull/2350
  • chore(i18n): complete zh-CN locale coverage by @BeastOrange in https://github.com/we-promise/sure/pull/2283
  • fix: preserve CoinStats balances when wallet sync data is missing by @sure-admin in https://github.com/we-promise/sure/pull/2132
  • feat(dashboard): masonry packing + per-widget size controls by @gariasf in https://github.com/we-promise/sure/pull/2328
  • fix(jobs): enqueue jobs after transaction commit to fix SyncJob deserialization race by @JSONbored in https://github.com/we-promise/sure/pull/2354
  • fix(rules): make explicit re-apply override locked attributes by @augustocbx in https://github.com/we-promise/sure/pull/2273
  • Upgrade Ruby version to 3.4.9 by @jjmata in https://github.com/we-promise/sure/pull/2360
  • feat(mobile): add SureButton primitive and migrate login buttons by @JSONbored in https://github.com/we-promise/sure/pull/2358
  • feat(security): warn when ActiveRecord encryption is not configured by @andrewb-nz in https://github.com/we-promise/sure/pull/2362
  • feat(imports): add YNAB CSV import by @JSONbored in https://github.com/we-promise/sure/pull/2361
  • feat(mobile): bundle Geist + Geist Mono so the app renders Sure typography by @JSONbored in https://github.com/we-promise/sure/pull/2342
  • feat(mobile): normalize dashboard text weight to DS Medium (500) by @JSONbored in https://github.com/we-promise/sure/pull/2344
  • feat(mobile): add SureIcon (Lucide) primitive and migrate dashboard icons by @JSONbored in https://github.com/we-promise/sure/pull/2346
  • perf(api): avoid transfer lookups in transaction index by @JSONbored in https://github.com/we-promise/sure/pull/2127
  • fix(mobile): neutral Sure tokens for FAB/badge/avatar surfaces + themed logo by @JSONbored in https://github.com/we-promise/sure/pull/2366
  • feat(mobile): generate shadow scale + focus-ring/bg-inverse tokens by @JSONbored in https://github.com/we-promise/sure/pull/2349
  • fix: Transaction Pagination Skipping Entries by @jonathanchang31 in https://github.com/we-promise/sure/pull/2179
  • fix(accounts): persist subtype when creating an account by @vlnd0 in https://github.com/we-promise/sure/pull/2356
  • Add Mobile version check for update notifications by @felixmuinde in https://github.com/we-promise/sure/pull/2367
  • fix(cashflow): use Turbo.visit for donut chart deep-link navigation by @thewillwilson in https://github.com/we-promise/sure/pull/2166
  • Add transaction name to get_transactions MCP tool output by @oggysecond in https://github.com/we-promise/sure/pull/2026
  • fix(imports): normalize CSV upload encoding when validations are skipped by @augustocbx in https://github.com/we-promise/sure/pull/2299
  • Add cascade delete to rejected_transfers foreign keys by @Kelvinchen03 in https://github.com/we-promise/sure/pull/2211
  • fix(prices): resolve dashed crypto tickers (BTC-USD, TRX-USD) via BinancePublic by @vlnd0 in https://github.com/we-promise/sure/pull/2372
  • fix(ds): add focus ring to dashboard widget size control by @BeastOrange in https://github.com/we-promise/sure/pull/2364
  • feat(prices): add Moscow Exchange (MOEX ISS) securities + FX provider by @vlnd0 in https://github.com/we-promise/sure/pull/2394
  • perf(recurring): batch recurring transaction identification by @JSONbored in https://github.com/we-promise/sure/pull/2239
  • perf(dashboard): streamline investment activity totals by @JSONbored in https://github.com/we-promise/sure/pull/2257
  • perf(reports): avoid residual category lazy loads by @JSONbored in https://github.com/we-promise/sure/pull/2255
  • fix(trades): guard against nil security in create_trade by @sentry[bot] in https://github.com/we-promise/sure/pull/2066
  • feat(prices): add T-Invest (T-Bank) securities + brand-logo provider by @vlnd0 in https://github.com/we-promise/sure/pull/2408
  • fix(coinstats): stabilize bulk wallet ordering by @sure-admin in https://github.com/we-promise/sure/pull/2402
  • Fix API auth context inheriting web session impersonation by @BeastOrange in https://github.com/we-promise/sure/pull/2405
  • Refresh Pipelock integration for v2.8 receipts by @luckyPipewrench in https://github.com/we-promise/sure/pull/2406
  • feat(up): add Up Bank (AU) provider integration by @Jookly123 in https://github.com/we-promise/sure/pull/2391
  • feat(mobile): add SureCard primitive and migrate account cards by @JSONbored in https://github.com/we-promise/sure/pull/2370
  • feat(mobile): add SureListGroup/SureListRow primitives and migrate the More menu by @JSONbored in https://github.com/we-promise/sure/pull/2376
  • feat(mobile): add SureTextField primitive and migrate the proxy-headers editor by @JSONbored in https://github.com/we-promise/sure/pull/2378
  • fix(tinkoff): resolve the tradeable listing and price bonds via BondBy by @vlnd0 in https://github.com/we-promise/sure/pull/2413
  • feat(mobile): add SureChip primitive and migrate the currency filter by @JSONbored in https://github.com/we-promise/sure/pull/2380
  • feat(mobile): add SureSegmentedControl primitive and migrate the transaction type selector by @JSONbored in https://github.com/we-promise/sure/pull/2382
  • fix(settings): preserve scroll position in settings nav by @Holdner in https://github.com/we-promise/sure/pull/2373
  • chore(deps): bump esbuild and wrangler in /workers/preview by @dependabot[bot] in https://github.com/we-promise/sure/pull/2411
  • chore(deps): bump undici and wrangler in /workers/preview by @dependabot[bot] in https://github.com/we-promise/sure/pull/2410
  • chore(deps): bump nokogiri from 1.19.3 to 1.19.4 by @dependabot[bot] in https://github.com/we-promise/sure/pull/2425
  • chore(deps): bump faraday from 2.14.1 to 2.14.3 by @dependabot[bot] in https://github.com/we-promise/sure/pull/2424
  • chore(deps): bump concurrent-ruby from 1.3.6 to 1.3.7 by @dependabot[bot] in https://github.com/we-promise/sure/pull/2426
  • Bump version to next iteration after v0.7.2-alpha.8 release by @jjmata in https://github.com/we-promise/sure/pull/2423
  • feat(mobile): migrate all hardcoded UI strings to gen_l10n ARB (Phase 1 + 2) by @JSONbored in https://github.com/we-promise/sure/pull/2384
  • design-system(mobile): SureFontWeights tokens (named weight tiers) by @JSONbored in https://github.com/we-promise/sure/pull/2419
  • feat(mcp): add get/create/update tools for tags and categories by @xBlaz3kx in https://github.com/we-promise/sure/pull/2374
  • Bump Puma dependency to >= 7.2.1 by @jjmata in https://github.com/we-promise/sure/pull/2428
  • Enforce LF line endings for .devcontainer/.bashrc by @jestinjoshi in https://github.com/we-promise/sure/pull/2480
  • Fix SimpleFIN epoch-string balance dates causing PG::DatetimeFieldOverflow by @marty0x in https://github.com/we-promise/sure/pull/2397
  • fix(chat): surface and recover from undelivered assistant responses by @gariasf in https://github.com/we-promise/sure/pull/2436
  • fix: use ES256 instead of EdDSA for Coinbase CDP JWT signing by @lifrank1 in https://github.com/we-promise/sure/pull/1888
  • feat: resizable accounts & assistant sidebars by @gariasf in https://github.com/we-promise/sure/pull/2482
  • Allow multiple active API keys per user by @thewillwilson in https://github.com/we-promise/sure/pull/2077
  • fix(balances): materialize entries dated before the opening anchor by @vlnd0 in https://github.com/we-promise/sure/pull/2434
  • fix(i18n): correct Catalan gender agreement on add-account button by @gariasf in https://github.com/we-promise/sure/pull/2488
  • fix(sync): store EnableBanking credit card debt as balance instead of available credit by @mxafi in https://github.com/we-promise/sure/pull/2459
  • Add SnapTrade OAuth device flow by @jjmata in https://github.com/we-promise/sure/pull/2494
  • Fix SimpleFIN partial auth reconnect status by @luckyPipewrench in https://github.com/we-promise/sure/pull/2509
  • fix(imports): support QIF dd mmm yyyy date format by @BeastOrange in https://github.com/we-promise/sure/pull/2500
  • Adds a toggle to mark accounts as excluded from all financial reports while keeping them active and visible individually. by @DataEnginr in https://github.com/we-promise/sure/pull/2416
  • Require omniauth-rails_csrf_protection v2.0+ for Rails 8.2 compatibility by @jjmata in https://github.com/we-promise/sure/pull/2520
  • chore(deps): bump yard from 0.9.42 to 0.9.44 by @dependabot[bot] in https://github.com/we-promise/sure/pull/2522
  • Scope API v1 controllers through current_resource_owner by @BeastOrange in https://github.com/we-promise/sure/pull/2414
  • fix(sync): scope after_commit to prevent nil family error on destroy by @sentry[bot] in https://github.com/we-promise/sure/pull/1976
  • feat:Add SnapTrade OAuth device flow by @jjmata in https://github.com/we-promise/sure/pull/2523
  • Fixes issue #2415 - Subcategories are not alphabetically ordered like Categories by @HairyHook in https://github.com/we-promise/sure/pull/2429
  • fix(accounts): subtype dropped on create when assigned before accountable_type by @vlnd0 in https://github.com/we-promise/sure/pull/2432
  • fix(sync): prevent NoMethodError when syncable is nil in after_commit by @sentry[bot] in https://github.com/we-promise/sure/pull/2484
  • fix(settings): securities-provider checkmarks invisible in dark mode by @vlnd0 in https://github.com/we-promise/sure/pull/2430
  • feat(mobile): privacy mode to mask money values by @JSONbored in https://github.com/we-promise/sure/pull/2386
  • feat(goals): earmark a portion of an account toward a goal (Phase 1) by @gariasf in https://github.com/we-promise/sure/pull/2490
  • fix(mobile): dispose API-key dialog controller on any dismissal by @JSONbored in https://github.com/we-promise/sure/pull/2399
  • design-system(mobile): SureSpacing + SureTypography scale tokens by @JSONbored in https://github.com/we-promise/sure/pull/2438
  • feat(goals): investment-backed goals (Phase 2) by @gariasf in https://github.com/we-promise/sure/pull/2491
  • feat(kraken): import deposits, withdrawals, staking & fees via Ledgers API by @JSONbored in https://github.com/we-promise/sure/pull/2451
  • feat(mercury): pending transactions, kind/counterpartyId metadata, and test coverage by @JSONbored in https://github.com/we-promise/sure/pull/2452
  • fix(mobile): in-progress feedback for the Clear local data action by @JSONbored in https://github.com/we-promise/sure/pull/2439
  • test(system): harden property edit flow against the account-menu morph race by @JSONbored in https://github.com/we-promise/sure/pull/2421
  • fix(pwa): harden manifest render to explicitly use json format by @sentry[bot] in https://github.com/we-promise/sure/pull/2508
  • refactor(imports): header-less settings_section by @Holdner in https://github.com/we-promise/sure/pull/2395
  • feat(up): flag internal transfers and round-ups as funds_movement by @threatsurfer in https://github.com/we-promise/sure/pull/2460
  • fix(goals): match manual_save pledges by contribution delta, not full balance by @galuis116 in https://github.com/we-promise/sure/pull/2178
  • docs: explain self-hosted onboarding modes by @sure-admin in https://github.com/we-promise/sure/pull/2533
  • feat: add preference to disable modal close on outside click by @Nekoraru22 in https://github.com/we-promise/sure/pull/2226
  • i18n: fully update French (fr) translations by @Nicotinii in https://github.com/we-promise/sure/pull/1922
  • Fix date-dependent flake in investment_statement_test by @jestinjoshi in https://github.com/we-promise/sure/pull/2539

New Contributors

Full Changelog: v0.6.8...v0.7.2

Don't miss a new sure release

NewReleases is sending notifications on new releases.