Releases: Greigh/FiHaven
Release list
v1.6.1 — Push that actually arrives, pay what's left, nine more issuer logos
Summary
Admin tools you can actually run a product with, a Rewards page that helps you pick a card (and keeps your rates when the catalog updates), manual-first bank balance suggestions and subscription confirms — now reliable across more than one linked bank — a History tab that charts what you earned against what you spent, cards that lead with the amount you pick, a Pay flow that counts what you've already paid, real brand logos for nine more issuers, push notifications that actually arrive, web billing on Paddle, redesigned notification emails with one-click unsubscribe, safer production auth / store webhooks, and native Plaid + social sign-in that return into the app.
Builds: iOS 1.6.1 (17) · Android 1.6.1 (versionCode 39) · Web live at fihaven.app
Changes (Jul 29)
Push notifications actually arrive now
- Turning on push asks for permission. It didn't. iOS hands out a delivery token whether or not you've allowed notifications, so the server was sending to phones that had never been asked and iOS threw every reminder away — silently, and indistinguishable from push simply being broken. If you'd already turned it on, the app asks next launch; a deliberate "Don't Allow" is never re-asked (#231)
- On Android, pushed reminders land in "Bill reminders" again. They were going to a channel Android invents on the spot called "Miscellaneous", so they ignored the sound, importance and mute settings you'd chosen — and vanished entirely if you'd muted that unfamiliar channel. The channel is now named on the server payload as well as in the app, so this is fixed for already-installed apps too
- When registration fails, we can tell why — the underlying reason is recorded and kept after the app closes, and the server now reports a device it can't deliver to or a dead token it drops. That prune was the one failure that left no trace anywhere
Paying something lowers what it asks for
- Every figure in the Pay flow — Minimum, Recommended, a loan's monthly payment, a bill's full amount — is what's left toward that target this period, and a target you've covered drops off instead of offering itself twice. Where a figure shrank, it says why: "Minimum payment · $35.00 of $35.00 paid" (#231)
- Open Pay on something already paid and the amount starts empty rather than pre-filling the whole recommendation again — which is how you record a payment twice
- The "Suggested" figure on a card shrinks as you pay it and disappears once there's nothing left
Real logos for nine more issuers
- Citi, Capital One, U.S. Bank, Bilt, Fifth Third, T-Mobile, Best Buy, Lowe's and Hyatt were showing initials on a colored chip. They now draw their actual logo in full color — Citi's blue and red, Best Buy's yellow tag, Fifth Third's 5/3 shield, T-Mobile's magenta T — on web, iPhone and Android alike (#231)
- A full-color logo sits on a white tile in both themes, because that's what it was drawn for; it's also what keeps Bilt's black wordmark visible in dark mode. Wordmarks keep their real proportions instead of being squeezed into a square
- "Citizens Bank" no longer shows Citi's logo, and Capital City Bank no longer shows Capital One's — a short brand name hiding inside a longer, unrelated one used to count as a match
- "Barclay" and "Barclaycard" find Barclays; a Centurion Card shows American Express
- Care Credit, Mission Lane, Aven, OpenSky, Indigo and LMCU have no logo we can license, so they keep initials — now on their own brand color, with the shorthand each uses for itself
Refund windows: what the stores actually allow
- Our 14-day, no-questions refund is a promise about fihaven.app, and the policy now says so plainly instead of implying it everywhere (#231)
- Google Play: 48 hours self-service, then come to us — after 48 hours Google stops handling it, and we refund from the Play Console on the same 14-day terms as a web purchase
- Apple: no published window, and Apple's decision — we can't issue, override or appeal an App Store refund. But you won't be worse off for buying through a store: if Apple refuses one we think you should have had, we make it right with equivalent Pro access
- EU / EEA / UK withdrawal rights, Paddle's Buyer Terms, and Paddle's 60-day tax/VAT-only refund path are all spelled out
Changes (Jul 28)
Income vs. spending in History
- The income panel was one bar per month scaled against your biggest month — income barely moves, so every bar ran nearly full width and they all looked the same. It's a two-line chart now: income vs. spending, oldest month first, the gap shaded as your net (#230)
- New headline: average net per month, with average income and average spending beside it
- Card payments no longer count as spending — the purchases they settle were already counted, so including both doubled your card spending. Bills and purchases merge into one figure; a bill both typed into Spending and marked paid counts once
- Months we can't account for are left blank, not drawn as zero. Card payments with nothing logged behind them break the line and shade the month rather than plotting $0 (which would read as a great month). Those months stay out of your averages
- The chart starts at your first recorded month, so it can't show a fake surplus for the years before you started logging
- Same chart and same rules on iPhone and Android
Cards lead with the amount you choose
- Utilization now measures against your current balance, not the statement — a card that closed at zero but has been used since no longer reads 0% (#230)
- Pick which of a card's three amounts gets the big figure: amount due, current balance, or what's left to pay this period
- What's due moved to the top-right corner of every card — amount, date, and urgency color in one place
Card logos on iPhone and Android
- Real brand marks instead of a colored dot, matching web; 26 more logos on every platform (#230)
- Every other issuer gets its initials on a brand-colored chip — C1, US, NF — with the real brand color where we know it
- "Bilt Mastercard" shows Bilt, not Mastercard; marks stay readable in dark mode
Changes (Jul 26–27)
- Cards ↔ bank accounts, part two: matching is reliable across more than one linked bank; cards show which account they matched and can be told don't link this one (#229)
- Push notifications fixed — iOS build 13 was the first with working push; Android push fixed in versionCode 35 (#225, #226)
- Web billing moves to Paddle; refund policy published
- Notification emails redesigned with one-click unsubscribe
Changes (Jul 18–25)
- Android Google Custom Tab sign-in returns into the app; native Plaid OAuth returns to iOS/Android instead of the web redirect (#194, #195)
- App-level MFA after Google/Apple when enrolled; verify Apple StoreKit JWS; auth Google Play RTDN (#185)
- Expanded Rewards catalog with Update / Keep mine when admin rates change — never a silent overwrite (#183)
- Family plan & trials; ownership & licensing; category icons; list spacing
Earlier in 1.6.1
- Admin user/promo console; Rewards redesign + report wrong rate
- Debt payoff redesign;
user_dataencryption; Play upload automation; health probe
Full notes: CHANGELOG.md
v1.6.0 — Bank sync that works, card due dates & skip, two data-loss fixes
Release sent to TestFlight, App Store (pending approval), and Play Store Closed testing (email daniel@fihaven.app to get access).
Bank linking now actually imports something, cards tell you when they're due and let you skip a payment, and the dashboard shows who's really taking the money. Under the hood: two data‑loss bugs fixed and the reason notification emails were quietly going missing.
⚠️ Data loss — fixed
- Changing a setting could erase your data. Changing currency, timezone, default view, or a bank toggle saved only part of your account and the server treated the rest as deleted — wiping your Spending transactions, net‑worth accounts, and savings goals. Fixed and covered by a test.
- Autopay auto‑marking could erase the same data on a different code path. Also fixed.
Bank sync (Plaid) — it works now
- Linking a bank actually imports something (it used to just connect and stop)
- We ask what you want right after linking — import purchases, update card balances, or neither
- Syncs on its own — on link, on app open, on a webhook, and the moment you turn importing on
- Your history is no longer thrown away when importing is off
- Accept or decline a pending bank charge — Keep it or remove it, and a declined charge never comes back, even after it settles under a new id
Cards
- See when a card is due — the actual date ("Due Jul 28 · in 15 days", "Overdue — was due Jul 12")
- Skip a payment (with a warning if you still owe the minimum)
- "Already paid this month?" when you add a card, so its 0% payoff plan starts from the right place
Rewards
- Report a wrong reward rate — corrects your card immediately and tells us so the shared presets get fixed for everyone
Dashboard
- Upcoming rows show the business (or a card's issuer) under the name
Notifications
- A failed reminder email is retried instead of silently dropped
- The hourly scheduler no longer drifts past the hour it should send in
📄 Full technical detail in the CHANGELOG.
v1.5.0 — Bank linking, Net Worth tab, archive, passkeys & push
iOS 1.5.0 (10) · Android build 18
The big pre-launch wave — budget lenses and push notifications on every platform, bank linking live in production, real subscription brand logos, and archive‑instead‑of‑delete for bills, cards, and loans.
Budget & spending
- Budget lenses (50/30/20, envelopes, debt‑focus) on iOS & Android, not just web
- Envelope editor and spending insights (Pro)
- Household rollup — a shared dashboard card for couples/families
Net worth & accounts
- Net Worth is its own free tab — assets minus debts — on web, iOS & Android
Bills, cards & loans
- Archive instead of delete — retire an item without losing its history; restore anytime
- Payoff plan for 0% cards; set a separate autopay day from the due date
Subscriptions
- Real brand logos (Netflix, Spotify, YouTube, …); jump straight to the bill; save or share a manage/cancel link
Notifications
- Push notifications on iOS/Android and browser notifications on the web
Sign in
- Passwordless passkey sign‑in on web, iOS & Android
Pricing & plans
- Real prices: $1.99/mo, $14.99/yr, and a $25.99/yr Family plan (a shared household of up to 3)
Plus monthly rollover, a redesigned native Bills tab, iOS currency‑field polish, a long tail of Android layout fixes, and refreshed dark‑mode marketing pages.
📄 Full detail in the CHANGELOG.
v1.4.2 — Pro & Family onboarding + source available license
Pro and Family sharing messaging on intro, onboarding, paywall, and household settings — plus a new source available license replacing AGPL.
Changed
- License — replace AGPL-3.0 with the FiHaven Source Available License: public code for transparency and contributions; no production hosting, commercial redistribution, or stripping entitlements without permission.
- Terms of Use — clarify account sharing, API misuse, Pro circumvention on the hosted service, family sharing in Pro, and how the source license differs from using fihaven.app.
- Intro Pro step — feature highlights (payoff planner, family sharing, calendar, rewards, category budgets) on web
/welcome, iOS, and Android intro screens. - Post-signup onboarding — Pro tour step lists the same highlights; final step offers See Premium plans and Continue with Free on iOS and Android.
- Web welcome Pro step — Start free trial launches Stripe Checkout; Get Premium opens the Pro dialog; Continue with Free skips to the dashboard.
- Paywall copy — Family sharing listed as a Pro perk on web, iOS, and Android paywalls.
- Settings → Family (non-Pro) — upgrade entry points with clearer copy that invitees can join for free; Pro badge on the Family row when locked (iOS).
- Android
versionCode8 (same1.4.2build for Play re-upload). - iOS build numbers —
project.yml/Info.plistaligned to 1.4.2 (8);scripts/ios-testflight.sharchives and uploads to App Store Connect.
Fixed
- Android PendingIntents (CodeQL #31, #32) — bill-reminder alarm and notification tap intents use the explicit
Intent(context, Class)constructor so CodeQL recognizes fixed destination components. - iOS CI —
ios.ymlselects Xcode viasetup-xcode(latest-stable) instead of standalone Swift 6.0.3, fixing FiHavenCore manifest / SDK mismatch on GitHub runners.
Full changelog: https://github.com/Greigh/FiHaven/blob/main/CHANGELOG.md#142--2026-06-26
v1.4.1 — CodeQL security fixes
CodeQL security remediations for Android bill reminders and household invite email validation, plus Android housekeeping for the intro screen and encrypted token storage.
Changed
- Information security policy — documents that CodeQL runs on
mainpushes, weekly schedule, and manual dispatch (not on every pull request). - Android intro icons —
ReceiptLongandTrendingUpuse auto-mirrored Material icons on the pre-login intro for RTL locales. - Android token storage — document intentional use of deprecated
EncryptedSharedPreferencesuntil a stablesecurity-cryptosuccessor ships. - Android
versionCode6 (same1.4.1build for Play re-upload).
Fixed
- Android PendingIntents — bill-reminder alarm and notification tap intents use explicit
ComponentNamedestinations withFLAG_IMMUTABLE(CodeQLjava/android/implicit-pendingintents, alerts #31 and #32). - Household invite email validation — reuse shared
isValidEmail()with a 254-character cap before regex matching (CodeQLjs/polynomial-redos, alert #33).
Full changelog: https://github.com/Greigh/FiHaven/blob/main/CHANGELOG.md#141--2026-06-26
v1.4.0 — Budget lenses, household sharing & iOS accessibility
Budget lenses, household sharing, dashboard budget insights, trial reminders, envelope rollover, iOS accessibility, and subscription action links — with 354 Vitest tests.
Added
- Budget lenses — optional split presets (50/30/20, 80/20, 60/20/20, 70/20/10, custom), obligations-first / safe-to-spend, debt-focus with
debtFocusExtra, and envelope lite (Pro) on web, iOS, and Android. - Envelope editor & rollover (Pro) — assign per-goal and per-category envelope amounts on the Budget tab; optionally roll unused category envelopes into the next period.
- Dashboard budget status widget — safe-to-spend / lens headline as a reorderable dashboard widget.
- Richer dashboard alerts — high credit utilization, subscription trials ending soon, and 0% promo cliffs on web, iOS, and Android.
- Subscription action panel — cancel/manage links, duplicate detection, and
trialEndscountdown on subscription bills. - Trial-ending reminders — email via the scheduler lead window and local notifications on iOS/Android when a subscription trial ends within three days.
- Spending insights (Pro) — top category deltas vs the previous period on web and iOS.
- Budget onboarding — welcome flow toggle for detailed tracking vs one-tap 50/30/20 lens when Budget is a goal.
- Household sharing — create/join households, email invites, shared entity sync, and live SSE collaboration on web, iOS, and Android.
- iOS accessibility — Dynamic Type, VoiceOver labels, reduced-motion animations, and semantic amount/status presentation.
- 354 Vitest tests (up from 326).
Changed
- Settings → Budget lens and Family (household) on all clients.
- Entitlements include
householdMaxfor Pro vs Family tier caps. docs/competitive-roadmap.mdanddocs/native-contract.mdupdated.- Dependencies:
stripe22.3.0,@simplewebauthn/server13.3.2; AndroidversionCode4.
Fixed
- Contact page dark mode — legal/contact sub-panels no longer wash out against the dark hero shell.
Full changelog: https://github.com/Greigh/FiHaven/blob/main/CHANGELOG.md#140--2026-06-26
v1.3.0 — Dashboard widgets, reminders & hourly income
Dashboard customization, reminders across email and native apps, hourly income and income history, branded social sign-in, and dev entitlement testing — with expanded scheduler settings and 326 Vitest tests.
Added
- Customizable dashboard — Classic (fixed) or Widgets layout on web, iOS, and Android. Reorder and toggle nine shared widgets: overview tiles, period cash-flow, alerts, upcoming payments, net worth, spending, savings goals, subscriptions, and income history.
- Income history — 12-month income trend with bonuses and average monthly pay on web, History tab (iOS/Android), and as a dashboard widget. Includes hourly-rate support with
hoursPerWeekon every client. - Local bill reminders — opt-in on-device notifications on iOS and Android; rescheduled when data changes and after reboot on Android.
- Configurable reminders —
reminderLeadDays(0–14),notifyHour(0–23), and optionalremindOnDueDayon web, iOS, Android, and the server scheduler. - Weekly digest email — opt-in Monday summary of bills due in the next seven days plus card-debt total.
- Branded social sign-in — Apple and Google buttons with official logos on web, iOS, and Android.
- Dev entitlement override — DEBUG-only Pro simulation on web, iOS, and Android for paywall testing without a real purchase.
scripts/mail-check.js— on-server SMTP diagnostic with hints for common relay/firewall issues.- 326 Vitest tests (up from 293).
Changed
- Bill-reminder emails follow user lead-time and due-day settings.
- Unified Settings → Notifications section on all clients.
- Android widget-mode dashboard and notification preference sheets.
native-contract.md, README, and platform READMEs updated.- Dependencies:
stripe22.2.3; AndroidversionCode3.
Fixed
- Hourly income sources without
hoursPerWeeknow contribute $0 to budget totals.
Full changelog: https://github.com/Greigh/FiHaven/blob/main/CHANGELOG.md#130--2026-06-23
v1.2.3
Public site, sign-in, and reliability release: marketing pages with SEO
discovery, optional Apple/Google OAuth on every client, Android
app.fihaven identity, rolling-period anchors, autopay memory fixes,
clear-data controls, and production deploy templates.
Added
- Marketing site — FAQ, pricing, security, and contact pages with
shared footer links and a public navbar (Home, Pricing, FAQ, Log In).
Homepage, privacy, and terms copy refreshed for web-first positioning and
accurate Free vs Pro scope. - SEO & discovery — expanded
sitemap.xmlandrobots.txt,
site.webmanifestupdates, RFC 9116security.txt, richer homepage
JSON-LD, and IndexNow (npm run indexnow) with a Vite-built key file
and deploy hook. - Social sign-in — optional Apple and Google OAuth on web, iOS, and
Android (server/oauth.js,client/js/social-login.js); buttons stay
hidden until provider client IDs are configured. - Rolling-period anchor — optional
periodAnchordate for rolling
budget windows on web, iOS, and Android. - Autopay memory — per-calendar-month
autopayDonetracking on
client and server so undone auto-marks are not re-applied; $0 items no
longer loop forever. - Clear data —
POST /api/account/clear-datawith password and TOTP
gates; settings UI on web, iOS, and Android. - Onboarding goals — welcome flow can tailor the default tab order to
bills, debt, budget, rewards, or subscriptions. - Deploy templates —
scripts/examples/upload.example.sh(backup,
build, rsync, PM2 restart, HTTP verify, IndexNow) and
rollback.example.sh; maintainer utilities moved underscripts/dev/. - Billing profile — “Member since” / “Pro for” line when entitlement
history is available. - 293 Vitest tests (up from 275) — autopay, period anchor, scheduler,
and integration coverage for the above.
Changed
- Android package —
com.danielhipskind.fihaven→app.fihaven
(applicationId, namespace, and Play Billing product IDs
app.fihaven.pro.monthly/.yearly). - iOS bundle —
app.fihavenprefix, StoreKit product IDs aligned,
redesigned intro carousel, card-skip warning when minimum/goal unpaid,
Google Sign-In SDK, and Sign in with Apple entitlements. - Card recommendations — 0% APR (non-promo) cards recommend minimum
payment only, not full balance. - Account deletion — requires typing
DELETE ACCOUNT DATA; TOTP when
2FA is enrolled (delete and clear-data). - WebAuthn RP origin — production uses
PUBLIC_ORIGINor
https://fihaven.app. native-contract.md— production base URL and product ID updates.- Dependencies —
better-sqlite312.11.1; Vitest 4.1.9.
Fixed
- Autopay re-marking after a user removes an auto-generated payment.
- Rolling periods spanning multiple calendar months reading autopay memory
from every overlappedYYYY-MMbucket. - Date-less payments in calendar mode placed by
monthKeyonly. - iOS card skip without warning when minimum or policy goal is still due.
v1.2.2 — Password visibility, test suite expansion & icon refresh
Polish and quality release: expanded test coverage, password visibility on
all platforms, refreshed app icons, Android dependency updates, and CI fixes.
Added
- Password show/hide — eye toggle on web (login, reset, settings),
iOS (RevealableSecureField), and Android auth/settings. - Integration test suite — nine flows covering auth, export, period
budget, scheduler email, subscriptions, autopay sync, card presets, and
security (serialized Vitest project with real Express boot). subscriptionsFinder.js— extracted recurring-subscription detection
shared by the web panel and tests.- Server unit tests — emails, mail, scheduler, rate limits, tokens,
util, bill schedule, captcha, session. - Expanded client unit tests — payoff, autopay, rewards render, password
toggle, theme, subscriptions finder, and additional coverage for period,
export, card presets, and utils. - 275 Vitest tests total across unit and integration projects.
Changed
- App icons regenerated from
client/public/icon.svg(iOS asset
catalog + Android mipmaps); slimmer launcher background. - Android dashboard — branded
ScreenHeaderand grouped upcoming rows
in a single card (iOS parity). native-contract.md— full tab list and Pro-gating parity matrix.- README badges — Swift 6.3.1, Kotlin 2.3.21.
- Android dependencies — Compose BOM 2026.05.01, Plaid 5.5.2,
activity-compose 1.13.0, kotlinx 1.11.0, JUnit 6.1.0; swipe-to-dismiss
migrated off deprecated Compose API. - CodeQL Action v4 (Node 24 runtime).
Fixed
- Rolling-period
boundsForKeyround-trip in webperiod.js. - Kotlin pinned to 2.3.21 so CodeQL traced Gradle builds succeed
(extractor lacks 2.4.0 support until github/codeql#21938).
Full changelog: https://github.com/Greigh/FiHaven/blob/main/CHANGELOG.md#122--2026-06-15
v1.2.1 — Native branding, Android sync & bill frequency parity
Polish release: bill frequency parity, Spending/Subscriptions tabs, native
branding, Android production sync, and payment-history editing.
Added
- Bill frequency scheduling — Weekly, Bi-weekly, Quarterly, and Annually
bills drive real due dates across web, iOS, Android, and the server
(calendar, upcoming, budget obligations, autopay, reminders). - Bill active windows — optional
startDate/endDate; Next: {date}
on Bills and Subscriptions. - Spending tab — manual spend logging moved out of Budget into its own tab
on web, iOS, and Android. - Subscriptions screens — dedicated iOS and Android views (web already had
the panel). - Hide fully paid on dashboard setting — fully paid items drop out of
Upcoming. - Bio-lock grace period — Never, Immediately, or 1 / 5 / 15 / 30 minutes
(Android also supports a custom 1–60 minute delay). - Payment history edit/delete — long-press a row on iOS and Android to
edit amount/date/note or delete. - Card preset auto-detect — adding/editing a card suggests a preset from
the rewards database (web, iOS, Android). - Android Turnstile captcha on the auth screen.
- Web navbar “More” dropdown — Subscriptions, Calendar, History, Payoff,
Rewards live under More; primary tabs stay Dashboard / Bills / Cards / Loans
/ Budget / Spending. - Loans page hero styling on web.
- Vitest suite for core web logic (~92% coverage).
Changed
- Dashboard period model — prorate income for rolling / custom start-day
periods; obligations filter to bills due in the active period. - Card payments decrement live balance (
applyCardPaymentDelta). - Rewards —
pointValue, rotating 5% category pools, expanded card
presets. - Pro paywall perks aligned across web, iOS, and Android.
- Cards tab (native) — card-only summary (balance / credit / utilization);
net worth and asset accounts removed from Cards (still on Budget). - FiHaven branding (native) — app icons regenerated from
client/public/icon.svg; toolbar Fi monogram on every iOS tab and
branded headers on Android; Settings paid-goal control uses segmented / pill
UI instead of a cramped menu. - Android defaults to the production API (
https://fihaven.app); lenient
JSON decode for legacy payment IDs; loading gate with retry/error screen
after sign-in. - iOS project — Xcode 26 recommended settings in
project.yml, launch
screen assets, deployment target 18.6. - Dependency bumps: nodemailer 9, Android billing/crypto/lifecycle/coroutines
libraries.
Fixed
- Android data load — strict JSON decoding no longer wipes the whole
dataset when the server returns legacy numeric payment IDs. - Bills UX (native) — business/name on separate lines; tap status to
pay, undo, or un-skip. - Rolling
shiftPeriodbug in web period logic. - CI / security — green Codecov, AES-GCM biometric key hardening, looped
HTML sanitization fix.