Skip to content

Off Grid 0.0.120-beta.1 (beta)

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Nov 07:43
· 1084 commits to main since this release

0.0.120-beta.1

  • feat(image): where sd.cpp runs only on the CPU, Local Dream is the pick and sd.cpp cards say how long an image takes (fb5ab71)
  • feat(video): Pro draws the chat clip card; Gallery's Videos opens the Library (ac9574d)
  • feat(models): recommend sd.cpp image models that fit the phone's memory (9061db4)
  • feat(models): compact embedding picker and clear retry error (74ad70b)
  • feat: link Settings Pro card to design partner offer (2a54562)
  • feat: show design partner offer below Pro pricing (448e8c8)
  • feat: add mobile design partner details and email draft (1e98df1)
  • feat(video): add short Android backend diagnostics [skip ci] (8f9d6f4)
  • feat(image): support complete SD checkpoints on mobile [skip ci] (00b89f1)
  • feat: load SD checkpoints and preserve RGBA image output [skip ci] (c688eb8)
  • feat: stream lightweight SD image previews on mobile [skip ci] (b85a21c)
  • feat(onboarding): choose auto setup model downloads [skip ci] (dc67ffa)
  • feat(video): show auto setup pack files [skip ci] (eaeeec9)
  • feat(settings): show default system prompt in chat Text settings (6e19d08)
  • feat(settings): move shared generation controls to General (21b0440)
  • feat(video): include compatible packs in mobile auto setup [skip ci] (755cd74)
  • feat(mobile): use themed video player controls and picture in picture [skip ci] (a101a2e)
  • feat(video): report decode sections and reuse final frame preview [skip ci] (48481c9)
  • feat(video): show reused frame previews and decode progress [skip ci] (f4883a4)
  • feat(image): search and download compatible SD packs from Hugging Face [skip ci] (d4d5807)
  • feat(sync): describe portable mobile SD image packs [skip ci] (5e764cd)
  • feat(image): connect Qwen packs to mobile model and generation flows [skip ci] (75b5488)
  • feat(image): expose the mobile SD runtime with hardware fallback [skip ci] (d653f2f)
  • feat(video): select and report Android NPU execution [skip ci] (b26d6cc)
  • feat(video): load LTX and Hunyuan packs on mobile [skip ci] (8d2d149)
  • feat(settings): allow hiding the dev sync status bar [skip ci] (a8c5fc9)
  • feat(chat): route video turns and tools through shared generation state [skip ci] (421c95d)
  • feat(video): own generation recovery gallery and media export [skip ci] (3adb2ba)
  • feat(models): add video search selection settings and storage controls [skip ci] (26bf6fd)
  • feat(remote): discover OGAD video models and resume remote jobs [skip ci] (0f42fb9)
  • feat(models): manage complete video packs and resumable downloads [skip ci] (2b2c7f3)
  • feat(video): add Android Vulkan generation and scoped media export [skip ci] (d46a539)
  • feat(video): add shared native lifecycle and iOS Metal generation [skip ci] (3b80a82)
  • feat(gallery): play save and delete videos on mobile [skip ci] (d42bbb1)
  • feat(media): store synced videos and update Pro integration [skip ci] (50c5046)
  • Fix: voice loads within the memory budget, and deleting the voice model leaves no voice behind (pro a8669da, 47a13e1) (641405a)
  • Fix: a model whose files the disk will not remove stays listed and says so, with Retry (9fe578d)
  • Fix: vision repair now reloads a model that is loaded without its projector (29b6c2f)
  • fix(video): a clip the app refuses says why, and a failed clip leaves no unhandled rejection (2373a35)
  • fix(image): one measured estimate decides both the sd.cpp recommendation and the memory guard (934ffd3)
  • fix(image): an sd.cpp model keeps its own steps, guidance and size (8801b91)
  • fix(image, Android): sd.cpp images run on the CPU on Adreno, where Vulkan crashes in the UNet (d14c9c5)
  • fix(image, Android): sd.cpp images skip the NPU, and a failed draw retries one backend down (e23ef43)
  • fix(image): a model that loaded but could not draw says so, not "Failed to Load Model" (0245a64)
  • fix(downloads): a video pack's file downloads never hydrate as rows of their own (a422a0c)
  • fix(analytics): withdrawing Usage drops usage events still waiting to upload (971afa5)
  • fix(image): a Hugging Face sd.cpp search offers root-level checkpoints only (77a3597)
  • fix(chats): deleting a chat from any list removes its videos, file first (e696f7c)
  • fix(build): a Hexagon SDK archive that fails its checksum is removed (d353f2b)
  • fix(video, iOS): a video request missing a path or its prompt is refused, not undefined behaviour (8145d8c)
  • fix(generation): a stopped remote turn settles its deferred clip and moves the queue on (667dd55)
  • fix(chat): Send now on a queued message stops a running video first (6caf8dd)
  • fix(models): a failed refresh also clears the unreachable server's video model (bced7ba)
  • fix(analytics): a failed model download asks someone who has not opted in (aceb36a)
  • fix(gallery): Select images is an Images-tab action (4c4b21b)
  • fix(gallery): Gallery is a stack screen, so Videos and Animate open full screen (39a1de8)
  • fix(models): show an empty image search, not an error, when no checkpoint is supported (b7995df)
  • fix(chat): align video quick setting and require a model (dd337f9)
  • fix(settings): group image quality controls consistently (d30343a)
  • fix(downloads): retain partial files and reconcile completed models (7bb85dd)
  • fix(auto-setup): select fitting video and speech models (1a29a7f)
  • fix(models): resolve SD quant packs from canonical repository (1a54363)
  • fix(mobile): give Auto Setup actions accessible touch areas (fe4248f)
  • fix: state text hardware and global settings scope [skip ci] (cab26f8)
  • fix: use compact navigation rows for Pro secondary actions (95eac44)
  • fix: keep Pro offers compact and make actions visible (92df184)
  • fix: handle resend while native video is stopping [skip ci] (6a250c3)
  • fix: report SD image runtime without inferred hardware [skip ci] (8c9e818)
  • fix(mobile): simplify included Auto Setup models (e1bf5d2)
  • fix: keep video loading counts out of sampling progress [skip ci] (0a9571a)
  • fix: retain iOS image backend and failure diagnostics [skip ci] (69fc04c)
  • fix(video): show pending stop until native work ends [skip ci] (96f9cd5)
  • fix(video): preserve sampling state across reload [skip ci] (ff55f7f)
  • fix(onboarding): trust bundled video engine [skip ci] (52ee407)
  • fix(onboarding): offer video on 12 GB devices [skip ci] (2c295f5)
  • fix(onboarding): explain video auto setup exclusion [skip ci] (340e440)
  • fix(onboarding): read device RAM before auto setup [skip ci] (93220a4)
  • fix: retain video completion after bridge disposal [skip ci] (bb537c1)
  • fix: recover active Android video after React reload [skip ci] (f9dae27)
  • fix: show saved video generation details in chat [skip ci] (dca21cd)
  • fix(video): log Android latent and decode numeric summaries [skip ci] (b4faf2f)
  • fix(image): retain admission until cancelled request settles [skip ci] (4f0a96a)
  • fix(image): account for failed SD load cleanup [skip ci] (1df1f0d)
  • fix(image): verify SD file sizes before pack registration [skip ci] (2fd3175)
  • fix(image): retain residency lock through late SD load [skip ci] (39f97ab)
  • fix(ios): bound Wan decode graphs and report chunk progress [skip ci] (2c3a965)
  • fix(image): use model-aware resolution controls [skip ci] (3b75e36)
  • fix(litert): report requested accelerator and fallback [skip ci] (3b08e42)
  • fix(image): keep cancellation from starting overlapping SD work [skip ci] (3cc57c9)
  • fix(video): exclude model cache from iOS backups [skip ci] (0cd8fbb)
  • fix(android): keep video generation screen awake [skip ci] (885abdb)
  • fix(android): bound Adreno video attention dispatches [skip ci] (879acf4)
  • fix(video): bound Adreno attention work per dispatch [skip ci] (a7ef3ac)
  • fix(video): respect download cancellation and count pack storage [skip ci] (ed7a6f4)
  • fix(video): show iOS background interruption while engine stops [skip ci] (62bc123)
  • fix(video): use catalog names in mobile model labels [skip ci] (53e4d5d)
  • fix(video): route unsafe Adreno attention through fallback [skip ci] (b0b252f)
  • fix(ios): keep local generation awake and log background admission [skip ci] (67cd2db)
  • fix(video): keep Android attention buffers safe across devices [skip ci] (cdf5737)
  • fix(video): use active app theme for player controls [skip ci] (2e4e47a)
  • fix(chat): remove extra frame and caption from generated videos [skip ci] (0182a30)
  • fix(mobile): show the first video frame before playback [skip ci] (d42d193)
  • fix(mobile): fit video controls and picture in picture in one bar [skip ci] (e59e738)
  • fix(ios): rebuild video preview runtime for physical devices [skip ci] (8003ebf)
  • fix(video): honor full precision attention on Hexagon [skip ci] (340b824)
  • fix(ios): stream model checksums during startup [skip ci] (c7850b0)
  • fix(video): distinguish generation failures from load errors [skip ci] (5d489af)
  • fix(video): report iOS background interruption [skip ci] (6810e0c)
  • fix(build): use macOS host compiler for Vulkan shader generator [skip ci] (d9c81bc)
  • fix(video): use CPU Wan decode on affected Adreno devices [skip ci] (6b5858b)
  • fix(sync): include video retry completion correction [skip ci] (9564462)
  • fix(video): route unsafe Adreno float matvec to fallback backend [skip ci] (c8323ea)
  • fix(video): show OGAD stages on mobile clients [skip ci] (986e046)
  • fix(video): avoid Adreno crash inside device-fault diagnostics [skip ci] (c261d94)
  • fix(image): recover verified SD packs after interrupted registration [skip ci] (8d85823)
  • fix(video): bound Android GPU decode graphs [skip ci] (c277ec1)
  • fix(image): reuse verified pack parts and update transfer integration [skip ci] (2643722)
  • fix(image): preserve active model residency and shared image identity [skip ci] (e33aae2)
  • fix(video): name the frame decoding stage [skip ci] (af12fc3)
  • fix(image): validate pinned model packs before registration [skip ci] (30d7946)
  • fix(video): stream NPU weights to reduce Android memory [skip ci] (9a2576d)
  • fix(video): show sampling when step zero starts [skip ci] (a4847ed)
  • fix(video): keep NPU memory cap off GPU fallback [skip ci] (cb7e96a)
  • fix(video): separate outputs across convolution fallback [skip ci] (995d324)
  • fix(video): respect buffer ownership across NPU fallback [skip ci] (d22d20e)
  • fix(android): prepare DSP assets before packaging [skip ci] (9e65d09)
  • fix(text): try GPU after NPU load failure [skip ci] (b7312ff)
  • fix(video): show prompt processing and elapsed time [skip ci] (e87d2fa)
  • fix(video): use CPU conditioning on Android [skip ci] (2dcffb7)
  • fix(navigation): return from Pro page to Home [skip ci] (a806a96)
  • fix(settings): keep typed slider values visible [skip ci] (49ad751)
  • fix(video): show generation progress inline in chat [skip ci] (519674a)
  • fix(video): use shared memory failure and override flow [skip ci] (b0e52ba)
  • fix(models): share text detail hierarchy with video browsing [skip ci] (f05fd82)
  • fix(chat): allow local and remote video-only chat entry [skip ci] (9adcd03)
  • fix(downloads): preserve video pack identity and validation progress [skip ci] (4777c92)
  • fix(models): match video browsing to the text model flow [skip ci] (7b13e9a)
  • Engine updates: stable-diffusion.cpp is bumped only when every local video patch applies to the new release; a failing patch holds it with the patch named (09a0bc4)
  • Video engine: back to stable-diffusion.cpp c6dfa9d; the auto-merged bump to 3be2378 broke an Android Vulkan patch and stopped the UAT's Android build (7991731)
  • Engines: llama.rn 0.13.0-b12032.1 → 0.13.0-b12034, stable-diffusion.cpp c6dfa9d → 3be23788fc0c9f35a2c24b1211caae11d4a54dbc (6ee7845)
  • Video engine: Stop ends a run before its next prompt pass; a phone CPU spent two more minutes reading the negative prompt after Stop (c7cba52)
  • Memory: image and video loads on a large Android phone keep 512 MB back instead of 1 GB (shared dirtyHeadroomMB); iOS and smaller phones keep their margin (d9cf01e)
  • iOS video runtime: the framework's Info.plist carries CFBundleShortVersionString and CFBundleVersion, which TestFlight requires of every embedded framework (9d7d3a9)
  • UAT workflow test: node_modules is saved inside setup-mobile, right after the install and before the build; the shared setups' caches are SHA-pinned too (eac6b50)
  • Android setup: the NDK install ignores yes's broken pipe, which an action's pipefail turned into a failure (d8fe8be)
  • Release and engine updates: set up through the CI actions; releases restore only (443de90)
  • UAT: set up through the CI actions on Node 26, so a beta restores node_modules, shared, Pods and the video runtimes main's CI saved (a12ade5)
  • Engine packs: only a launch that runs the app's JS counts toward a trial's crash limit; background starts (download workers, receivers) never reject a good pack (20421a1)
  • Utility model: a failed load still restores the chat model and the selection (0c1fbae)
  • Dictation: a realtime transcriber that fails to stop or release still delivers the final transcript (6b83fa2)
  • iOS CI and nightly: download react-native-audio-api's prebuilt libraries before pod install; node_modules is cached before pod install fills it, so a restored Pods tree left libcrypto.a missing (2704a55)
  • Vision test: every LFM3 VL file, the QAD one included, pairs its projector (real HF listing) (504f204)
  • iOS tests: boot the simulator at the start of the job and wait for its boot to finish before testing (d601ffa)
  • Jest: balance --shard runs by recorded suite run time, with a file-size estimate for new suites (e46fe0c)
  • promote.sh: a mktemp template GNU mktemp accepts, so the release-script test passes on Linux CI (9e1d5e5)
  • PR screenshots: release voice turn on both phones - Whisper dictation, then Kokoro speaks the reply (918c9da)
  • PR screenshot: the same Qwen 3.5 0.8B file and prompt on CPU answers correctly (the NPU run does not) (8371c36)
  • Declare jest-config and @jest/reporters, which the coverage merge script reads (2b7e74a)
  • PR screenshots: release checks - Gemma 4 E4B on the iPhone (Metal, after Load Anyway), Gemma 4 E2B on the Nord, Qwen 3.5 0.8B on the Nord's NPU (answers the wrong prompt) (7198366)
  • Chat turn with no text model loaded: a refused or failed load shows its error (with Load Anyway), never a silent wait (af49bbc)
  • Image-intent classifier: borrowing the chat engine never makes the classifier the chat model (13a315b)
  • Analytics action ids: the Engine updates screen's controls (Settings row, switch, Check now) are in the generated list (5dad19e)
  • Bump pro to mobile-pro feature/lfm3-evergreen-llama (7ac90b5): the branch #755's CI checks out, with Kokoro on executorch 0.11 /legacy (mobile-pro #97) (ea508d9)
  • PR screenshot: the Nord renders RealVisXL with this build (CPU path under low memory) (68171c7)
  • PR screenshots: iPhone image generation after the Metal fix, Engine updates on iPhone and on the Nord (on, staged, pack active, off, broken-pack fallback) (afccf31)
  • Dead-code gate: the blank-image test's host compiler is a known binary; EngineUpdatePath stays module-private (3eb0e2d)
  • Image engine: a one-colour frame counts as a failed run, so it falls back to the next device or reports an error, never saves a blank picture (6a52571)
  • iPhone images: ggml's Metal GroupNorm normalizes every image of a batch, so pictures render instead of coming back white (b7925ae)
  • Settings → Engine updates: the running engine, where it came from, the last check and the switch (Android); iOS says engines update with the app (f3f0da4)
  • Engine updates: one setting, on by default; off downloads and installs nothing, an engine update in use stays, Check now looks at once; iOS reports its engine updates with the app (79c2d09)
  • PR screenshots: iPhone 17 Pro Max LFM3 text, Stop, LFM3-VL, SmolVLM, knowledge base (48094ec)
  • Engine packs: take a pack whose version is newer than the running engine, not its llama build (3af8717)
  • PR screenshots: Android (Nord) LFM3 text, LFM3-VL, Stop before/after, SmolVLM, knowledge base, QAD finding (0d6410c)
  • Stop: a token that arrives after Stop no longer throws (290bd54)
  • Metro: resolve ../shared through its real path, so a worktree's linked shared clone bundles (96309a1)
  • llama.rn: @ogai/llama.rn 0.13.0-b12032.1 (native artifacts from R2, prebuilt Android by default) (69de720)
  • Engine packs: verify the live manifest with the pinned key (4b2deec)
  • LFM3: prove turns use LFM3's own chat template, not ChatML (8dbb0d1)
  • llama.rn b12032: Podfile.lock and the Hexagon HTP kernels that match its ggml (0000f15)
  • Engine packs (Android): pick the pack at boot, hand it to llama.rn, roll back a pack that fails (635faa0)
  • PR screenshots: Nord dictation, restarts, Kokoro voice, switch, download and voice cards (bee5920)
  • Engine updates: merge the bot's bump PR when CI is green, never during a nightly or upload (7cff6c4)
  • PR screenshots: iPhone dictation, Kokoro voice, voice cards before and after (05c3f92)
  • llama.rn: depend on npm:@ogai/llama.rn@0.13.0-b12032 (llama.cpp b12032); engine packs accept the fork's npm name (abf3296)
  • Remote voice, speech, image and video models get full model cards (46e73b9)
  • Knip: tweetnacl is a direct dependency now; EnginePackStatus stays private (f050787)
  • Engine updates: run at 21:23 UTC, fail any step loudly, keep held-engine issues current (a0c57d5)
  • Engine updates: check the llama.rn the app installs, name each held engine's blocker and next step, fail on any unchecked engine (c99a8cc)
  • Search tests: a model is hidden from an engine one build older than it needs, not from the shipped engine (llama.rn rc.9 now runs K2 Horizon) (256bc8d)
  • Xcode ccache: wrappers that hold the ccache path and cache directory, so iOS compiles are cached (RN's wrapper ran plain clang) (9ca5494)
  • iOS pods for whisper.rn 0.7.4 and react-native-executorch 0.11 (71098c8)
  • react-native-device-info patch renamed for 15.0.2 (7a9a33d)
  • react-native-executorch 0.9.3 → 0.11.0 (Kokoro on its /legacy entry), worklets and Reanimated in step (7a87f31)
  • whisper.rn 0.5.5 → 0.7.4: realtime transcription on the JS transcriber, patch dropped (e86ac84)
  • Engine packs: Android downloads a newer llama.cpp, tests it, and rolls back (b332e2a)
  • Engine packs: verify the signed @offgrid/llama.rn manifest and pick a pack (7da1b06)
  • UAT nightly: build github.sha, not a job output, so CodeQL can trust the commit the caches write from (37158a0)
  • Catalog: LFM3 1.7B and LFM3 VL 2B (mmproj F16), gated to llama.cpp build 11938 (d7163a3)
  • Engine updates track @offgrid/llama.rn through the llama.rn alias (610737d)
  • Engine updates: stdout carries only the JSON; a failed install fails the step (6235718)
  • iOS video runtime: always check out the pinned stable-diffusion.cpp revision (678b7fd)
  • Engines: stable-diffusion.cpp 77b72a2 → master-1031-c6dfa9d (local patches apply and the iOS runtime builds) (00f9f23)
  • Engines: LiteRT-LM Android 0.18.1 → 0.19.0 (f681007)
  • Engines: llama.rn 0.13.0-rc.7 → 0.13.0-rc.9 (newer llama.cpp, LFM2 decision models, embeddings sized by n_embd_out) (c724413)
  • UAT nightly: cache node_modules, Gradle, Pods, the video runtime and ccache for the NDK and Xcode builds (4cab77c)
  • UAT plan test: its git calls drop the hook's GIT_* variables, so a pre-push run no longer writes to the real repo (it set core.bare) (fb3d426)
  • UAT plan: notes temp file uses a template GNU mktemp accepts, so the nightly plans on Linux runners (2e9864a)
  • TTS store tests run the real Kokoro engine and bridge on the speech device harness: speech, stop, voice switches, relaunch and download state are read from the runtime and the store (f162e90)
  • Email and calendar tool tests switch tools on through the real app store's settings (8d5fe85)
  • Eviction adapter tests open, commit, roll back and finalize real transactions in the pairing store over the keychain fake (757f126)
  • Repair tests hold the pairing credential in the real pairing store over the keychain fake, written by pairing, instead of spying on the store (3fdf9c2)
  • Streaming speech tests speak through the real TTS store, Kokoro engine and its bridge; what is spoken is read at the ExecuTorch boundary (cc59979)
  • A generated image is spoken in voice mode again: the image service announced 'done' before the result message was in the chat, so turn speech found the person's prompt as the last message and spoke nothing (8456334)
  • Turn speech tests speak through the real TTS store, Kokoro engine and its bridge, with real streaming speech and image generation. A generated image in voice mode is not spoken; that case is marked failing (7e35119)
  • Gallery: name the icon-only Exit selection and Stop image generation buttons (1e9c07a)
  • TTS download provider tests list, retry and remove the real Kokoro engine through the real TTS store over the ExecuTorch fetcher fake (52d05b6)
  • Engine subscription tests let the real file player own playback by playing a voice note over the audio-api fake (e90a4f6)
  • Voice recording hook tests run the real voice service and fire the OS speech recognizer's events (8e2d40a)
  • MCP tool extension tests call a connected Notion server over the MCP network fake through the real store, service and client (393530f)
  • Remote server store connection tests reach a fake Ollama server at fetch, or a network that cannot reach the host, through the real http client (b68ebc2)
  • Project store tests delete a project's documents from the real knowledge base on an in-memory SQLite; when rag.db cannot be opened the project is kept and the delete is refused (32170cd)
  • Models screen util tests measure folder sizes on the in-memory disk and run the real Hugging Face browser helpers (5fd86d5)
  • GGUF import tests copy picked files into the models folder through the real modelManager import and read the registry; a file with no name is refused as not a model (ea90167)
  • Voice download items tests run the real whisper service, download service and Pro's Kokoro provider over the disk and ExecuTorch fetcher fakes; deleting removes the files (7244a77)
  • Save-image tests copy the picture on the in-memory disk with the real alert builder; a missing image file is the failure case (6649f62)
  • Whisper service tests record through the real audio recorder service over the audio-api fake; the file fallback transcribes the file the recorder wrote (46aac11)
  • Acceleration capability tests seed the phone's hardware and SoC model at the native boundary instead of spying on the hardware service's own probes (dd81260)
  • Download service tests cancel a really queued start in the real background download service, and read the transition log from the console instead of spying on the logger (adb94a9)
  • Document support tests run the real PDF extractor wrapper; a .pdf is supported only on a phone whose native PDF reader is present (ddb31c8)
  • Image download sync tests recover finished downloads from the native downloader fake: zips are moved in and extracted on the in-memory disk, and Core ML tokenizer files are fetched from a served URL (91d2573)
  • The partial re-unzip test extracts a truncated zip on the in-memory disk and runs the real registry storage and Core ML resolver (866c5e9)
  • Scan tests run the real scanners, registry storage, Core ML resolver and import over the in-memory disk; the pure-function scan tests need no fakes at all (41453aa)
  • Parallel projector download tests drive the real download service over the native downloader fake: transfers finish, fail and move files on the in-memory disk instead of through captured callbacks (2c3d650)
  • A dictation finished after switching chats no longer lands in the new chat: the chat-switch effect forgot which chat the recording belonged to, so the stop path treated the turn as unowned and inserted the old chat's transcript (1457ebd)
  • ChatInput tests run the real stores, documentService, voice hooks and mic button; only the pickers, disk, recorder and speech server are faked. A transcript that lands in the chat opened mid-recording is marked failing (d133f26)
  • Dead exports after the merged conversions: three chat-turn helpers used only inside their module are private, and the chats-list hardening test imports the pure date formatters statically so knip sees them (ffcf406)
  • An early cancel applies only to the start it was meant for: startModelDownload announces its pending start when it publishes the Queued row, and only an announced start that was cancelled before it reached the queue is refused. A time-window memory refused a re-download right after a cancel (63699b8)
  • A keychain that cannot be read no longer locks the person out: verifyPassphrase reports that it could not check (not a wrong passphrase), the Lock screen says "Couldn't check your passphrase" with Try again, and no attempt counts toward the five. A wrong passphrase still counts. authService.test asserted the old swallowing and now asserts the new contract (b7a95bd)
  • A remembered early cancel is kept only when that model has no download started: deleting a running transcription download also cancels its queued placeholder, and remembering that cancel refused the replacement download that followed (28dae34)
  • A llama model that will not load is classified by its cause: only a real allocation failure reads as Not enough memory; a damaged or unsupported file says so and tells the person to delete it and download it again. Before, every such failure read as out of memory, because the combined error said "may indicate insufficient memory" (2aa829d)
  • A Stop pressed before the native completion starts now stops the reply: the turn records the Stop and does not start the completion, and a Stop that lands as it starts is sent again. llama.rn clears a stop when a completion begins, so before, the reply ran to the end (543c3eb)
  • Switching image models stops when the first will not unload: the model in use stays loaded and selected, the second is not loaded on top of it, and the error is surfaced so a retry can switch. Before, the second loaded anyway while native said the first was still in use (2b1a708)
  • A cancel on a Queued download row always wins: a cancel that arrives before the start reaches the download queue (the start checks the disk first) is remembered briefly and that start is refused. Before, the cancel was missed and the model downloaded anyway once a slot freed (2207076)
  • Baseline: AnimatedListItem has no mocks of our code left (its line was lost in a concurrent baseline write) (02b87c6)
  • Device information's back button has an accessible name (Back), like the other screens' back buttons (40459a3)
  • Transcription downloads: a download that fails mid-session keeps its row as failed with Retry (it used to vanish), and a stale download whose replacement has finished no longer deletes the finished model file. Tested on the phone's native downloader and disk; whisperService and the ownership tests drop their mocks of our download service and store (058c01b)
  • Eject All is offered only while a model is loaded: activeModelService publishes the loaded image model as it does the text one, and the control reads what is loaded, not the selection Eject keeps. Before, it stayed after everything was ejected and a second tap ejected nothing (8ff32ee)
  • Remove the unused useDownloads hook (no screen reads it; screens use useModelDownloads) and its tests; the app-root listeners stay (865de78)
  • Dead exports: four helpers used only inside their module are no longer exported; tests reach them through the app's entry points (hydration seeds its snapshot through the persistence subscription, Core ML through proceedWithDownload) (ee99587)
  • Security screen's back button has an accessible name (Back), like the other screens' back buttons (8660c70)
  • A LiteRT reply that fails no longer leaves the chat stuck answering (3c2ea7c)
  • Bump pro to its release/analytics-video-fixes (41bc4b00, the #94 merge on mobile-pro main) (c7bbc90)
  • modelManager: remove three private wrappers nothing called except the old test (532e1ff)
  • Image tab: a filter the person clears before the phone's recommendation arrives stays cleared (the recommendation read a stale mount-time flag) (25d6d56)
  • UAT workflow: the plan keeps shared's checkout credentials, so uat.sh --plan can fetch shared's origin/main (the first run failed there) (8dae876)
  • Android nightly: build shaderc's glslc_exe (the glslc target is only the static library), and the video scripts name the command that fails (d068281)
  • UAT workflow: every job checks out the commit the plan pinned, as OGAD's release.yml does, so both platforms build the same code (da76c0b)
  • UAT workflow: plan, then Android (Linux) and iOS (macOS) build in parallel; uploads wait for every build and the tag waits for every upload (d1a113b)
  • uat.sh: stages for parallel CI (--plan, --build-only, --upload-only, --finalize); no args runs every stage as before; sed works on Linux and macOS (cce3b3f)
  • README Get Pro links open getoffgridai.co/pro/#buy (f70c6a0)
  • Pro screen test checks the real Get Pro link: tags before #buy on getoffgridai.co/pro/ (9d94b38)
  • Get Pro opens getoffgridai.co/pro/#buy directly, so the app's tracking tags reach the checkout page (caf2dfd)
  • iOS screens: the video model sheet with this phone's models first and the one in use on top (6472783)
  • Bump pro: a clip's length rounds up to at least 0:01; iPhone tiny decoder on the CPU; the video model sheet lists this phone's models first. Test: a 0.7 s clip reads 0:01 (60ae1e4)
  • iOS screens: Turbo progress (Making frames 1 of 8, Finishing), the Turbo clip decoded correctly, and the video model radios (d242cf6)
  • iOS runs the tiny video decoder on the CPU: on Metal (sd.cpp master-1024) taew2_2 decoded Wan 2.2 Turbo into colour noise; on the CPU the clip is correct in about 30 s, where the full VAE at 832x480 takes over an hour (a4bbd15)
  • Analytics action ids: regenerated for the inline player, the More list, model radios and Extend (e95f206)
  • Bump pro: Extend guidance names a start-picture model on the phone that is too slow here; iPhone clips decode with the full VAE (18bb688)
  • Android screens (Nord): More as a list with Share, full screen with its bar above the actions, Extend counting only the missing 2.9 GB (1aca6fc)
  • Bump pro: More is a list with Share, mute carries to full screen, a video pack copies files the phone already has; tests cover each (b83a3c3)
  • Share app-made media through the system share sheet: one shareGeneratedMedia contract; Android hands the file over with its own FileProvider (a one-time read grant) (110956b)
  • The default video model is the best installed, Turbo first; a model row's select control is a radio (check in use, empty circle to pick), not a check on the one that is not in use (51cb6ec)
  • Remove the iOS progress screens uploaded to the wrong folder; they live in release-analytics-video/ios/progress (582b4a3)
  • iOS screens: Extend reads as a button and asks what happens next with no model sheet; progress words retaken with the keyboard down (Wan 2.1) (6022523)
  • Failure card titles and its retry button are sentence case like the rest of the app ('Not enough memory', 'Free memory & retry'); tests find the memory card by its Run anyway control, not its words (02ad1c7)
  • Bump pro: Extend uses the phone's model with no sheet; actions that need a model are never disabled (950e0d5)
  • Android screens (Nord): play in place, progress words, the GPU clip and viewer, Extend phone first, Settings and refusal before and after (7b038b5)
  • Bump pro: a clip's card plays it in place with the full player; tests cover play/pause, scrubber, mute, More, expand at the same second, and one clip at a time (c825c8c)
  • iOS screens: Making frames with its count, and Finishing (9c200e3)
  • Bump pro: Extend offers the phone's own download at once, without waiting on a saved computer (b47ab4f)
  • PR screenshot add: after-progress-making-frames-ios.png [skip ci] (03215cd)
  • PR screenshot add: after-progress-finishing-ios.png [skip ci] (6827455)
  • iOS screens: Settings Analytics with stats off, and an extended clip titled 'Source · 2' on Home (aa5eaa7)
  • Settings section labels are uppercase with +0.3 spacing, as the design system asks (196079b)
  • Bump pro: the clip viewer asks for light system bars; the test checks it does (5ff5d2e)
  • iOS screens: Extend sheet before and after the keyboard fix, phone-first guidance, plain progress words (958334e)
  • A sheet whose input focuses as it opens slides up above the keyboard: a keyboard change during the slide-in waits for it to land (c6bf865)
  • Bump pro: the clip memory refusal quotes the gate's own numbers; the test checks need is more than spare (5144610)
  • The memory gate returns the budget it compared, so a refusal can quote it (3e55efd)
  • The restart test checks the interrupted title on the card, not a word in the message (0f47c0e)
  • The interrupted-clip test reads the new plain line: The app closed before the clip was done (e602c8d)
  • Bump pro: a clip lost with the app is titled as interrupted; the test checks the title (5dd131b)
  • The memory refusal names no button it does not show: close other apps, then try again (4e3c477)
  • A new chat with no model chosen no longer says it is chatting with Unknown (19c6e6f)
  • Anonymous stats and Crash reports carry icons, so their words line up with the rows below (742876d)
  • Bump pro: studio radius token (8898bd8)
  • Activate says it is busy while the key is checked; the sheet reports as pro-activate (9cb1bd4)
  • Knowledge base loading, adding a project file and the embedding model search say they are busy (aria-busy) (5701dcc)
  • Analytics owner and value rules are fully covered: tests for tabs and nested sheets, background taps, opt-out, unreadable left-over sessions, a failed usage snapshot, picks from every screen and video clips; dead branches go (4578ea3)
  • Report a problem is tested when the log cannot be read, is missing, the mail app fails, or the build has no mail module (d5c817d)
  • ANALYTICS.md: the merged OGAM and OGAD copy — the ui_action rule, OGAD screens, sessions and summary maps, and the desktop-only events (7431437)
  • Event budget counts active user-days: 1M events at 30 a day is about 33,000 user-days a month (cdf08f3)
  • Bump pro: Pro touchables count taps, sheets name themselves, video Extend/story/Save report video_action, Pro counts join the usage snapshot (1a2a520)
  • ANALYTICS.md lists session_summary, usage_snapshot, the new events and the event budget; trial_started goes, as there is no trial (43a17f3)
  • Auto Setup's onboarding start is sent when the person opts in there, instead of being dropped before opt-in (d5b50c2)
  • Model picks with where they were made, message copy and edit, deletes and the first message are reported as fixed-value events (8348995)
  • A daily usage_snapshot sends bucketed counts of chats, messages, projects, documents, media and models, and the theme (5bbd96e)
  • One session_summary per session carries the tap, scroll, error and settings counts; a killed session's counts arrive on the next launch (536867f)
  • Screens report as project-detail, Models tabs as models: and every sheet as : (412005a)
  • Taps, long-presses, switches, error alerts and scrolls are counted on the phone by testID only, through one Touchable that lint requires (a2cd74e)
  • Chat store's streaming actions are their own creator beside the store, so the store creator stays within the function size limit (64a608c)
  • README, AltStore listing and docs: anonymous stats, and privacy claims that name what stays on the phone (efd75e8)
  • Analytics toggle is Anonymous stats; the prompt and What we share say we never see your prompts, replies or files; About drops the analytics line (87274a5)
  • Desktop room test expects what each download still fetches: the reported missingBytes by catalog id, empty when none is reported (d5b0c76)
  • Knowledge sync journey adds a file with the tab row's + then File, as the project screen now asks (c2e3217)
  • Release screens: Pro licence on iPhone and Nord, Nord retrieval finding sea chats for 'ocean' (213e310)
  • Bump pro: Extend asks a paired Desktop (6104f7a)
  • Bump pro: Extend on the phone's own model, plain why, memory numbers (c18e3ed)
  • Video engine finds OpenCL at run time: a phone without libOpenCL.so (Pixels) still loads it and runs on the CPU (9e8078d)
  • Bump pro: clips admitted by what the engine keeps in RAM; progress in plain stage words (7849d69)
  • Wan runs on the Adreno GPU through OpenCL: GPU budgets capped at real free RAM, the DiT requantized to Q4_0 (ggml's Q4_K faults Adreno); Nord 5 clip in 11m 43s, not an hour (ce84d3d)
  • Bump pro: launch chat repair is linear (6b886c3)
  • Chats save in parts Android can read back, so a long history opens at launch (d7f8b60)
  • Phones' video runtime reads the engine's new result structs and frees each one whole (38d6508)
  • Phones' video engine moves to stable-diffusion.cpp master-1024: Wan 2.2 Turbo renders a real picture on iPhone instead of a smear (baba0fe)
  • Bump pro: Extend asks what happens next before a clip carries on (2a8445f)
  • Start-picture tests: a 16 GB computer is offered Wan 2.2 Turbo; an 8 GB one is too small (Turbo needs 12 GB) (16627d0)
  • 11 GB phones are offered Wan 2.2 Turbo on iPhone only: Android runs Wan on the CPU, where a Nord 5 did not finish one Turbo step in 18 minutes (9e64acd)
  • Phones offer every listed Wan pack again; iOS holds Wan 2.2 only as Turbo, since the 20-step builds did not fit there (45c7f7d)
  • Phones decode video with the tiny decoder (taesd) when the pack has it, without tiling; 12 GB phones are offered Wan 2.2 Turbo, and superseded packs are not offered (38cce17)
  • Daily engine updates also move stable-diffusion.cpp (the video engine): its pinned commit follows the newest upstream release, and CI rebuilds it with the local patches (913e3b6)
  • Engine updates run every day instead of every Monday (34e143d)
  • iPhone screen: drafts and failed videos as short rows in chat (8290759)
  • Bump pro: drafts and failed videos are short rows; iPhone Your videos screen (5a8406c)
  • iPhone screens: a project's Chats and Knowledge base tabs, and the knowledge base's add (dfcc6dd)
  • A project's title and tabs are one raised bar: the header surface with the bar shadow under the tabs, and a gap before the first card (8209d08)
  • A project's tabs are the Models screen's tabs, and one + at the row's end adds to the open tab: a new chat, or a file or text for the knowledge base; the extra action rows and their arrows are gone (6a0e198)
  • Design doc: Menlo only, no second font (7330d88)
  • Revert "Android shows the app's monospace face: Meslo LG S (Apache 2.0, a Menlo derivative) ships in the app and FONTS.mono names it there; iOS keeps Menlo" (3f292d4)
  • Android shows the app's monospace face: Meslo LG S (Apache 2.0, a Menlo derivative) ships in the app and FONTS.mono names it there; iOS keeps Menlo (2f6232a)
  • Design doc: card radius is RADIUS.md; fix style at its shared source, never by rewriting screens (a79a93d)
  • Design doc: the card to copy is the chat list's elevated card (surface, small shadow, no border, radius 10) (1b1fdc0)
  • Design doc: one card recipe, no private styles, short rows for empty items, media sized to its shape; h2 is the screen title; Android uses the bundled Meslo LG through FONTS.mono (5cbd522)
  • Bump pro: no 'Made with AI' line in the viewer; iPhone viewer screen retaken (d297611)
  • Film-on-computer test: the viewer names the place and shows no 'Made with AI' line (ba2bdaf)
  • iPhone start-picture sheet retaken: the download says 4.3 GB, what the Mac still lacks (76a8452)
  • Bump pro: start-picture size counts only what the computer lacks; no visible AI label on films (d00d819)
  • Desktop room carries what each catalog download still fetches, as the computer reports it (a901724)
  • iOS PR shots: sd.cpp image at step 4 of 10, and the Remote Servers screen, retaken on the iPhone (7b81398)
  • A sheet whose view is already gone closes at once and still runs its close callback (54120c9)
  • iOS pods include the pro film module, and the privacy manifest in pod install's key order (44789fe)
  • Bump pro to e78b5cc7: the deleted-video viewer's Back is an arrow icon, with before and after shots (3ce54fd)
  • Settings video prompt label screens, before and after, iPhone light (0510bdf)
  • Bump pro to 11470886: video prompt setting reads Rewrite video prompts (7394573)
  • Video background-stop and notification texts name Off Grid AI in full (265149d)
  • Bump pro to c5ae8d7b: studio player and viewer colours from MEDIA (bf1526c)
  • Pre-push runs related tests on half the cores, each worker recycled at 1 GB (7cfc3c6)
  • The video upsell's icon circle derives its radius from a named diameter (47513f3)
  • PR screenshot add: before-video-viewer-ios.png [skip ci] (a33e05b)
  • PR screenshot add: before-video-library-clip-cards-ios.png [skip ci] (ac2f825)
  • PR screenshot add: before-chat-clip-card-ready-ios.png [skip ci] (c720683)
  • PR screenshot add: before-chat-clip-card-ios.png [skip ci] (59fd48b)
  • PR screenshot add: after-video-viewer-ios.png [skip ci] (1058e3c)
  • PR screenshot add: after-video-library-clip-cards-ios.png [skip ci] (ee6952d)
  • PR screenshot add: after-chat-clip-card-ready-ios.png [skip ci] (444a4f5)
  • PR screenshot add: after-chat-clip-card-ios.png [skip ci] (dc75bd3)
  • Video clip card, library and viewer before and after the design-token pass, iPhone light mode (88eb8d7)
  • Bump pro to 8039f1ca: Video screens on the design tokens (d1453d4)
  • Constants export RADIUS, the @offgrid/design corner scale (5d1183e)
  • Two module-local helpers are no longer exported (12d8d7d)
  • A sheet that has unmounted never starts an animation; a close still runs its callback (d198d14)
  • Drop an unused variable from the start-picture sheet test (91fa3f0)
  • PR screenshot add: before-speech-sheet-cut-off-ios.png [skip ci] (86b4c00)
  • PR screenshot add: after-speech-sheet-scrolls-ios.png [skip ci] (066d1e1)
  • Speech model sheet sizes like the text picker, so on-device models below a long remote list can be reached (68b0187)
  • PR screenshot add: after-openrouter-qwen-image-ios.png [skip ci] (277a5ba)
  • OpenRouter video test server publishes generate_audio as OpenRouter does (cf2329d)
  • An image model picked for any server reaches generation, and no longer becomes that server's chat model (df5ec6a)
  • OpenRouter images go through its Images API, which serves every image model; its chat endpoint refused Qwen Image, FLUX and Seedream (61065a5)
  • PR screenshot add: before-openrouter-image-endpoint-ios.png [skip ci] (fd1a806)
  • PR screenshot add: after-openrouter-heygen-clip-plays-ios.png [skip ci] (0e21048)
  • PR screenshot add: after-openrouter-heygen-clip-ios.png [skip ci] (10a3845)
  • PR screenshot add: after-openrouter-continue-ready-ios.png [skip ci] (ff88566)
  • PR screenshot add: after-openrouter-continue-plays-ios.png [skip ci] (a4d8835)
  • PR screenshot add: after-image-viewer-animate-ios.png [skip ci] (d4fae6a)
  • PR screenshot add: after-film-two-shots-openrouter-ios.png [skip ci] (41c97a1)
  • PR screenshot add: after-film-openrouter-ready-ios.png [skip ci] (4c04f95)
  • PR screenshot add: after-film-openrouter-plays-ios.png [skip ci] (bc9a1a2)
  • PR screenshot add: after-animate-photo-ready-ios.png [skip ci] (246bf13)
  • PR screenshot add: after-animate-photo-plays-ios.png [skip ci] (2633a59)
  • PR screenshot add: after-animate-photo-openrouter-ios.png [skip ci] (a014571)
  • PR screenshot add: after-animate-consent-generated-picture-ios.png [skip ci] (ae0a393)
  • PR screenshot add: before-video-model-sheet-spacing-ios.png [skip ci] (507f111)
  • PR screenshot add: after-video-model-sheet-spacing-ios.png [skip ci] (2459af8)
  • One remote-model group for every picker: video, voice and speech list remote models like text and image, at the same spacing (pro 317e02f6) (1c95150)
  • Bump pro to ff0b9973: a renewed key activates on a device whose licence expired (25a9866)
  • PR screenshot add: after-fresh-install-home-after-setup-ios.png [skip ci] (2b7e9a2)
  • PR screenshot add: after-fresh-install-chat-works-ios.png [skip ci] (30946de)
  • After setup, the expired-licence Pro screen is pushed over home instead of resetting the root, so Continue leaves setup (7ae41ff)
  • PR screenshot add: after-fresh-install-share-unticked-ios.png [skip ci] (593e3b1)
  • PR screenshot add: after-fresh-install-setup-starts-ios.png [skip ci] (77510c1)
  • A reinstall with an expired Pro credential runs setup first, then shows the Pro screen (05a7e5e)
  • Bump pro to deb3a448: the start-picture sheet says to connect a computer when none is paired (e2bb486)
  • A remote server's "Insufficient credits" is no longer shown as Not Enough Memory (6efbe19)
  • OpenRouter's video models show in the Video picker and make the clip, not only a paired Desktop's (3cdb50f)
  • Bump pro to 847fe084: clips, stills and photos saved before an iOS update are read from today's container (653e056)
  • Bump pro to fe437a1b: a narrated film joins on an iPhone, and a film joins clips made before an update (e898207)
  • PR screenshot add: after-film-plays-ios.png [skip ci] (30e8ccf)
  • PR screenshot add: after-making-screen-ios.png [skip ci] (5cd8e44)
  • Bump pro to c1db55a1: one OpenAI-shaped remote video client (83a0974)
  • Desktop video fake speaks Desktop's OpenAI-shaped /v1/videos: Video object, thumbnail, DELETE, model limits (4d83d42)
  • Bump pro to faf3f296: OpenRouter clips keep their real length; portrait films go to OpenRouter (fc8949a)
  • Engine tests for OpenRouter video: listing, chat clip, Stop, failure and Retry, start picture, film (e6844ca)
  • Bump pro to 9c185383: video models from a remote OpenRouter server are listed and used for clips and films. The film-on-computer test now expects the shared place label ('On your Mac' for a server named Studio Mac), which the film panel uses like the Making screen (614885b)
  • Bump pro to dd325f7c: Stop during the stills wait lets the film go at once; the film test asserts it again (2f4b32f)
  • Rendered video tests find controls by testID, role and label, not copy: Models Video tab, gallery card and tabs, failure Retry and Run anyway, the chat row, format choice, start-picture carry-on, a known person, model cards, alert buttons (df0bb46)
  • Bump pro to 1567cafc: testIDs on video controls; core adds testIDs on the Models Video tab, the Gallery tabs and Home's gallery card (4a2f1df)
  • Video contract tests drop a shadowed launch variable (lint) (341a90e)
  • Contract tests for the one RAM rule that decides video on this phone or on a computer (13392c9)
  • Contract tests for a person in every shot (consent first, then in every shot's request) and for deleting clips, films and cancelled pack downloads (30bd43f)
  • Contract tests for a film on the phone: shots in order then joined, Make it real waits for draft stills, Stop during that wait makes nothing, chat clips refused meanwhile (978a00c)
  • Contract tests for video after a restart: a clip the native worker kept making lands once, an interrupted one retries, a pack download carries on without fetching a file twice (db8c383)
  • Video service harness stops every launch a test made, waiting only on the one still running (3ce1d2a)
  • Bump pro to 2615d190: Making it and the storyboard follow mobile's card pattern, and the iPhone note says leaving the app stops the video (967c510)
  • Contract tests for video memory admission: iOS counts the working set only, a short phone refuses with a reason, Run anyway makes the clip (fee22e9)
  • Contract tests below the UI for a clip on the phone: progress, saved file and rate, chat clip, Stop, busy refusal, failure and Retry (8d76581)
  • PR screenshot add: after-story-cards-ios.png [skip ci] (cd0b01e)
  • PR screenshot add: after-film-waits-for-stills-ios.png [skip ci] (4b64af1)
  • PR screenshot add: after-gallery-film-tiles-ios.png [skip ci] (6be547a)
  • Bump pro to 5763f4c: Make it real tapped while the storyboard's stills are drawn makes the film (88f8f38)
  • Bump pro to 000ad13f: the story and film cards lift off the page with mobile's card border and shadow (5e42912)
  • PR screenshot retake: after-video-delete-confirm-ios.png [skip ci] (f9aec46)
  • PR screenshot retake: after-character-delete-confirm-ios.png [skip ci] (fa158ef)
  • PR screenshot add: before-character-delete-confirm-ios.png [skip ci] (28f7fba)
  • PR screenshot add: after-chat-video-stopped-ios.png [skip ci] (79e8e20)
  • A question sheet with its own Cancel shows no header Done beside its answers (4712d2b)
  • PR screenshot: after-video-delete-confirm-ios.png [skip ci] (e19381c)
  • PR screenshot: after-character-delete-confirm-ios.png [skip ci] (3710e8a)
  • PR screenshot: after-character-consent-ticked-ios.png [skip ci] (005a434)
  • PR screenshot: before-character-consent-tick-ios.png [skip ci] (64f5864)
  • PR screenshot: after-character-consent-off-ios.png [skip ci] (b8a5b57)
  • PR screenshot: after-quit-reopen-chat-kept-ios.png [skip ci] (665d101)
  • PR screenshot: after-video-budget-clip-plays-ios.png [skip ci] (602b09c)
  • PR screenshot: after-analytics-off-after-restart-ios.png [skip ci] (a889605)
  • PR screenshot: after-analytics-crash-on-after-restart-ios.png [skip ci] (90641b0)
  • An iPhone Wan clip gives its 3.5 GB text encoder back before sampling and the decode (e9ecd2b)
  • PR screenshot: before-chat-video-not-enough-memory-ios.png [skip ci] (fe3bfd9)
  • PR screenshot: after-video-keep-app-open-stopped-ios.png [skip ci] (2adbfa1)
  • PR screenshot: after-video-clip-plays-ios.png [skip ci] (1327435)
  • PR screenshot: after-settings-video-generation-ios.png [skip ci] (d492628)
  • PR screenshot: after-models-video-wan21-only-ios.png [skip ci] (57a4795)
  • PR screenshot: after-image-old-model-loads-ios.png [skip ci] (55d40c5)
  • PR screenshot: after-film-make-it-on-phone-ios.png [skip ci] (89c0bb5)
  • PR screenshot: after-desktop-stop-next-call-works-ios.png [skip ci] (de64a1e)
  • PR screenshot: after-desktop-model-loading-stop-ios.png [skip ci] (df4f578)
  • PR screenshot: after-analytics-what-we-share-ios.png [skip ci] (52f1ac5)
  • PR screenshot: before-video-models-offgrid-mark-android.png [skip ci] (9252e92)
  • PR screenshot: after-video-needs-pro-ios.png [skip ci] (e273e33)
  • PR screenshot: after-video-models-offgrid-mark-android.png [skip ci] (e847519)
  • PR screenshot: a free iPhone sees Video needs Pro in Models › Video (d76e3ad)
  • Video with no model and no computer offers a video model download when this phone can run one, and Find my computer only when it cannot (92b0876)
  • Bump pro to 33d31873: Cancel on a video download asks first while its first file is still downloading (000cca5)
  • Bump pro to 847e1320: video, Studio and Gallery ask in the app's bottom sheet, never a system alert (6f89034)
  • Bump pro to c5a8135: an iPhone admits a video clip against its working set, not the memory-mapped weights (1f791ce)
  • Report a problem opens a mail with support in To and the [Problem] subject; iOS attaches the full log, share sheet only as fallback (e8a3703)
  • PR screenshots: Video models with the Off Grid mark before and after it moved left of the name (Android) (fbe610f)
  • The Off Grid mark sits before a model's name on the compact card, instead of floating at the row's right edge (2653ccb)
  • Pro: a video pack download carries on after a restart; test with Android keeping the download running (9470f58)
  • A video pack whose file is still downloading natively is not stranded after a restart (3799997)
  • Three release-gate tests open the project's Knowledge base and Chats the way a person now does (6390716)
  • The background flush does not break a test environment without AppState (e185e2c)
  • Pro: deleting a person in the Studio asks first (6f6f351)
  • A change waiting to be saved is written as soon as the app leaves the foreground (6d438b7)
  • Pro: Cancel on a video download with files on the phone asks first (89a7a08)
  • Prompt enhancement streams to the screen and saves its card once, when the prompt is final (1fecb52)
  • A persisted store keeps one write in flight, so fast changes no longer outgrow the iPhone's memory (b95fa46)
  • Resume and Cancel on a model card no longer take each other's taps (388662f)
  • An install upgraded from v0.0.119 keeps its chats, images, settings, documents and Whisper model (31233dd)
  • Chat search finds the models that read images and leaves out speech and embedding models, as on Desktop (4629c08)
  • Pro: a video pack's files on the phone are offered to resume, and Cancel removes them (c78d997)
  • Knowledge-base documents added before an iOS update are read again after it (7f289a8)
  • A project shows Chats and Knowledge base as two tabs instead of two stacked halves; Chats opens first, each tab carries its count (ecc75e4)
  • The project page reloads its documents when you come back from the Knowledge Base screen, so a file you just added shows (2c51c69)
  • The image viewer's five actions fit the screen (b2e3260)
  • Pro: Stop works on a computer that stopped answering (start-picture, film, storyboard) (590d4f1)
  • Stop on a Desktop image lets go at once, even when Desktop never answers (1b24174)
  • A model loading on a paired Desktop can be stopped from the phone (1e87d6f)
  • iOS no longer declares Face ID: nothing in the app asks for it (b5e5e8b)
  • The microphone prompt names the paired computer as a place speech can be turned into text (fa8cf59)
  • The audio background mode says which feature needs it (39dc6c0)
  • Every iOS permission prompt says what the app now really does with it (9d37406)
  • Qwen3-ASR 0.6B is offered only on phones with the 3 GB its catalog entry measured (b59cc9e)
  • With Qwen3-ASR selected, the language picker offers its 30 languages, and a pinned one reaches the model (a6cd803)
  • Analytics: withdrawing Usage is tested with nothing queued and with a queued entry that names no event (7c0b524)
  • Knip passes: five names used only in their own file are no longer exported (1dfb1db)
  • Video settings name the computer's model, and the Library reaches the Studio (bump pro to 14d3415) (080a1fb)
  • Pairing through Sync gives the phone the desktop gateway key (bump pro to e08f9c3) (4dbd353)
  • A desktop found at a new address stays one server row: the scan reads its Sync id from /health (79e2194)
  • Phones' MTP draft default reads the shared cited value (MOBILE_MTP_DRAFT_TOKENS), not its own copy of 3 (5869ad5)
  • Video retry test checks the retry finished its downloads (lint: the counter was unused) (c58e8c0)
  • iPhone acceptance: the paired gateway still answers 401 (117277c)
  • Models > Transcription and the speech picker list Qwen3-ASR 0.6B beside Whisper where the phone can run it, and every surface names it once selected (98ac997)
  • With Qwen3-ASR as the speech model, dictation and voice notes transcribe on llama.rn; when it fails the composer says so in one line and a downloaded Whisper model transcribes instead (9fc5020)
  • Qwen3-ASR 0.6B downloads as a transcription model: its weights and audio projector, checksummed, under one progress bar (ad64abd)
  • Image mark test narrows the picks it reads to the ones on screen (type check) (45c273b)
  • A phone with no chats yet can search its paired computer: the search bar stays while a computer is paired (374711e)
  • PR screenshots: one row per computer, the same on Pro tools and Sync (c1bf8ca)
  • Image mark test checks every card and pick shown: the mark is on exactly Off Grid AI's builds, whatever the phone is offered (990af2d)
  • Bump pro: Pro tools and Sync name the same computers (26689db)
  • Android builds 64-bit only (364369c)
  • The chat list hands paired-computer search to its own component (0a3fac5)
  • Bump pro: one row per computer, not one per identity it has ever had (77bec89)
  • Search a paired computer from the phone's chat search (9de12b3)
  • iPhone acceptance: screenshots of the memory guard and both image engines generating (c0b4a10)
  • Video download test checks the retry really finished the download (lint: the counter was unused) (718d5f5)
  • iPhone text load: mapped weights also need the phone's free pages, or the OS kills the app (d0b90be)
  • iOS memory guard goes by the smaller of the app's headroom and the phone's free pages (8b82b1f)
  • New chat on a paired computer says it runs on a remote server, not 'on your device' (d74d98b)
  • Video in a chat with no video model: use a paired computer that makes videos, else offer Find my computer (4ced054)
  • Auto mode: a prompt-style description ending in a medium tag (', photo') routes to image generation (186f746)
  • iPhone acceptance run: screenshots of image, video, remote and search findings (6910d47)
  • Bump pro: a film made on the computer comes to the phone, the Character screen opens, a film restarted after Stop is made (4627914)
  • Catalog file: Whisper Large v3 Turbo Light (q5_0) for phones (whisper.rn runs quantized ggml) (dd1cbc4)
  • Catalog file: FLUX.2 klein 4B and Z-Image Turbo (Full and Light) for phones, SDXL Lightning and Turbo marked replaced, Pony Diffusion removed (a7a41fe)
  • Phones download and run FLUX.2 klein and Z-Image packs, and stop offering models a newer one replaces (aa8568c)
  • Image mark test: a missing card or pick fails with its name, and the type check passes (58599b0)
  • Fast, Balanced and Best show the Off Grid AI mark on Off Grid AI's builds too (text and image picks) (4408bdd)
  • Image cards carry the Off Grid AI mark on Off Grid AI's own builds, by the shared rule the text and video cards use (94acce6)
  • Bump pro: video models and the start-picture offer read the catalog file (8c1f26b)
  • Catalog file: the sd.cpp image models phones run and the Wan Light video builds (e52e16a)
  • The Image tab's sd.cpp models include the catalog file's image models, and a catalog check lists a new one at once (9f62432)
  • LiteRT memory-warning test's model browser answers getRecommendedSDImageModels, as useImageModels reads since 848a7f0 (5616794)
  • Setup plan tests follow 37759c6: Lean, Balanced and Extreme take the phone's Fast, Balanced and Best picks (3c77aff)
  • Fit tests follow ddaa6c1: a 12 GB iPhone loads Gemma 4 12B (7.3 GB) under its 70% chat ceiling; the strict 62% budget and an 8.5 GB file still refuse (2de62fb)
  • Tool registry test follows a3f6bd8: make_film joins generate_video, 8 tools (08c61d0)
  • The Off Grid AI mark's size comes from a StyleSheet, not an inline style (lint) (c31c82c)
  • Setup drops its old text-candidate builder: since 37759c6 its chat models are the phone's picks (33cf7af)
  • useModelsScreen test's image hook says its engine catalog is loaded, as useImageModels now reports (848a7f0) (80b74f4)
  • Downloaded-count test follows afdb05f: LFM2.5 8B A1B and MiniCPM5 2B are picks on 12 GB, so the three cards are Gemma 4 E2B and Qwen 3.5 0.8B and 2B (f5c15da)
  • Details-fail test follows afdb05f: the card checked is Qwen 3.5 2B, a model outside this phone's picks (a1248ba)
  • Research-licence test follows afdb05f: MiniCPM5 2B is a pick on 12 GB, so the bundled card compared is Qwen 3.5 2B (5e5cb0d)
  • Maker-filter test follows ddaa6c1 and afdb05f: the 36 GB phone's list grew past the first window, so the person scrolls to Devstral (b6b13c3)
  • Search-fit test follows ddaa6c1: an 8B estimate now loads on 8 GB Android, so the phone too small for it is 6 GB (737c288)
  • Curated-list test follows ddaa6c1: a 12 GB iPhone loads Gemma 4 12B, not Gemma 4 26B A4B (8b3354e)
  • Setup-choices test follows 37759c6: a 12 GB iPhone's plans are its Fast, Balanced and Best picks, read through the setup catalog (87d8ab6)
  • useImageModels tests' fakes answer the phone's memory and its recommended sd.cpp models, as 9061db4 reads them (bcbc638)
  • Download-button test follows afdb05f: picks are named by this phone's quality-ranked picks, and the sizes come from Qwen 3.5 2B, a list model (adfd60e)
  • Image tab fetches the phone's engine models again: the always-listed sd.cpp entries no longer read as an already-loaded catalog (848a7f0)
  • Tools screen tests follow d51e111: free tools show, and Pro's video tools stay out without Pro video (7a46617)
  • Storage screen test's store answers selectors and getState, as the real store does (8bc6073) (ce04467)
  • Capability-card test follows afdb05f: MiniCPM5 2B is a pick on an 11 GB phone, so Qwen 3.5 2B's card shows the capabilities (256a7a1)
  • Picks screen test follows afdb05f and ddaa6c1: a 12 GB Android phone's picks rank by quality alone, a 4 GB phone gets three small picks (a81733b)
  • Bump pro: a muted start-picture action reads as unavailable, styled from a StyleSheet (54122a2)
  • PR screenshots: the Android states of this release, by feature (8fd5ecc)
  • Boot test counts Pro's video reconcile: one more download-DB read when Pro is checked out (pro 6fb3b12e) (4d0e481)
  • Catalog-name test follows ddaa6c1: on a 16 GB phone LFM2.5 8B A1B is still a list card, not a pick (c92fb08)
  • Auto Setup tests follow 37759c6: plans are the phone's quality-ranked picks, and the deadline stalls the live image catalog (c651a93)
  • knip knows Pro's film module, autolinked from pro/ like @offgrid/pro, is not a package.json dependency (3358215)
  • Tools index no longer re-exports AVAILABLE_TOOLS: only the registry and its test read it (0df20e8)
  • Setup's pick candidates stay private to the setup catalog (4d29a75)
  • Pro: start-picture actions follow the computer: its download, its memory, Light first; the storyboard photo and the model's last image follow the same rule (7268b97)
  • The phone reads what Off Grid AI Desktop can take: its memory and installed models (d58df09)
  • 11 GB+ phones are offered Off Grid AI's Wan 2.2 Light to try (4ed80fd)
  • Setup on a phone too small for video offers Find my computer, or names the paired computer that makes them (035c873)
  • Pro: start-picture actions are disabled with a way to get the model; the chips keep their height; Off Grid AI's video builds carry its mark (0d563b4)
  • The phone can download a model on Off Grid AI Desktop (081e73f)
  • A model Off Grid AI made shows the app's logo beside its name (ed2e3ce)
  • Setup's on-phone Wan 2.1 is Off Grid AI's Light build (8ebb011)
  • Setup's Lean, Balanced and Extreme are the phone's Fast, Balanced and Best picks from the catalog (37759c6)
  • Saving an edited server checks it before closing, so the list shows its new status (b47b225)
  • Bump pro: a film checks the computer without a deadline (c4fbed1)
  • Lean, Balanced and Extreme follow how easily a chat model fits this phone, not its size (15b3127)
  • Calls to Desktop have no deadline: a slow model load or image is no longer cut midway (ae9c0c9)
  • Choosing a Desktop model without its API key says so and where to find one (c8181b9)
  • The phone finds Off Grid AI Desktop when it requires an API key, then asks for the key (cb1e917)
  • Remove the design partner offer: Off Grid AI is a consumer product (0b44ed8)
  • Speech models can be found on Hugging Face (79859b7)
  • Extreme offers the largest models the phone can run, on every phone (98be140)
  • iOS upscales film shots with sd.cpp's ESRGAN (4d40c9f)
  • Use the shared contract for film cards and Fastest settings results (bbb7a7c)
  • Fastest settings log line passes lint (ffab408)
  • Fastest settings places every modality, not only text (47934e3)
  • Pro: start pictures carry real consent (4c2da3a)
  • The search model shows everywhere the other models do (8bc6073)
  • Android Wan video diffusion runs on CPU, because Hexagon returns a constant DiT output (ceda310)
  • make_film joins generate_video as a Pro chat tool; film cards keep their story when synced (a3f6bd8)
  • Take back the noise session's unfinished Wan backend edits from the start-image commit (71f5ff2)
  • Phones start a clip from a photo, and Android upscales film shots (70443f0)
  • Analytics spec for video matches Off Grid Desktop word for word (dd96a04)
  • Video card has the chat card shadow; Pro's film module links only with Pro (824c261)
  • Seams for Video Studio: actions under video messages, Animate in the image viewers (d99aa13)
  • Video is Pro: the public app keeps only hooks, slots and the saved-video player (d51e111)
  • A queued video prompt is always its own turn; queued text still goes together, as the shared queue decides (f3a8e6f)
  • Analytics spec: when each app reports a video model load (OGAM sends none), as in OGAD (15d5994)
  • Scrub test covers a person's file name followed by punctuation (ec86708)
  • Analytics tests cover the video setup funnel and video model facts (2022f19)
  • Screenshots of the screens this release changes, iPhone and Android, light mode (03d89f3)
  • Pro points at its release head: video stream reporting within the lint limit (48fc231)
  • A release build bundles the JS after the video runtime is prepared, so Gradle accepts the order (8331583)
  • Analytics spec matches OGAD's copy word for word (fcb04c4)
  • Settings and Auto Setup tests reach the merged screens: backend in General, plans open by their heading (d1a0522)
  • The features snapshot test covers video generation; SD packs report engine sd.cpp (b349b8a)
  • Queue tests follow main's rule again: queued messages are sent together, as the shared queue decides (9776579)
  • The search model changer keeps its types private (a57406e)
  • A Desktop video made from a chat sends a video generation_finished and never the prompt (bb4ef39)
  • Video joins opt-in analytics: generation, downloads, setup flow and feature use (234bb88)
  • A model that asked for the NPU but ran on the CPU reports zero offloaded layers (2fb4ba8)
  • App open and background handling is internal to analytics; tests drive it through OS app-state events (e8a5ee9)
  • Only a real trip to the background counts as leaving the app, so a cold launch sends one app_opened (afe1b38)
  • The offline claim names the features that use the network after download (b8a61a7)
  • Report a problem hides Clear, which would empty the view but not the log that is sent (5113b01)
  • Sending the debug log waits for a flush already writing (5cdf181)
  • Image model downloads report their catalog ID, not custom (2120e37)
  • A refused microphone ends voice input as stopped, not failed, and asks for no consent (a4a5abc)
  • The PDF log line keeps sizes only, never the path that names the document (aeb2130)
  • A regenerate is counted once, where it really runs (e9c7556)
  • The remote server funnel starts only when the editor opens, not when it hides (bbbe5bb)
  • Small readability fixes SonarCloud flagged in the analytics feature snapshot and download store (a8f7197)
  • The fallback loop keeps its name; the turn-level analytics wrapper gets its own (8232294)
  • A consent change never rejects, and every screen that makes one handles its promise (d3cfeb3)
  • Crash scrubbing checks file types with sets, not long regular expressions that backtrack (93ec4e8)
  • PR screenshots: every screen opt-in analytics changes, before and after, on iPhone and Android (30b8f78)
  • llama.cpp's per-node graph lines stay out of the debug log, so Report a problem shows the useful trace (c2770c7)
  • llama.cpp's per-token log lines stay out of the debug log, and quoted token text is redacted (97e6b68)
  • The analytics spec matches OGAD's review: document file types, and how each app sends a problem report (ba4a773)
  • Store builds keep the size-capped debug log, so Report a problem carries a trace (764dc36)
  • The SDK's own lifecycle events stay off, so no deep link URL reaches PostHog (5b680e2)
  • A crash report keeps a file name only for the app's own code; a person's file becomes (bad3d80)
  • Core uses the Pro commits that report Pro funnels and keep tool content out of logs (5f300d0)
  • Downloads are not measured at all before opt-in, and a same-millisecond finish still reports a speed (7fc15bf)
  • Every new analytics module is covered end to end and held to 100% coverage (781823b)
  • Analytics drops failed boundary reads in one place, and a corrupt crash marker is cleared instead of kept (05ce60c)
  • Analytics journeys are proven on the real App: default sends nothing, opt-in sends no chat, opt-out resets, logs hold no chat, unclean exits (93b1e8e)
  • Closing the app sends what analytics has queued and stops its timers (b56073c)
  • Analytics persists through the app's AsyncStorage, and every event carries the spec's device properties (8e13832)
  • Message routing and stream parse logs keep lengths, never the typed text or reply (936b66a)
  • Store listings and docs describe opt-in analytics instead of claiming no telemetry (003c54e)
  • The iOS privacy manifest declares the opt-in analytics data, not linked and not tracking (65192b4)
  • Privacy copy says chats and files never leave the device, and analytics is opt-in (543e1c8)
  • The debug log no longer holds prompts, replies, reasoning, transcripts or tool arguments (9aeae0d)
  • Release builds send opt-in analytics to the Off Grid AI PostHog EU project (8fc1213)
  • The Pro upgrade funnel reports gates, the Pro page and activation (6d797b5)
  • Remote server, image and voice setup report their funnel steps (d0be4a7)
  • Opted-in sessions count chats, messages, regenerations, projects, documents and tool use (b08eea4)
  • Opted-in sessions report model download starts, finishes and failures (13fded2)
  • Opted-in sessions report model loads and load failures with the device's chip and free memory (8f4214b)
  • Opted-in sessions report how each text, vision, image and voice generation ended, without any content (9dde0a3)
  • Settings has an Analytics section, and Reset All Settings turns analytics off (b43a9fd)
  • Report a problem shows the debug log, then shares it with support (c50c674)
  • Auto Setup offers an unchecked share-analytics row above every way out, with a What we share page (4649789)
  • Opted-in sessions report app opens, backgrounding and screens, and a failure can ask for consent (e873c4f)
  • Analytics stays off until the person opts in, and opting out resets the anonymous ID (bacf608)
  • The app can send opt-in analytics through the PostHog React Native SDK (22c7af8)
  • Log partial video and image files that cannot be removed instead of ignoring the result (13e2039)
  • Get the mobile video branch green: tests follow the branch's settings, setup and video behaviour (d4dd4ec)
  • List and auto-set-up only the video models this phone can run (c602826)
  • Choose image weights, companions and samplers through the shared image rules (9f3d0c6)
  • Run local and remote video through the shared engine, job and polling rules (69bb7bd)
  • copy: describe Pro memory Sync and approved actions (ef87de9)
  • copy: use dedicated design partner contact address (113224d)
  • copy: update small business design partner eligibility (0ec6a8b)
  • Tighten Mobile Auto Setup layout (0a2e6fa)
  • Make Mobile Auto Setup choices compact (66f8111)
  • Add selectable model downloads to Mobile Auto Setup (96fcdce)
  • Update Pro pricing copy for monthly plan (f874fd4)
  • perf(video): share GPU query storage across attention chunks [skip ci] (e572ae4)
  • perf(video): keep Adreno attention chunks on the GPU [skip ci] (ca25ae3)
  • style(image): normalize integrity helper whitespace [skip ci] (1986b23)
  • build(video): bundle Qualcomm DSP runtimes [skip ci] (62b1df7)
  • perf(video): optimize Android debug engine kernels [skip ci] (42256cf)
  • build(video): prepare pinned runtimes through CocoaPods and Gradle [skip ci] (80ec42e)
  • build(mobile): add native video playback dependency [skip ci] (454bccb)

Build: 1793687964