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