Releases: off-grid-ai/OGAM
Release list
Off Grid 0.0.103
This is the big one. It bundles everything from the last stretch of work into one production release, and the theme is control and stability: real control over how the app uses memory, and a hard pass over the things that were breaking — downloads, voice, and stopping a reply.
New
- Model-loading modes: Lean, Balanced, and Aggressive. You decide how much memory models are allowed to use.
- The model manager shows what's loaded and how much RAM each model is eating, with an eject button per model and an Eject All that frees everything, voice and transcription included.
- Transcription (STT) and Text-to-Speech (TTS) now live in Model Settings next to your text models.
- Turn Thinking on or off for reasoning models right from chat.
- Remote (cloud) models get a cloud marker so you can tell them apart from on-device ones at a glance.
- A vision model missing its file now gives you a Repair action, with a real progress bar, instead of a vague "not supported."
- A "Stay in the loop" card in Settings, plus Follow on X and Join Slack links.
Downloads
- A download interrupted by a hard app-kill comes back as a failed card you can retry, instead of disappearing.
- Queued downloads survive an app restart and resume.
- Failed downloads show up in the badge count and the Download Manager.
- Retry on a failed image download re-downloads and recovers, even when the file was unrecoverable, and on iOS it keeps the part already on disk instead of starting over.
Voice
- Voice notes and dictation transcribe reliably, and voice notes are sent as text the model can actually read, never as raw audio.
- Voice mode no longer reads tool-call text out loud, so spoken replies stay clean, and reasoning shown before a tool runs sticks around instead of disappearing.
- Live reasoning streams smoothly while you're in voice mode.
- The speech picker and mic show a real download progress ring instead of a spinning mic.
- Push-to-talk has a clear inline hint, a visible slide-to-cancel pill, and a scaled mic. The mic stays usable while a model loads, with no ghost recording if you release early.
- Stopping speech now stops it cleanly, with no mid-sentence wedge.
Generation and reasoning
- Stopping a reply mid-stream keeps what was already written, reasoning included, and no longer wedges the chat.
- A stopped reply is no longer mislabeled as a token-limit cutoff or an incompatible backend, and a genuine cutoff now shows a clear indicator.
- The Thinking toggle applies to the turn you're on. Reasoning support is read from the model's own chat template, and remote model reasoning (LM Studio, Ollama) shows in the Thinking block instead of being dropped.
- Broken or partly-downloaded models are caught before generation with a plain error telling you what's wrong, instead of failing silently.
- Prompt enhancement streams as it writes and no longer turns reasoning text into your image prompt.
Models, images, and memory
- 9B models load and run fast on both iOS and Android.
- Switching models goes through the memory-aware loader, so a new model loads without running out of RAM, and it waits for the previous model's memory to free first.
- Load Anyway is offered for any model that's over budget, and it measures real free RAM after clearing space. A hard memory limit that can't be worked around is shown as a hard stop rather than something you can override.
- The load spinner appears on the row you tapped, and a GPU load that falls back to CPU now tells you it did.
- Image generation guides you on the GPU speed and quality trade-off before a run, and no longer produces garbage-resolution output.
- Image settings (steps, guidance, size) use the values you set, and Reset to Defaults resets them too.
- The context-length slider goes up to each model's real trained maximum.
- Switching to Lean actually frees resident models now.
- Aggressive mode accounts for GPU buffers so it doesn't overcommit and fail a load.
- On Android, GPU loads wait longer on first run so they don't silently drop to CPU and run slow.
Knowledge base and projects
- Knowledge-base search is only sent when you turn it on, never auto-injected, and a failed index rolls back cleanly.
- Deleting a project cleans up its chats and knowledge-base tool instead of leaving them dangling, and a new chat started when the context is full stays listed under its project.
iOS
- The image viewer closes before the Save prompt, and the audio session releases before the photo picker, fixing the input and voice-mode hangs.
- Message attachments (a voice note above an image) now stack vertically instead of overlapping.
Plus faster first launch, model-load messages that read honestly and don't claim to free memory they didn't, larger tool results capped so a misbehaving tool can't overflow the model's context, and better parsing of tool calls with curly quotes or unquoted keys.
Off Grid 0.0.103-beta.4 (beta)
Features
- New model-loading modes: Lean, Balanced, and Aggressive, so you control how much memory the app gives to models.
- Model Settings now includes Transcription (STT) and Text to Speech (TTS) alongside your text models.
- The model manager shows what is loaded and how much RAM each model uses, with a per-row eject button and Eject All.
- Remote (cloud) models now show a cloud marker in the selector so you can tell them apart from on-device models.
- When a vision model is missing its image file, you get a repair action instead of a vague "not supported" message.
- Added Follow on X and Join Slack links so you can keep up with what is shipping.
Fixes
- Downloads that were interrupted by a hard app-kill now come back as failed cards you can retry, instead of disappearing.
- Queued downloads survive an app restart and resume.
- Failed downloads now show up in the badge count and the Download Manager.
- Tapping Retry on a failed image download re-downloads and recovers.
- A model that is downloaded but its image file is unrecoverable now re-downloads on retry.
- The Home speech picker and mic now show the real download progress ring instead of a spinning mic.
- Push-to-talk shows a clear inline hint, a visible slide-to-cancel pill, and a scaled mic.
- The mic stays usable while a model is loading, with no leftover ghost recording when you release early.
- Stopping a reply mid-stream keeps what was already written, including reasoning-only partials, and no longer wedges the chat.
- A stopped reply is no longer mislabeled as cut off at the token limit or as an incompatible backend.
- The Thinking toggle now applies to the current turn.
- Remote model reasoning (LM Studio, Ollama) now shows in the Thinking block instead of being dropped.
- Prompt enhancement now streams as it writes and no longer turns reasoning text into the image prompt.
- The load spinner appears on the model row you tapped, and a GPU load that falls back to CPU now shows that it did.
- The context-length slider now goes up to each model's real trained maximum.
- Image settings (steps, guidance, size) now use the values you set, and Reset to Defaults resets them too.
- Changing the load mode to Lean now takes effect and frees resident models.
- Voice notes are sent as transcribed text only, never as raw audio the model cannot read.
- A tool result that is too large is capped so a misbehaving tool cannot overflow the model's context.
- Tool calls with curly quotes or unquoted keys are now parsed instead of failing.
- Deleting a project cleans up its chats and knowledge-base tool instead of leaving them dangling.
- iOS: the image viewer closes before the Save prompt, and the audio session is released before the photo picker, fixing input and voice-mode hangs.
- The image preview placeholder glyph now disappears once the live preview renders.
Improvements
- Android GPU model loads wait longer on first run, so they no longer fall back to CPU silently and run slow.
- Reloading a model waits for the previous model's memory to be freed first, reducing out-of-memory failures when switching.
- Load Anyway is always offered when a model is over budget, and it measures real free RAM after eviction.
- First app paint no longer waits on download-state recovery, so the app opens faster.
- Debug builds now install alongside the store build and are labeled "Off Grid AI Debug".
Build: 1784144537
Off Grid 0.0.103-beta.3 (beta)
Features
- New Model Loading modes: pick Lean, Balanced, or Aggressive to control how many models stay in memory at once.
- The model selector now shows what is currently loaded and how much RAM it is using, with a per-model eject and an Eject All that frees everything, including voice and transcription sidecars.
- Transcription (STT) and Text to Speech (TTS) now appear in Model Settings.
- Remote models are marked with a cloud badge in the Models sheet so you can tell local from remote at a glance.
- When a vision model is missing its projector file, you now get a Repair action (wrench icon) instead of a bare "not supported" message.
- New "Stay in the loop" card in Settings and links on the About screen to follow @alichherawalla on X and join Slack.
Fixes
- Voice notes and chat-mode dictation now transcribe reliably and drop the text into the input box instead of failing silently.
- The voice-mode mic turns into a Stop button during generation, stops when you leave the screen, and no longer opens a second session on a double tap.
- A background transcription-model download now shows a real download ring, not a mic that looks stuck loading.
- Failed downloads now show up on the badge and in the Download Manager instead of disappearing.
- Download retry on iOS works again, marks the item as queued right away, and queued downloads survive an app kill or restart.
- Retrying an image-model download recovers from a failed extraction instead of erroring out.
- Vision models pair with the correct projector file and refuse a mismatched one, and images can only be sent to a model that actually supports vision.
- Stopping generation keeps the partial reply you already saw, including reasoning, and a stopped turn is no longer mislabeled as an error, an incompatible backend, or "cut off at the token limit."
- A genuine token-limit cutoff now shows a clear cut-off indicator.
- The Thinking toggle now applies to the turn you are on, with no off-by-one delay.
- Changing the model-loading mode now takes effect immediately and ejects the previous residents.
- Image settings (size, guidance, steps) now use the values you set rather than a stale snapshot, and Reset to Defaults also resets image parameters.
- Prompt enhancement now streams its progress and produces a clean prompt instead of leaking the model's thinking into the image request.
- The load spinner now appears on the model row you tapped, and a GPU load that falls back to CPU is now visible instead of a silent downgrade.
- The context-length slider now allows up to the model's real trained maximum.
- On iOS, opening the image viewer no longer wedges the chat input, and switching to the photo picker in voice mode no longer hangs audio.
- Knowledge-base search is only sent when you turn it on, never auto-injected, and a failed index now rolls back cleanly.
- Deleting a project no longer orphans its chats, and a new chat started when the context is full stays listed under its project.
Improvements
- First launch paints faster; download-state recovery no longer blocks the first screen.
- Memory estimates now account for GPU buffers so Aggressive mode does not overcommit and cause a load to fail.
- Android GPU model loads get more time on first run, so a slow kernel compile no longer silently drops you to CPU.
- Thinking support is now detected from the model's own chat template, so reasoning models correctly show the Thinking toggle and their reasoning while streaming.
- A misbehaving tool can no longer flood the model with a huge result and push your conversation out of context.
- Message attachments (a voice note above an image) now stack vertically instead of overlapping.
Build: 1784092396
Off Grid 0.0.103-beta.2 (beta)
Features
- Turn thinking on or off for reasoning models, right from chat.
Fixes
- Voice mode no longer reads tool-call text out loud, so spoken replies stay clean.
- Reasoning shown before a tool runs now sticks around instead of disappearing.
- Voice and text-to-speech download status now stays in sync, so playback starts when a voice is ready.
- "Load Anyway" now checks the real free memory after clearing space, so large models load more reliably.
- Retrying a vision model download on iOS keeps the image file already on disk instead of starting over.
- Vision model repair now shows a real progress bar instead of an indefinite spinner.
Improvements
- Larger 9B models now load and run fast on both iOS and Android.
- Switching models in chat now goes through the memory-aware loader, so a new model loads without running out of RAM.
- Live reasoning now streams smoothly while you are in voice mode.
Build: 1783607503
Off Grid 0.0.103-beta.1 (beta)
Features
- You can now install beta builds straight from the tester release, with the Android app attached ready to sideload.
- When a model won't load, the failure card now offers "Load Anyway" for any model type, so you can push past a soft warning if you choose.
- Image generation now guides you on the GPU speed and quality trade-off before you commit to a run.
Fixes
- Stopping speech now stops it cleanly, with no mid-sentence wedge.
- Broken or partly-downloaded models are caught before generation, with a plain error telling you what's wrong instead of a silent failure.
- Image generation no longer runs at a resolution that produces garbage output.
- A memory limit that can't be worked around is now shown as a hard stop rather than something you can override.
- Model-load messages read honestly and no longer claim to have freed memory when they haven't.
- The "tap to continue" prompt now sits below the failure card in chat, where you'd expect it.
Improvements
- The "Generating" label now tracks the real steps as they progress.
- Image generation settles on a single sensible default resolution.
Off Grid v0.0.102
What's Changed in v0.0.102
Features
- feat: UTM-tag outbound links to our own web properties, by surface (7352547)
- feat(models): prompt "try again" on a 0-token response + override survival floor (8034754)
- feat(chat): "tap to continue" when the text model was evicted to free RAM (0f55b5c)
- feat(residency): remember a Load-Anyway override per model for the session (8332aad)
- feat(chat): remove the GPU/NPU acceleration tip card (a37e4cc)
- feat(settings): flag NPU (HTP) as experimental with a model-compatibility heads-up (22da88a)
- feat(chat): surface the silent CPU fallback in the acceleration card (dc50a0d)
- feat(chat): "go faster on GPU/NPU" tip with enable + get-Q4_0 actions (4c35924)
- feat(models): NPU/GPU badge + tiered sort in the quant file list & onboarding (2752812)
- feat(models): NPU/GPU badge + priority for accelerable recommended models (a639ea1)
- feat(backend): re-enable NPU (Hexagon HTP) + auto-default to it on flagship Qualcomm (060c204)
- feat(backend): label GPU + auto-default to GPU when the device supports it (a66acbe)
- feat(residency): aggressive/override = single model, no co-residency (1d176d9)
- feat(settings-ui): Aggressive Loading toggle in llama + LiteRT advanced panels (6f0cd2f)
- feat(settings): aggressiveModelLoading setting + single projection to residency (59fd47a)
- feat(load): OverridableMemoryError + thread override through activeModelService (6924587)
- feat(residency): load policy + "Load Anyway" override in makeRoomFor (e591ee0)
- feat(memory): policy-aware memory budget (balanced | aggressive) (4d9decc)
Bug Fixes
- fix: don't evict the generation model when whisper load fails (only when blocked) (d881f6f)
- fix: never dispatch an empty voice transcript; surface a clear retry instead (b2bb1f0)
- fix: resume the turn after Load-Anyway on the llama (GGUF) path, not just litert (2a8b10f)
- fix: STT honors the residency fit verdict — no more STT+text co-residency (OOM) (372e99e)
- fix: only show 'tap to continue' bar when a text reply is genuinely pending (965d15f)
- fix: thread override through native load gate so Load-Anyway/continue bypasses the hard OOM check (7ee26e1)
- fix(chat): auto-continue the turn after a Load-Anyway model load (278f79f)
- fix(voice): transcribe before dispatch so voice image requests route correctly (eb30af2)
- fix(models): align the model-selector section headers (iOS) + drop the remote 🌐 emoji (1d79519)
- fix(chat): treat an unclosed thinking channel as reasoning, not the message (bca5992)
- fix(models): replace the folder emoji in the image "Local Models" header with a vector icon (3aa8f5f)
- fix(chat): stop the false "settings changed" reload banner after accelerated loads (19c69c7)
- fix(chat): acceleration tip is GPU-first, never mis-recommends NPU (c54fcfe)
- fix(generation): one source of truth for the effective KV cache type (a0fb183)
- fix(models): resolve a downloaded quant by its file, not the composite id (ebb7523)
- fix(chat): acceleration tip branches on the active model's quant (enable/switch/download) (e4b695e)
- fix(models): cumulative bytes + "N downloads" on the model list card (6c0d135)
- fix(model-card): show NPU/GPU badge on quant-file cards (standard, non-compact) (fc4e186)
- fix(review): address PR #468 reviewer findings (582b891)
- fix(npu): single source of truth for the HTP flag — NPU now shows in Chat Settings too (abf49f1)
- fix(load): inline "Load Anyway" on ALL model-load entry points (shared seam) (b7d7407)
- fix(model-card): render model description commonly, drop special-case highlight (8663d0a)
- fix(model-card): full-width progress bar + left/right caption row (de-cramp) (a29e52b)
- fix(onboarding): feed bytes to the shared ModelCard (was % only) (d468c6f)
- fix(test): repair App.test.tsx (TDZ mock hoisting + stale restore assertion) (da0a6b5)
- fix(stt): queued STT downloads read from the canonical store, show "Queued" (b61b926)
- fix(model-card): shared progress shows "Queued" + bytes for every card (591d59e)
- fix(review): address Qodo findings on the aggressive-load PR (a4ce701)
- fix(chat): show a loading indicator on the no-model screen while a model loads (d613ac6)
- fix(chat): "Load Anyway" now overrides the residency gate, not just the pre-check (8a906ea)
Refactors
- refactor: unify text-generation advanced settings into one shared component (c2df3e0)
- refactor(models): one shared ModelRow so chat + home pickers stop diverging (13a44e0)
- refactor: single canonical formatBytes (collapse 3 drifted copies) (9421b46)
- refactor: single source of truth for image-backend labels (0bb6662)
Chores
- chore: bump version to 0.0.102 [skip ci] (b226246)
- chore: bump pro submodule to include #17 (TTS warm-no-evict) + update contract test (149f860)
- chore(pro): bump submodule to main (kokoro download-state fixes merged via #14) (3695183)
- chore: silence max-params on planEviction (4 clear positional inputs) (144d8a4)
- chore: remove orphaned backendResolver/backendSync tests (2fc5bd2)
- chore(dead-code): remove verified-dead code (duplicate type + unwired whisper URL download) (428e87e)
Tests
- test: cover the recommended-list NPU/GPU prioritization resort (b2326fd)
- test: assert UTM-tagged outbound URLs via withUtm (contract update) (a0554cb)
- test: update batch6 lifecycle asserts for the loadModel override arg (daea37f)
- test(audio): clarify the TTS sequencing test is a contract check (34755fa)
- test(audio): voice-turn sequencing evicts the text model for TTS + bump pro pointer (31963c5)
- test(integration): extreme-mode single-model switching (text/image round-trip) (1df62cd)
- test: mock loadPolicySync in App.test (combined-branch startup) (d4c6b67)
Documentation
- docs: note the concurrent-load 'error' case in WhisperLoadResult (review nit) (e8ef71c)
- docs: mandate merge-commit merges, never squash (48bd5ca)
- docs: hardware acceleration strategy reference (all accelerators, all modalities) (2f0684f)
- docs: best-backend-per-device plan (capability-as-data + resolver) (4463023)
- docs: dead-code recon register (GAPS_BACKLOG) (77f2745)
- docs: add multi-agent operating model + design-philosophy pointer to CLAUDE.md (bfc7afa)
Other
- revert(backend): remove the auto-default backend sync (not requested yet) (0af6e63)
- Revert "Merge pull request #458 from off-grid-ai/fix/remote-tool-gate-capability" (47bcdb5)
- Revert "Merge pull request #459 from off-grid-ai/fix/litert-text-unload" (1a87668)
- Revert "Merge pull request #460 from off-grid-ai/fix/image-cancel-during-enhancing" (c44f733)
- Revert "Merge pull request #461 from off-grid-ai/fix/document-filename-decode" (920b478)
- Revert "Merge pull request #462 from off-grid-ai/fix/extract-stale-download-predicate" (6b3ecc3)
Full Changelog: backup-main-pre-revert-2026-07-04...v0.0.102
Off Grid v0.0.101
What's Changed in v0.0.101
Features
- feat(chat): auto-send a standalone chat-mode voice dictation (2ed4fcb)
- feat(chat): auto-send a standalone voice note in Chat mode (ffed564)
- feat(chat): render voice-note transcription in the sent message (ba32700)
- feat(downloads): single-source queued vs downloading classifier (fd3f731)
- feat(app): top-level ErrorBoundary so a render error recovers instead of white-screening (d01869a)
- feat(downloads): clock icon for the Queued state via one status->icon helper (F24) (9a4c720)
- feat(device-info): show per-process memory — Available, Footprint, Process Limit (7dab9f1)
- feat(downloads): show queued (capped) downloads as "Queued" in the Download Manager (a11eac5)
- feat(downloads): cap concurrent downloads at 3 (FIFO queue) to stop the freeze (98fe071)
- feat(home): copy-link action on the Off Grid AI Desktop card (d878f40)
- feat(home): dismissable 'Off Grid AI Desktop' promo card (14d2ddb)
- feat(downloads): shared startModelDownload action — onboarding + Models screen, one mechanism (a684d8d)
- feat(chat): GenerationSession owns 'which conversation is generating' (refactor slice 1) (8453c4a)
- feat(dev): persistent on-device log file sink for device debugging (2f958d7)
- feat(chat): Eject All on the chat models sheet (was stubbed) via shared projection (45d1146)
- feat(models): single ejectAll side-effect owned by activeModelService (88b6199)
- feat(routing): log every intent-classifier verdict ([ROUTE-SM]) (eccd198)
- feat(routing): permanent [ROUTE-SM] logs on the image-vs-text decision (2d8bb73)
- feat(downloads): useModelDownloads — one reactive hook for every screen (749d72d)
- feat(downloads): register core providers + reconcile on boot (5accce5)
- feat(downloads): image provider — service-level list/remove/reconcile, injected cancel/retry (c08042e)
- feat(downloads): text provider — service-level wrap (incl. platform-branched retry) (89833a3)
- feat(downloads): STT provider — UI-free reference wrapping the working bridge (bbd580d)
- feat(downloads): downloadStore→ModelDownloadStatus mapper (single source) (c082c42)
- feat(downloads): app-kill reconciliation in the download state machine (cbba6ea)
- feat(downloads): ModelDownloadService — single owner + [DL-SM] state machine (8382c91)
- feat(recording): single owning record controller (fixes hero tap-to-stop) (aedb487)
- feat(audio): voice mode speaks the image-gen result (turnSpeech tests + pro bump) (c351f9f)
- feat(home): big per-type model count to the right of icon+label (c8d6476)
- feat(image): show the ~120s first-run warm-up notice on iOS too (9e4aeb2)
- feat(failures): dismissible ModelFailureCard surface (763e545)
- feat(failures): single owner for model failures (store + handler) (ef7d324)
- feat(diag): [IMG-SM] + [MEM-SM] state-machine traces (kept forever) (47650a0)
- feat(downloads): show in-progress voice downloads as active items in the Download Manager (987d996)
- feat(memory): kill-apps prompt + retry when eviction still can't fit a model (5b5636a)
- feat(home): per-type model counts in the Models card, chat count by See all (75d8fbe)
- feat(memory): smart-routing residency — co-residency, priority eviction, no OOM (48bdf3d)
- feat(memory): real per-process device budget (os_proc_available_memory), not a guess (a0ec55d)
- feat(llm): surface llama.cpp's real load error via native-log passthrough (571de95)
- feat(memory): strict-sequential model residency on ≤4GB (one heavy model at a time) (d6d713d)
- feat(residency): own the memoryWarning + a canEvict veto for in-use models (7f86ffc)
- feat(audio): add AudioSessionManager — single owner of the iOS AVAudioSession (757fec0)
- feat(image): honor preferGpu in CoreMLDiffusionModule (GPU<->ANE) (df6d39b)
- feat(image): pass the RAM-tier compute choice to the Core ML loader (bd30278)
- feat(image): pick iOS Core ML compute path by RAM tier (bea0e1b)
- feat: cross-platform showToast util + bump pro (voice-note streaming gate) (13eee9c)
- feat: faster iOS downloads, gateway discovery, STT-retry, model-switcher + Desktop links (27884cd)
Bug Fixes
- fix(downloads): route in-flight voice downloads to Active, not Downloaded Models (b07f673)
- fix(chat): make tool accordion tappable during active streaming (#37) (830c105)
- fix(image-download): publish queued store row before native start so the card shows queued (#33) (d8f2dfb)
- fix(kokoro): live-lifecycle download state (supersedes sentinel) + bump pro pointer (4895e0c)
- fix(chat): persist tool-accordion expand state across streaming→finalized remount (cf40369)
- fix(downloads): route every model-list surface through the shared classifier (51b4062)
- fix(downloads): mmproj sidecar no longer consumes a concurrency slot (single-download bug) + icon-only Queued (2f4e645)
- fix: address CodeRabbit review on #425 (stability hardening batch) (49a43d8)
- fix(android): declare dataSync foregroundServiceType on WorkManager's FGS host (F8) (54061a4)
- fix(remote): LM Studio always accepts enable_thinking (decouple from probe) (1a125a9)
- fix(litert): adopt the native-clamped context budget in JS (F20) (8bd20a6)
- fix(android): run model downloads as a foreground service so they survive backgrounding (F8) (78d77a2)
- fix(pro): make the Settings section registry reactive so Pro unlocks live (F6) (03c8392)
- fix(remote): address Qodo review of /props probe (dedup, timeout, logging) (0656a68)
- fix(audio): restore playback after realtime STT stop so TTS isn't silenced (F4) (ba13aa8)
- fix(remote): detect Gateway vision/thinking via /props and send thinking flag (ffb00ec)
- fix(chat): resume the turn after 'Load Anyway' on insufficient memory (F16) (8f0c7c4)
- fix(remote): trust gateway kind:'vision' so remote vision models read images (F7) (f8bd7d9)
- fix(models): serialize STT reclaim + memory-warning through the residency lock (F3) (710347e)
- fix(chat): open the model selector on the tab the manager row selected (F-SHEET) (c41c28c)
- fix(models): budget LiteRT text models as dirty memory to avoid OOM (F9) (26d34c8)
- fix(chat): skip the image classifier when no image model is selected (F12) (1fb969f)
- fix(downloads): purge finalized native record without a synthetic error (F2) (f6fa536)
- fix(downloads): re-reserve the concurrency slot on Android retry (F1) (7dcf708)
- fix(downloads): self-heal leaked concurrency slots so downloads don't collapse to 1 (F-SLOT-LEAK) (00f6072)
- fix(downloads): drop the obsolete 'Starting more can affect performance' gate (F24) (eba11f6)
- fix(downloads): route queued-cancel on the modelKey-derived id (F24) (11e05ff)
- fix(chat): show 'No Model Selected' alert on resend/edit when no model is loaded (94df143)
- fix(chat): treat an undefined snapshot field as 'not changed' (kills the residual false banner) (8dfca14)
- fix(llm): don't retry-without-tools if the failed attempt already streamed (7eb04aa)
- fix(downloads): address review — queued-cancel, mmproj name, list-card queued state (5f03685)
- fix(llm): recover from a remote tool-grammar 400 (retry without tools) + surface the error body (3297394)
- fix(downloads): show queued state everywhere + dedup double-tap (6eb2a39)
- fix(chat): stop the false reload banner on LiteRT model load (4a05af5)
- fix(chat): address qodo review — drop the duplicated reload memory gate (a0ac8d4)
- fix(chat): reload model without stranding the chat on OOM (5147946)
- fix(chat): tell the model not to comment on the injected date/time (1e9a8d6)
- fix(android): apply subproject NDK via plugins.withId, not afterEvaluate (adc3a2c)
- fix(remote): only basename-strip a model id when it is a real path (124b4b3)
- fix(downloads): unify the text download id on the modelKey (one identity per model) (e6c4f18)
- fix(remote): show a clean model name, not the raw file path (45fa624)
- fix(chat): memoize MessageRenderer to stop the chat-screen freeze (Bugs 1 + 4) (f503172)
- fix(chat): single now() snapshot so system date + exact-time note never disagree (34beecc)
- fix(downloads): idempotent finalize breaks the every-foreground re-finalize loop (bb8fed8)
- fix(downloads): classifier download clears its in-flight row (phantom "100%" fix, Bug 5) (5936d4a)
- fix(downloads): address qodo review on failed Kokoro voice items (7f16a53)
- fix(tools): validate hydrated embedding vectors, not just that they are arrays (515f113)
- fix(memory): register the embedding model inside the load lock (no unbudgeted window) (e6c2aa2)
- fix(image): cpuOnly maps to .cpuOnly, not .cpuAndGPU (CoreML compute-unit contract) (294b6ae)
- fix(ios): correct the DownloadInfo initializer in tests (iOS build was red) (056634d)
- fix(downloads): surface + retry failed Kokoro voice downloads (e9d5a7d)
- fix(downloads): STT retry restores a failed row if the re-download fails before registering (4110ecb)
- fix(memory): hydrate real device RAM before the image compute-path decision (18ecba3)
- fix(llm): memory guard uses the EFFECTIVE f16 cache + full dynamic context step-down (4090301)
- fix(chat): input controls no longer sit under the Android nav bar (22bfb84)
- fix(downloads): start the mmproj sidecar before the main to close the vision finalize-hang (73eace7)
- fix(image): cancel a queued multi-file image part immediately, and type it as image (36eb775)
- fix(chat): stop TTS when the user hits Stop, not just the LLM (d6f2b19)
- fix(downloads): cancellable queued downloads via the single queue owner (74ff0e9)
- fix(downloads): unified completion catch-up covers main GGUF, not just mmproj (fd3b413)
- fix(downloads): adopt only in-flight restored downloads (completed = permanent slot leak) (bfdc4cf)
- fix(memory): register image model as dirtyMemory so the resident-dirty gate fires (08acaf3)
- fix(image): "Free memory & Retry" actually frees memory before retrying (1dd64cd)
- fix(memory): gate every load on live os_proc RAM under dirty-memory pressure (OOM/jetsam) (8c349f...
Off Grid v0.0.100
Full Changelog: v0.0.99...v0.0.100
Off Grid v0.0.99
Full Changelog: v0.0.98...v0.0.99
Off Grid v0.0.98
What's Changed in v0.0.98
Bug Fixes
- fix(downloads): settle awaiting promise on cancel so screens update (b91f405)
- fix(whisper): per-model download progress + skip strict size check for STT models (540fd52)
- fix(pro): make registered Pro screens reactive so Pro Tools works on activation (7aa6da1)
- fix(whisper): repair Android download verification and live Download Manager visibility (133975f)
Chores
- chore: bump version to 0.0.98 [skip ci] (e6fa232)
Full Changelog: v0.0.97...v0.0.98