null
1d8ae4f511
fix: sync_days hard-clamped to 90 (SimpleFIN Bridge limit)
...
- bankSyncConfigService: SYNC_DAYS_MAX=90, getBankSyncConfig clamps on read,
setSyncDays rejects >90 with explanation
- bankSyncService: every sync requests full sync_days window, dedup handles
already-seen transactions
- dataSources status endpoint returns sync_days alongside enabled
- BankSyncAdminCard: input max 90, live clamp, description cites Bridge limit
- BankSyncSection: third stat tile showing History window X days
2026-05-29 02:23:19 -05:00
null
7682758aa8
fix: sync_days now reads from DB config, admin UI controls it
...
- bankSyncService: removed local syncDaysBack() reading env directly;
sinceEpoch() now calls getBankSyncConfig().sync_days
- bankSyncConfigService: added setSyncDays() with 1-730 day validation
- routes/admin: PUT accepts sync_days alongside enabled/sync_interval_hours
- BankSyncAdminCard: Transaction history days input, loaded from config,
defaults 90, dirty-checked on save
2026-05-29 01:33:54 -05:00
null
262d7789db
feat: account monitoring, expanded sync UI, match filtering, error toasts
...
Backend:
- v0.64 migration: monitored column on financial_accounts
- GET/PUT data-sources accounts endpoints for monitored toggle + tx listing
- matchSuggestionService: excludes unmonitored accounts from match scoring
Frontend:
- BankSyncSection rebuild: accounts panel with monitored switch, expand for
last 50 transactions, match status badges, optimistic toggle
- TransactionMatchingSection: toast on bills load failure
- DataPage: toast on import history load failure
- ProfilePage: toast on both login history fetch failures
2026-05-29 01:06:20 -05:00
null
542ab5e382
feat: configurable sync interval, auto-match, encryption note, admin link, SimpleFIN hyperlink
...
#1 Sync interval in admin UI:
- bankSyncConfigService: reads simplefin_sync_interval_hours from settings
(DB-first, env fallback, default 4h), setSyncIntervalHours() with validation
- bankSyncWorker: live-updates interval from getBankSyncConfig() each tick
- routes/admin: PUT accepts enabled and sync_interval_hours independently
- BankSyncAdminCard: number input (0.5 step, 0.5-168 range), dirty-checks both
#3 Auto-match after background sync:
- matchSuggestionService: autoMatchForUser() auto-applies suggestions ≥80
score (exact amount + date ±1d + name signal), lazy-requires matchTransactionToBill
- bankSyncWorker: calls autoMatchForUser after each successful sync, own try/catch
#4 Encryption note in BankSyncAdminCard below worker status panel
Also: error handling, admin link in tracker sidebar, SimpleFIN bridge hyperlink
2026-05-29 00:28:50 -05:00
null
b03264ceb1
feat: zero-config encryption + SimpleFIN Bridge links
...
- encryptionService.js: getKey() tries TOKEN_ENCRYPTION_KEY env first, then
auto-generates a random 48-byte key on first startup, persists to settings
as _auto_encryption_key. assertEncryptionReady() is now a no-op.
- bankSyncConfigService.js: removed encryption_key_set response and
encryptionKeyReady() helper. No env config required.
- .env.example: TOKEN_ENCRYPTION_KEY removed. Comment says enable from Admin
panel, no env config required.
- BankSyncSection.jsx: added SimpleFIN Bridge links — 'Open SimpleFIN Bridge'
for first-time setup, 'Get a SimpleFIN token' for existing connections
2026-05-29 00:04:28 -05:00
null
3fea3931f5
style: AP badge next to bill name instead of blue dot
...
Tracker and mobile tracker rows now show a small AP badge
immediately to the right of the bill name, replacing the
blue dot on the left.
2026-05-28 23:50:03 -05:00
null
792980b8ba
style: stronger late/missed payment visibility
...
- Tracker rows, mobile rows: alert icons, left-edge marker, stronger row tinting
- Calendar grid and detail dialog: brighter dots, count badges
- StatusBadge: stronger orange/rose badges for late/missed
- Shared badge component: clearer contrast
2026-05-28 23:42:46 -05:00
null
a1f679f7b0
style: global readability/theme pass
...
- Sharpened font stack in index.css, removed softer Georgia digit font for UI text/money
- Tuned dark-mode tokens: clearer foreground, brighter muted text, stronger borders, defined cards
- Updated UI primitives: cards, buttons, inputs, selects, tables, badges
- Cleaned up bills rows, mobile bill rows, tracker dismiss, snowball icons, summary/category/health/analytics money values, import/export status icons
- Reduced fuzzy uppercase label spacing globally
2026-05-28 23:18:14 -05:00
null
7a58d69c70
feat: hybrid subscription tracker
...
Added subscription metadata to bills: is_subscription, type, reminder_days, source, detected_at
Backend subscription API (routes/subscriptions.js)
SimpleFIN recommendation logic (services/subscriptionService.js)
New /subscriptions page (client/pages/SubscriptionsPage.jsx)
Track-as-subscription controls in BillModal.jsx
Navigation under Tracker menu
Accepting a recommendation creates a subscription-backed bill + links detected transactions
2026-05-28 22:54:07 -05:00
null
22df64e5e7
feat: auto-sync worker for SimpleFIN bank sync
...
New:
services/bankSyncWorker.js — interval-based worker running every 4h (configurable via SIMPLEFIN_SYNC_INTERVAL_HOURS)
- Checks bank sync enabled, fetches oldest-synced sources, skips <1h old
- Staggers syncs 3s apart, writes last_error on failure, timer.unref() for clean shutdown
Modified:
server.js — starts worker inside app.listen callback
routes/admin.js — GET bank-sync-config includes worker status (running, interval, last/next run)
client/components/admin/BankSyncAdminCard.jsx — shows auto-sync worker status panel when enabled
.env.example — SIMPLEFIN_SYNC_INTERVAL_HOURS
2026-05-28 22:32:33 -05:00
null
858f65b66b
fix: BankSyncAdminCard toggle no longer gated on encryption key
...
- Removed disable logic and key warning banner from BankSyncAdminCard
- Toggle works freely regardless of TOKEN_ENCRYPTION_KEY status
- encryptionKeyReady and encryption_key_set left as informational only
2026-05-28 22:18:20 -05:00
null
88a4b64924
feat: DB-first bank sync config, admin toggle, extracted BankSyncSection
...
New:
services/bankSyncConfigService.js — bank_sync_enabled from settings table, env fallback
client/components/admin/BankSyncAdminCard.jsx — single toggle + encryption key status
client/components/data/BankSyncSection.jsx — full connection management extracted from SettingsPage
Modified:
routes/dataSources.js — per-request getBankSyncConfig() instead of module-level env check
routes/admin.js — GET/PUT /api/admin/bank-sync-config
AdminPage.jsx — renders BankSyncAdminCard after EmailNotifCard
SettingsPage.jsx — BankSyncSection removed, 580->352 lines
DataPage.jsx — BankSyncSection first, passes simplefinConn to TransactionMatchingSection
TransactionMatchingSection.jsx — compact sync bar with green dot + Sync Now
Layout.jsx — SimplefinBadge shows muted dot when enabled
client/api.js — bankSyncConfig API calls
2026-05-28 22:06:15 -05:00
null
979886cb6a
style: CalendarPage readability pass + DataPage fix
...
CalendarPage.jsx:
- Tightened day numbers, due-count badges, bill labels inside cells
- Crisper color contrast for paid/due/missed states
- Cleaner grid surfaces and borders for row/day tracking
- Switched font-mono values to tracker-number style
SeedDemoDataSection.jsx:
- Fixed render logic for data page
2026-05-28 21:40:27 -05:00
null
42abb12497
feat: SimpleFin bank sync with encrypted token storage
...
New services:
services/encryptionService.js — AES-256-GCM with SHA-256 derived key
services/simplefinService.js — protocol layer: claim token, fetch accounts/transactions, normalize to DB shapes
services/bankSyncService.js — orchestration: connect, sync, disconnect with encrypted access URL storage
Modified:
routes/dataSources.js — status, connect, sync, disconnect endpoints (gate on BANK_SYNC_ENABLED=true)
client/api.js — simplefinStatus, connectSimplefin, syncDataSource, deleteDataSource, dataSources
client/pages/SettingsPage.jsx — BankSyncSection with connected account info, sync/disconnect actions, setup token input
.env.example — BANK_SYNC_ENABLED, TOKEN_ENCRYPTION_KEY, SIMPLEFIN_APP_NAME
2026-05-28 21:30:20 -05:00
null
994b5c1e17
feat: spending forecast with linear regression chart
...
Analytics page additions:
- linearForecast(rows, horizonMonths) — OLS regression producing projected,
low, and high (±1σ residual) for each future month
- ForecastChart — SVG line chart: solid historical line + area fill, dashed
projected line, translucent confidence band, divider line at forecast start,
legend for Historical and Projected ± 1σ
- Forecast added to CHART_OPTIONS (on by default)
- Forecast dropdown: 3/6/12 month horizon (default 6)
- Controls grid expanded to 7 columns
- Forecast card spans full width below heatmap
- Projection table: Month / Projected / Low / High columns
- Reset filters resets forecast to 6 months
2026-05-28 21:11:29 -05:00
null
71dfbe36cc
refactor: component splits, PWA support, CommandPalette
...
Component Splits:
- AdminPage.jsx: 1,906 -> 82 lines (logic moved to client/components/admin/ — 9 files)
- DataPage.jsx: 3,132 -> 60 lines (logic moved to client/components/data/ — 8 files)
- TrackerPage.jsx: 2,566 -> 2,132 lines (MonthlyStateDialog, StartingAmountsEditDialog, PaymentModal)
PWA:
- vite-plugin-pwa installed with NetworkFirst caching for API routes
- Square PWA icons (192x192, 512x512, apple-touch-icon)
- theme-color, apple meta tags, touch icon in index.html
- Build generates dist/sw.js + Workbox runtime
CommandPalette:
- Navigation commands, Add bill action, month jumps
- Grouped results with empty/filtered states
2026-05-28 20:53:22 -05:00
null
92cc667947
chore: bump version to v0.28.4.4
2026-05-28 20:14:00 -05:00
null
33e5c187a3
dark theme
2026-05-28 19:58:01 -05:00
null
d99ea8057e
dark theme
2026-05-28 19:40:55 -05:00
null
1f3a254c7c
brighten dark mode
2026-05-28 19:30:46 -05:00
null
0fd82568cc
georgia font
2026-05-28 04:20:15 -05:00
null
8f7d0aeaff
styling
2026-05-28 04:06:37 -05:00
null
8efb7c934d
fix suggested
2026-05-28 02:53:59 -05:00
null
8122d07069
inline editing
2026-05-28 02:53:35 -05:00
null
1426ee3bb5
error handling
2026-05-28 02:34:24 -05:00
null
e8218a3dd8
bill tracker futurue
2026-05-28 02:09:49 -05:00
null
fa60ea8fbd
fix paid coloum
2026-05-28 01:38:18 -05:00
null
a811589db4
theme correctness
2026-05-28 01:30:40 -05:00
null
82de135186
push
2026-05-18 09:44:16 -05:00
null
060c8dc2f4
chore: version bump to 0.28.01 and update HISTORY format
2026-05-16 21:36:04 -05:00
null
9d933f70cc
v0.28.01
2026-05-16 20:26:09 -05:00
null
b124e48ebc
v0.28.0
2026-05-16 15:38:28 -05:00
null
8913436575
v0.28.0
2026-05-16 11:56:38 -05:00
null
53670b3745
v0.28.0
2026-05-16 11:42:32 -05:00
null
88c1374d97
v028.0
2026-05-16 10:56:56 -05:00
null
59d9d21d4c
v0.28.0
2026-05-16 10:34:32 -05:00
null
9174ec3290
v0.28.
2026-05-16 10:17:24 -05:00
null
0ba315bd32
v0.28.0
2026-05-15 22:45:38 -05:00
null
74603ff2d5
v0.27.04
2026-05-15 04:22:33 -05:00
null
153ed7ab79
v0.27.04
2026-05-15 02:26:10 -05:00
null
48dcb480ba
v0.27.04
2026-05-15 01:49:55 -05:00
null
263f1c5e6e
v0.27.04
2026-05-15 01:36:56 -05:00
null
576163e85b
apr/snowball 0.27.04
2026-05-15 00:03:32 -05:00
null
d720931894
v0.27.02 push
2026-05-14 21:00:07 -05:00
null
eea5641126
snowball visuals
2026-05-14 19:33:23 -05:00
null
7aff0d0283
snowball ui fiix
2026-05-14 03:23:52 -05:00
null
ce22139bb3
chore: bump version to 0.27.01
2026-05-14 03:01:47 -05:00
null
440f872d97
snowball bug fixes
2026-05-14 03:00:01 -05:00
null
7d2d0bf45e
0.28.0 snowball release
2026-05-14 02:11:54 -05:00
null
48fe87ea25
corrections
2026-05-14 01:17:05 -05:00