← back to mizan
Changelog
The same release notes that ship inside the app
(Settings → About → Release notes).
v1.5.0 — 24 May 2026
New: Scan receipt with AI
- New "Scan receipt with AI" card at the top of the New / Edit expense screen. Snap a photo (or pick from gallery) and Mizan asks your configured vision-capable AI provider to extract the total, merchant, date, and best-fit category — the form fills in for you to review and save.
- Privacy posture: the receipt image (1024×1024 JPEG, ~50–200 KB), your category names, and your currency setting are the ONLY things that leave the device. No other transactions, no budgets, no account balances. Tap the "What gets sent?" disclosure on the scan card to see the exact payload before you tap.
- Works with: OpenAI gpt-4o / gpt-4o-mini, Anthropic Claude 3+ / 4, Google Gemini 1.5 / 2.x, and any vision-capable open-weights model (LLaVA, Pixtral, Qwen-VL, Llama-3.2-vision, etc.). The button auto-hides for text-only providers (Groq / DeepSeek / Mixtral / non-vision Llama). Custom or self-hosted vision models that the heuristic doesn't recognise can be forced on via a new "Supports image input" toggle on the provider settings.
New: Free tier: 5 scans per day
- Free users get 5 receipt scans per day (resets at local midnight). Premium is unlimited. The cap is on scans, not on any other AI features — chat, voice quick-entry, Auto category, and Suggest budgets are unchanged.
v1.4.14 — 20 May 2026
fix: Encrypted backup save
- Switched the backup save flow from file_picker.saveFile to a native MediaStore writer on Android 10+. file_picker silently produced 0-byte files on HyperOS Android 16 for four release iterations; the new path inserts directly into MediaStore.Downloads via ContentResolver, writes the bytes, then re-reads + counts them before reporting success. Falls through to the share-sheet on older Androids or unexpected failures.
- Pull-to-refresh on the home screen finally moves with your finger — the CustomScrollView now uses AlwaysScrollableScrollPhysics so the gesture engages even when content fits the screen (the previous default ClampingScrollPhysics clamped overscroll to zero and killed the gesture entirely).
improvement: Restore confirmation
- Restoring a backup now uses a Yes/No confirmation dialog instead of the typed-REPLACE gate. By the time you've located the file + typed the passphrase, the funnel friction is already high enough that an extra typing step reads as hostile. Reset Everything keeps its typed-RESET gate — that one nukes Premium entitlements + onboarding state too, so the extra friction is warranted.
v1.4.13 — 18 May 2026
fix: Pull-to-refresh
- Pull-to-refresh on the home screen now travels visibly when you drag from the top — the default indicator distance felt stuck on HyperOS / large-screen phones. Bumped displacement + tuned the stroke to match the Material 3 spec.
New: Diagnostic dialogs for backup save + AI errors
- Every encrypted backup save now opens a dialog with the exact bytes written, the safety-copy size on disk, the SAF target path + its on-disk size, and whether each landed correctly. SelectableText so you can long-press → copy → paste into a feedback report. The goal is to close the v1.4.12 HyperOS 0-byte silent-no-op investigation by gathering data from real tester devices.
- AI Auto category errors now open a dialog with the HTTP status, full URL, model identifier, and the first 200 chars of the response body. Same long-press-to-copy treatment. Hunting the OpenRouter "client error 404" report.
v1.4.12 — 18 May 2026
fix: Encrypted backup — save reliability
- Fixed the silent-no-op SAF save on HyperOS Android 16 where the system picker would create a 0-byte placeholder file in Downloads and report success. The verifier now correctly treats unverifiable paths as failed and falls back to the share-sheet (so the user gets the real bytes via Drive / Telegram / wherever they pick).
- When restoring an empty .mizan file, the error message now reads "This .mizan file is empty — try a different backup file" instead of the developer-flavoured "not valid JSON".
- Other restore errors now say "Invalid Mizan backup. The file may be corrupted or not a Mizan backup" — no more raw parser detail leaking into the snackbar.
- The restore file picker is filtered to .mizan files only, matching the Windows file-type dropdown UX.
New: Daily summary
- Daily summary notification now requests the system notifications permission when you enable the toggle (Android 13+ requirement). Previously the schedule went out but Android silently dropped the notification at fire time when the permission wasn't granted.
improvement: Polish
- Tapping a .mizan file from Files / Drive now puts Mizan at the top of the chooser (or opens it directly if Mizan is already the default), no more "select documents" detour through HyperOS's file-type prompt.
- Post-update patch notes modal no longer auto-fires on launch — the full version history is still one tap away from Settings → About → Release notes.
fix: AI assistant on OpenRouter
- Cloud requests now include the HTTP-Referer + X-Title identity headers OpenRouter requires for free-tier traffic. The AI Auto category chip's "client error 404" on OpenRouter providers is gone — same fix benefits chat + Smart-budget suggestions which use the same code path.
- AI Auto category chip is available to every user with a configured provider again (the v1.4.12 Premium-only gate was a workaround for the 404 above and has been reverted).
fix: Home-screen widget refresh
- Editing an existing expense, undoing a delete, quick-entry adds, and "Delete all expenses" now all trigger an immediate widget refresh — previously only the home-screen add + delete paths fired the broadcast and the others left the widget showing stale numbers until the 30-minute update cycle.
v1.4.11 — 16 May 2026
New: What's new
- Tapping a .mizan file in Files / Drive / SAF now opens Mizan straight into the restore flow with the file pre-loaded. No more landing on the home screen with the file dropped.
- Daily summary notification — optional evening recap of today's spending. Off by default; turn on in Settings → Notifications and pick the fire time. Days with no transactions are skipped so the notification only fires when there's something to summarise.
- Settings → About → Send feedback opens the in-app feedback page on usemizan.app in your browser.
improvement: Deep-link manifest cleanup
- Split the .mizan file association into scheme-specific intent filters (content + file). Removed the http/https wildcard that was failing Play Console's deep-link verifier — Mizan is no longer offered as a handler for https://*.mizan URLs (which never made sense anyway).
v1.4.10 — 16 May 2026
New: Home-screen widgets — overhaul
- Translucent "frosted-glass" background by default — the widget lets your wallpaper bleed through. Toggle off in Settings → Appearance → Translucent widgets for a solid card.
- Brand wordmark + a variant title ("Spent" / "Remaining") in serif at the top of every widget — you can tell at a glance which one you're looking at.
- Distinct names in the picker: Spent · Small, Spent · Medium, Remaining · Small, Remaining · Medium (no more four identical "Mizan" tiles).
- Small widgets now have the thin budget progress bar at the bottom too — used to be medium-only.
fix: Widget fixes
- Home-screen widgets can be added again on Android 16 / HyperOS V816+. The system tightened its RemoteViews allowlist and rejected the spacer element inside every widget layout — the launcher refused to inflate. Swapped to a TextView spacer (the only allowlist-safe option).
- The dominant currency number now auto-shrinks to fit the small 2x2 card — no more "154…" truncation when budget values stretch the available width.
- Setting / clearing a budget now refreshes every placed widget immediately. Previously the widget stayed stale until the 30-minute update cycle eventually fired.
- Debug-build widgets now refresh correctly. The home_widget plugin's class-name resolution didn't account for applicationIdSuffix, so debug variants silently dropped every update broadcast — the placed widget never saw new data even when the in-app prefs had been written.
improvement: Hardening
- Release builds use Dart symbol obfuscation + split debug info. Source-level identifiers are no longer recoverable from the shipped binary; the symbol maps live off-device for crash decoding via flutter symbolize.
v1.4.9 — 13 May 2026
New: What's new
- Settings → Data now has a "Reset everything" tile under "Delete all expenses" — wipes every expense, budget, recurring transaction, custom category and account, AI provider + key, and every setting. Premium subscription stays (it lives at the store, not on the device). Requires typing RESET to confirm.
fix: Fixes
- Patch-notes opt-out dialog buttons are now centred instead of right-aligned (Material 3 default was leaving them looking off-axis when the labels wrapped)
- Backup hardening: two end-to-end regression tests walk the full Settings → Encrypted backup → Restore flow, asserting the active provider's API key survives via the same public surface the chat screen reads
v1.4.8 — 12 May 2026
New: What's new
- Patch notes appear after every update so you don't miss new features
- Settings → About → Release notes shows the full version history
- Tap the X on the patch notes sheet to opt out of future update notes
fix: AI reliability
- 120-second request timeout (was unlimited) so a hung provider can't leave the chat staring at a blank thinking indicator forever
- Automatic retry on rate-limit (429) responses with exponential backoff, up to 3 attempts — respects the provider's Retry-After header when present
- Friendly retry button on every AI error, with kind-specific messages (rate-limited / timeout / network / context too long / etc) instead of generic 'something failed'
- Concurrent send guard — tapping Send twice quickly no longer fires two parallel requests
- Context-too-long errors now surface a specific 'try a model with a larger context window' message instead of failing silently
fix: Bug fixes
- AI assistant no longer silently hangs — every failed request now surfaces a specific error message (rate-limited, timeout, network down, context too long) with a one-tap retry button
- AI requests now have a 120-second timeout (was effectively unbounded) so genuinely hung requests fail fast instead of leaving a blank chat
- Rate-limit (429) responses now trigger up to 2 automatic retries with exponential backoff, respecting any Retry-After header the provider returns
- Double-tapping Send while a previous request is still in flight is now harmless — the second tap is dropped without making a duplicate API call
- Malformed responses (provider returned non-JSON or unexpected schema) raise a specific 'couldn't read the response' error instead of failing silently
improvement: Improvements
- "Update available" banner appears at the bottom of the home screen when a newer Mizan is on Play Store — tap Update to download in the background, dismiss with the × to hide until the next launch
- Faster cold start — the five blocking loads on launch now run in parallel instead of one after the other (~300ms saved on a low-end phone)
- New AI request log in Settings → Developer (debug builds only) — shows every CloudLlm call with timing, status, retry count, and error kind, for diagnosing intermittent issues
v1.4.7 — 11 May 2026
fix: Bug fixes
- Yearly subscription tile is now visible in dark mode — was rendering invisibly because the white accent card's decoration wasn't painting
New: What's new
- AI Auto chip on the Add Expense screen — picks the best category for you when an AI provider is configured
- Auto chip works with built-in AND your custom categories, even ones with UUID ids
v1.4.6 — 10 May 2026
fix: Bug fixes
- Encrypted backup safety-copy path detection on HyperOS / Android 16 — the SAF write-verification was over-eagerly falling to share even when the picker wrote successfully
improvement: Improvements
- Currency display normalised across the app — ISO codes (AED, USD, EUR) instead of mixed locale symbols
- Store prices from Play (e.g. "dh 73.00") get rewritten to match ("AED 73.00") for visual consistency
- Zero-decimal currencies (JPY, KRW, VND…) now format without minor units
v1.4.5 — 9 May 2026
improvement: Improvements
- Donut chart colours are easier to tell apart — widened the grey range so adjacent segments contrast clearly
- Breakdown rows show the same chip colour as the matching donut segment so you can match colour-to-category at a glance
v1.4.4 — 8 May 2026
fix: Bug fixes
- Backup save now writes a verified safety copy first then attempts SAF — never leaves you without a copy if the picker misbehaves
- Toast copy is honest about where the safety copy ended up — in-sandbox vs Files-reachable
v1.4.3 — 7 May 2026
fix: Bug fixes
- Encrypted backup v2 → v3 envelope migration — backups created in 1.4.2 are now restorable cleanly
- Restore confirms with a typed REPLACE so you can't fat-finger your way to data loss
v1.4.2 — 6 May 2026
New: What's new
- Encrypted backups now include your settings AND configured AI provider keys, not just expenses
- .mizan file extension registered with Android so tapping a backup file opens Mizan
- Multi-select CSV export — pick what to include (expenses, budgets, categories, accounts, recurring)
v1.4.1 — 5 May 2026
fix: Bug fixes
- Dark-mode contrast fixed on Add Expense screen
- Premium upsell prices now show the same currency throughout (no more USD next to AED)
- Restore-from-backup picker is no longer a one-way UX trap
v1.4.0 — 4 May 2026
New: Welcome to Mizan
- Privacy-first expense tracking — your data stays on your device, no accounts, no analytics, no ads
- Encrypted backups with AES-256-GCM + PBKDF2 (600k iterations) — passphrase-protected
- Optional AI assistant — bring your own API key (OpenAI / Anthropic / OpenRouter / Groq / Gemini / DeepSeek / Ollama / custom)
- Premium tiers: monthly, yearly, or lifetime
- Receipt photo attachments, recurring transactions, budgets with threshold alerts, biometric app lock