OGAM

off-grid-aiMIT活跃维护

在手机或 Mac 上离线跑 GGUF 大模型、视觉识别、Whisper 语音转文字和 Stable Diffusion 生图,支持工具调用与局域网服务,无需账号和 API Key。

The Swiss Army Knife of Offline AI. Chat, see, speak, and generate images on your phone or Mac — GGUF LLMs, vision, Whisper speech-to-text, Stable Diffusion, tool calling, and local-network servers. Runs on your CPU, GPU, or NPU. No account, no API key, zero data leaves your device.

v0.0.122发布于 2026-11-04 15:30 UTC3,361star +14 / 7 天335fork同步于 2026-11-10 05:40 UTC

怎么上手

由 README 提炼,执行前请确认
git clone https://github.com/off-grid-ai/OGAM.git
cd OGAM
npm install
npm run android
硬件要求按 README 说明

README 未给出具体显存或内存门槛,只说明在手机 CPU、GPU、NPU 上运行;GPU 加速支持 Adreno(Snapdragon 8 Gen 2+)与 Apple Silicon Metal,Hexagon NPU 为实验性且仅加速 Q4_0/Q8_0 量化。

支持 Apple Silicon
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

手机和 Mac 上的离线 AI 工具箱,聊天、看图、语音、生图全在本地跑,数据不出设备

在手机或 Mac 上离线跑 GGUF 大模型、视觉识别、Whisper 语音转文字和 Stable Diffusion 生图,支持工具调用与局域网服务,无需账号和 API Key。

核心能力

  • 用 llama.cpp 跑 GGUF 模型,支持 Qwen 3、Llama 3.2、Gemma 3 等
  • Adreno GPU 走 OpenCL、Apple Silicon 走 Metal 加速推理
  • 内置 Whisper 本地语音转文字,支持自动与免提模式
  • 本地 Stable Diffusion 生图,Snapdragon 上 NPU 加速
  • PDF 文档分块后用 MiniLM 本地嵌入,按余弦相似度检索

容易踩的坑

从源码构建需 Node.js 20+、JDK 17 / Android SDK 36,iOS 需 Xcode 15+ 并先执行 pod install;模型需自行下载 GGUF 文件,NPU 只认 Q4_0/Q8_0,K-quant 会静默回退到 CPU;Pro 功能(语音回复、人设、MCP 工具、Mesh 同步)需单独付费授权。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.0.122
  1. v0.0.123-beta.1Off Grid 0.0.123-beta.1 (beta)pre-release2026-11-07 · 2026-11-07 17:53 UTC
    查看更新说明

    0.0.123-beta.1

    • FeatureShowcase test: the app is in front, as when Home is on screen; holding while away and the fresh wait on return covered (7481bf27f)
    • FeatureShowcase test: the row reports the offset scrollTo reaches, as a phone does, so the pip follows it; moving taps and pip widths covered (cfa363c33)
    • FeatureShowcase test: the swipe sends its scroll offset, and the loop past either end is covered (0a7dd124b)
    • Fix overlaps: meta row (Speak, Message actions) and Downloads transfer buttons meet, never overlap (e7df2b9ac)
    • Review: round-3 iPhone shots beside Android, each screen checked by hand on both phones (c7d34170c)
    • Review: round-3 Android shots of Home, Chats, a chat, attach menu and model settings (b252a0b2f)
    • Tabs: the chosen tab keeps the same weight, so the tabs after it stay put (75bf7e8cd)
    • Settings: slider values end on the same right edge (50 sat inside, 512x512 filled the box) (e630c1404)
    • Model settings: the default instructions box has a heading, like every other setting (43b5cb518)
    • Copy: Home and a new chat promise the brand's words, "Your chats and files never leave your device." (485e35f21)
    • Remove rowPreview: no row shows a reply preview any more (0907b014c)
    • Home: Recent rows are one line, the title and when (fc24efd89)
    • Chats: one line per chat on the page, the title only, under the day heading (no card, preview or time) (15abd6fd5)
    • Pro: one switch everywhere, and a closed video card stays closed (f835ca06e)
    • Failure card: closing it settles the cause; Retry keeps it (2a6172cd4)
    • Settings: a segment label stays on one centered line (Aggressive broke mid-word on Android) (5842e1b70)
    • Switch: a white knob on emerald when on, on both phones (Android drew black on green) (0e09bcfee)
    • Review: Android shots for Home, Chats, Chat, Model settings, the + menu and Image settings (6de227fa8)
    • Composer: one attach list on both phones (Take photo, Choose photo, Document), no second menu on Android (c69a722a8)
    • Review page: Claude's marks, a numbered box round each problem on a shot (ff0f08c00)
    • Chat: the reasoning starts open in every turn, plain, tool and synced, as on Desktop (3d27e7cba)
    • Composer: no focus line along the top while typing (943e56379)
    • Model settings, Image: the picture style row, the same choice as the composer and as the Video card (eac974f9b)
    • Chat: the work behind a reply reads Working, Work done, Work stopped or Work failed, Desktop's words (eaeb74b91)
    • Thinking: a plain step row (Thinking with a spinner, then Thought, and a chevron), no card, as in Desktop's timeline (a71db41e7)
    • Composer: full width to the screen's edges and bottom, rounded top corners; focus lights the top edge (f1a114ca4)
    • Review page: clip controls (seek with frame preview, time, speed) and the text model sheet sliding up as a clip (aa0699972)
    • Review page: a late render draws nothing, and a finished save clears only the note it sent (03569d638)
    • Review page: the new template that plays clips, and Home in motion as the first clip (f6750f26e)
    • Attach sheet: a picker that rejects is logged, never left as a floating promise (31c483fc3)
    • Bump pro: hand-test screenshots (10ed6cb4b)
    • Play: the final-sweep screenshots, the Home chips shot, the alive-touch retakes and the desktop ripple video (46482b327)
    • Attach sheet (iPhone): Take photo, Choose photo and Document in one sheet, no second step (8e1897dca)
    • Review: composer with a photo, before and after (d09c201bf)
    • Ledger: hand test 97 (f665e2b83)
    • Ledger: hand test 96 (a7e634129)
    • Composer: the assistant icon is drawn at the size and weight of + and settings (95de9e0fd)
    • Attach menu: says why Photo is missing when the model can't see photos (the placeholder no longer does) (e04bf7b02)
    • Composer placeholder: 'Ask anything' on one line for every model; 'Describe a picture' in image mode (6ba158b90)
    • Composer: attachments sit inside the composer box; the assistant icon is the same grey as + and settings (541f13717)
    • Composer attach
  2. v0.0.122Off Grid 0.0.122最新正式版2026-11-04 · 2026-11-04 15:30 UTC

    0.0.122-beta.1

    • Restyle: the prompt comes from the thread as shown, so a retried answer names its own turn (f50993afb)
    • Composer: the Pro audio layout keeps the footer inset (e43c47595)
    • Styles: a queued turn keeps the styles it was sent with; the new chat adopts drafts on its first send (6e24a398f)
    • Styles: a new chat's draft styles move to it when it gets its id; no other chat takes them (96e825ed5)
    • Action ids: the style row's arrows (e7165d7e1)
    • PR screenshots: styles, arrows and quick settings on both phones (3ad8b1270)
    • Quick settings: the menu is the 220 pt the edge clamp assumes, so a label never wraps under its badge (iOS) (a36287e06)
    • Styles: an arrow on each side of the row while more styles lie that way, in the composer and the settings; no All sheet (639c3d309)
    • Bump pro: main merged in (3b8ff805b)
    • Bump pro: style in the video settings; voice row uses the core badge (767f35361)
    • Quick settings: one badge shape, emerald only when on, theme shadow (e9e07bb37)
    • The chat's style is in the image settings too; the same choice the composer shows (a259317c8)
    • Composer is one box in every mode, down to the screen's bottom edge; a style pick folds the row to the line that names it; image mode asks to describe a picture (538c95c37)
    • Composer with styles runs edge to edge; the input inside draws no square edge; no divider above the chat bar (4335c2ff0)
    • Revert dark shadows to the previous depth (e4ec24d2d)
    • Dark shadows follow the design system: tight white edges and a faint emerald halo, no glow around every card (e5f2cb585)
    • Styles: the picture's Restyle is lifted like the clip's Extend (ca1696d03)
    • Buttons: the primary action sits on the surface layer with the soft emerald halo, as the brand says, not a flat outline (ae935e930)
    • Styles: one composer box across the full width with no divider; All opens every style as a grid (97f07b480)
    • Styles: in image and video mode the styles are the top of the composer box, one edge with the input (d2b35b58e)
    • Styles: the Restyle sheet shows every style as a grid; Restyle is a text pill with a 44 pt target (0e5096d56)
    • Styles: the Restyle sheet's prompt sits on the sheet's padding with room before the styles, as Extend does (abb712e41)
    • Styles: the row sits in the app's elevated card, flush with the composer; the chosen tile takes an edge, not a lift (14010835a)
    • Bump pro: clip styles and Restyle; rendered tests for picture and clip styles, Restyle and Retry; action ids (81a4f0c5a)
    • Chat: Restyle on a picture, the style on the turn's meta line, and the Restyle sheet (32ed3e05a)
    • Chat: a picture or clip turn records its style and adds its words after enhancement; Retry keeps the turn's own style (0d6c04180)
    • Chat: image and video mode show a row of styles above the composer (23b0ae219)
    • Styles: each chat remembers its picture and clip style, and a new chat's choice follows it (aa77f019f)
    • Styles: the phone's previews for the shared image and video styles (92b41ee66)
    • The LiteRT summary request ends on the task, not on a dropped question (20771af8f)
    • LocalSummarizer stays inside contextCompaction (3b41e2ce0)
    • Compaction is handed the engine that writes its summary (d92062b0d)
    • PR screenshots: litert-load-floor on a Pixel 9 (d555122ac)
    • PR screenshots: memory-refusal-numbers on a Pixel 9 (bae6dac54)
    • PR screenshots: litert-compaction-summary on a Pixel 9 (61fbf8154)
    • The LiteRT load-floor tests run on the chat screen (2072467fb)
    • The LiteRT memory refusal test sends from the chat and reads the sheet (58156b66e)
    • A LiteRT turn refused for a full context is compacted and retried (da61c79c8)
    • A failed LiteRT load says "Failed to load model" once (0c20056f0)
    • A LiteRT model refused for memory says how far off the phone is (9da9f15b4)
    • The LiteRT compaction test loads the 2048-token context native gave it (cddb26564)
    • A LiteRT model RAM cannot hold is refused with a memory message (4794bfe80)
    • A rendered test chats past a LiteRT context native cla
  3. v0.0.122-beta.1Off Grid 0.0.122-beta.1 (beta)pre-release2026-11-04 · 2026-11-04 13:16 UTC
    查看更新说明

    0.0.122-beta.1

    • Restyle: the prompt comes from the thread as shown, so a retried answer names its own turn (f50993afb)
    • Composer: the Pro audio layout keeps the footer inset (e43c47595)
    • Styles: a queued turn keeps the styles it was sent with; the new chat adopts drafts on its first send (6e24a398f)
    • Styles: a new chat's draft styles move to it when it gets its id; no other chat takes them (96e825ed5)
    • Action ids: the style row's arrows (e7165d7e1)
    • PR screenshots: styles, arrows and quick settings on both phones (3ad8b1270)
    • Quick settings: the menu is the 220 pt the edge clamp assumes, so a label never wraps under its badge (iOS) (a36287e06)
    • Styles: an arrow on each side of the row while more styles lie that way, in the composer and the settings; no All sheet (639c3d309)
    • Bump pro: main merged in (3b8ff805b)
    • Bump pro: style in the video settings; voice row uses the core badge (767f35361)
    • Quick settings: one badge shape, emerald only when on, theme shadow (e9e07bb37)
    • The chat's style is in the image settings too; the same choice the composer shows (a259317c8)
    • Composer is one box in every mode, down to the screen's bottom edge; a style pick folds the row to the line that names it; image mode asks to describe a picture (538c95c37)
    • Composer with styles runs edge to edge; the input inside draws no square edge; no divider above the chat bar (4335c2ff0)
    • Revert dark shadows to the previous depth (e4ec24d2d)
    • Dark shadows follow the design system: tight white edges and a faint emerald halo, no glow around every card (e5f2cb585)
    • Styles: the picture's Restyle is lifted like the clip's Extend (ca1696d03)
    • Buttons: the primary action sits on the surface layer with the soft emerald halo, as the brand says, not a flat outline (ae935e930)
    • Styles: one composer box across the full width with no divider; All opens every style as a grid (97f07b480)
    • Styles: in image and video mode the styles are the top of the composer box, one edge with the input (d2b35b58e)
    • Styles: the Restyle sheet shows every style as a grid; Restyle is a text pill with a 44 pt target (0e5096d56)
    • Styles: the Restyle sheet's prompt sits on the sheet's padding with room before the styles, as Extend does (abb712e41)
    • Styles: the row sits in the app's elevated card, flush with the composer; the chosen tile takes an edge, not a lift (14010835a)
    • Bump pro: clip styles and Restyle; rendered tests for picture and clip styles, Restyle and Retry; action ids (81a4f0c5a)
    • Chat: Restyle on a picture, the style on the turn's meta line, and the Restyle sheet (32ed3e05a)
    • Chat: a picture or clip turn records its style and adds its words after enhancement; Retry keeps the turn's own style (0d6c04180)
    • Chat: image and video mode show a row of styles above the composer (23b0ae219)
    • Styles: each chat remembers its picture and clip style, and a new chat's choice follows it (aa77f019f)
    • Styles: the phone's previews for the shared image and video styles (92b41ee66)
    • The LiteRT summary request ends on the task, not on a dropped question (20771af8f)
    • LocalSummarizer stays inside contextCompaction (3b41e2ce0)
    • Compaction is handed the engine that writes its summary (d92062b0d)
    • PR screenshots: litert-load-floor on a Pixel 9 (d555122ac)
    • PR screenshots: memory-refusal-numbers on a Pixel 9 (bae6dac54)
    • PR screenshots: litert-compaction-summary on a Pixel 9 (61fbf8154)
    • The LiteRT load-floor tests run on the chat screen (2072467fb)
    • The LiteRT memory refusal test sends from the chat and reads the sheet (58156b66e)
    • A LiteRT turn refused for a full context is compacted and retried (da61c79c8)
    • A failed LiteRT load says "Failed to load model" once (0c20056f0)
    • A LiteRT model refused for memory says how far off the phone is (9da9f15b4)
    • The LiteRT compaction test loads the 2048-token context native gave it (cddb26564)
    • A LiteRT model RAM cannot hold is refused with a memory message (4794bfe80)
    • A rendered test chats past a LiteRT context native cla
  4. v0.0.121-beta.1Off Grid 0.0.121-beta.1 (beta)pre-release2026-11-04 · 2026-11-04 08:35 UTC
    查看更新说明

    0.0.121-beta.1

    • iOS release signing installs Apple's WWDR intermediates and lists every identity, so an untrusted chain is not taken for a missing key (23241f558)
    • iOS release signing checks the P12 against the profile and says which is wrong, before the archive (f81a29744)
    • iOS release signing asks for an Apple Distribution certificate, the kind the team has; iPhone Distribution matched none (8c8224548)
    • Analytics: the action-id list includes the new video settings and video-intent testIDs (965d197dc)
    • PR screenshots: Use fastest settings at the top of chat settings and Model Settings; rows line up (bf7ed975e)
    • Settings: Model Settings and chat settings share one section header, so Video lines up in both (b90449674)
    • Settings: Use fastest settings leads chat and Model Settings, above General, since it places every modality (77eb76007)
    • Bump pro: the video settings header lines up with Text and Image (9592e8ba8)
    • Bump pro: the video settings action is a primary button, as in Text; its screenshot (73dd9ebc9)
    • Bump pro: in-chat video settings use the same card, sliders and Advanced as Text; a shared settings input style (18fd506d6)
    • PR screenshot: compact video settings on the Nord (recommended line, Try 832x480) (1f13ed4ec)
    • Bump pro: video settings' recommended line fits, and its actions align to the content edge (a104d3c34)
    • PR screenshots: the iPhone Turbo clip at shift 3 and at shift 8 (150868c8a)
    • Bump pro: Try full size in video settings, and the settings and card notes kept short; their tests (1e921ed01)
    • Embedding: wait on a load in flight by checking for it, not by testing the promise (SonarCloud) (44bfbe803)
    • PR screenshots: video intent on iPhone; the Nord's phone-size clip, its note and its recommended settings (d450f0dcc)
    • Bump pro: video settings show what is recommended and go back to it in one tap; its rendered test (fda814d46)
    • Bump pro: the video card says when this phone made the clip smaller, and how to get sharper video; its rendered test (c1b08cec1)
    • Bump pro: a phone renders Wan 2.1 at its trained size when it has the 16 GB the pack lists, smaller below; its test (f8e71392f)
    • Chat: 'Create a video of…' makes a video without the toggle, using shared @offgrid/models' video-request rule (b8fd57615)
    • PR screenshots: on iPhone a playing clip is uncovered, and titles show no reasoning (db43f106d)
    • PR screenshot: a saved clip title loses a model's reasoning on Android (a80184bc9)
    • Bump pro: saved story titles lose a model's reasoning on load (70b4cb669)
    • Saved video prompts lose a model's reasoning on load (c7942ec09)
    • One-shot rewrites keep the model's answer only: no longer becomes a video prompt or title (aeda672ee)
    • withoutReasoning: a model's text as a prompt or title, its answer (or bare reasoning when cut off) (8909238db)
    • PR screenshots: restored Wan 2.1 pack generates; a playing clip is uncovered (Android) (d6966fd9f)
    • Bump pro: a playing clip has nothing over its picture; tests follow (ec9f74379)
    • Video pack load failure: a quoted path with "alloc" in it is not a memory failure (4af1dfd8b)
    • Video pack load failure keeps the allocation error when sd.cpp logs a vaguer one after it (609fa12db)
    • Video pack load failure: each backend attempt starts with an empty error log, so the advice matches the last attempt (b0ce86c07)
    • knip: llama-embedding is the live capture's engine binary, not a dependency (f9d356766)
    • PR screenshots: search model switch and video pack load failure, before and after, Android and iPhone (803617995)
    • Video pack load failure names the file sd.cpp could not read, without its source location (5ac787f51)
    • Video pack load failure names stable-diffusion.cpp's last error, on Android release builds too (dae088cde)
    • Multilingual MiniLM L12 recommendation: a conversion llama.cpp loads, checked live against the Hub and llama.cpp (a47e21208)
    • Search model switch: a refused file says why in a sentence and keeps llama.cpp's reason; XLM-R encoders (5
  5. v0.0.120-beta.1Off Grid 0.0.120-beta.1 (beta)pre-release2026-11-03 · 2026-11-03 07:43 UTC
    查看更新说明

    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 (fb5ab710f)
    • feat(video): Pro draws the chat clip card; Gallery's Videos opens the Library (ac9574df1)
    • feat(models): recommend sd.cpp image models that fit the phone's memory (9061db452)
    • feat(models): compact embedding picker and clear retry error (74ad70bfb)
    • feat: link Settings Pro card to design partner offer (2a545627c)
    • feat: show design partner offer below Pro pricing (448e8c8e3)
    • feat: add mobile design partner details and email draft (1e98df1bd)
    • feat(video): add short Android backend diagnostics [skip ci] (8f9d6f4f7)
    • feat(image): support complete SD checkpoints on mobile [skip ci] (00b89f11d)
    • feat: load SD checkpoints and preserve RGBA image output [skip ci] (c688eb86f)
    • feat: stream lightweight SD image previews on mobile [skip ci] (b85a21c50)
    • feat(onboarding): choose auto setup model downloads [skip ci] (dc67ffa0c)
    • feat(video): show auto setup pack files [skip ci] (eaeeec9a1)
    • feat(settings): show default system prompt in chat Text settings (6e19d08ff)
    • feat(settings): move shared generation controls to General (21b0440da)
    • feat(video): include compatible packs in mobile auto setup [skip ci] (755cd74fa)
    • feat(mobile): use themed video player controls and picture in picture [skip ci] (a101a2e63)
    • feat(video): report decode sections and reuse final frame preview [skip ci] (48481c918)
    • feat(video): show reused frame previews and decode progress [skip ci] (f4883a45a)
    • feat(image): search and download compatible SD packs from Hugging Face [skip ci] (d4d580769)
    • feat(sync): describe portable mobile SD image packs [skip ci] (5e764cd8a)
    • feat(image): connect Qwen packs to mobile model and generation flows [skip ci] (75b548821)
    • feat(image): expose the mobile SD runtime with hardware fallback [skip ci] (d653f2fbd)
    • feat(video): select and report Android NPU execution [skip ci] (b26d6cc50)
    • feat(video): load LTX and Hunyuan packs on mobile [skip ci] (8d2d149fe)
    • feat(settings): allow hiding the dev sync status bar [skip ci] (a8c5fc916)
    • feat(chat): route video turns and tools through shared generation state [skip ci] (421c95dfc)
    • feat(video): own generation recovery gallery and media export [skip ci] (3adb2bac2)
    • feat(models): add video search selection settings and storage controls [skip ci] (26bf6fd3f)
    • feat(remote): discover OGAD video models and resume remote jobs [skip ci] (0f42fb98f)
    • feat(models): manage complete video packs and resumable downloads [skip ci] (2b2c7f3f5)
    • feat(video): add Android Vulkan generation and scoped media export [skip ci] (d46a539eb)
    • feat(video): add shared native lifecycle and iOS Metal generation [skip ci] (3b80a82c0)
    • feat(gallery): play save and delete videos on mobile [skip ci] (d42bbb109)
    • feat(media): store synced videos and update Pro integration [skip ci] (50c50468d)
    • Fix: voice loads within the memory budget, and deleting the voice model leaves no voice behind (pro a8669da, 47a13e1) (641405a88)
    • Fix: a model whose files the disk will not remove stays listed and says so, with Retry (9fe578d23)
    • Fix: vision repair now reloads a model that is loaded without its projector (29b6c2f76)
    • fix(video): a clip the app refuses says why, and a failed clip leaves no unhandled rejection (2373a354e)
    • fix(image): one measured estimate decides both the sd.cpp recommendation and the memory guard (934ffd377)
    • fix(image): an sd.cpp model keeps its own steps, guidance and size (8801b91ac)
    • fix(image, Android): sd.cpp images run on the CPU on Adreno, where Vulkan crashes in the UNet (d14c9c5a5)
    • fix(image, Android): sd.cpp images skip the NPU, and a failed draw retries one backend down (e23ef43d9)
    • fix(image): a model that loaded but could not draw says so, not "Failed to Load Model" (0245a6484)
    • fix(downloads): a video pack's file downloads never hydrate as rows of their own (a422a0c92)
    • fix(analytics): withdrawing Usag

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Off Grid AI

    The Swiss Army Knife of On-Device AI

    Chat. Generate images. Use tools. See. Listen. All on your phone or Mac. All offline. Your chats and files never leave your device.

    Anonymous stats and crash reports are off unless you turn them on, and never include your prompts, replies or files. See what we share.

    GitHub stars License: MIT Google Play App Store Platform codecov Slack Pro


    BUILT BY


    Off Grid AI Pro

    A voice, personas, and actions. $119 for life, or $7.99/month.

    Pro is an optional, additive tier. It gives the assistant a voice that talks back, personas you shape, and the tools to draft real actions you approve. One license covers your phone and your Mac. All on-device.

    What Pro adds

    • Voice mode - the free app transcribes your speech; Pro adds on-device Kokoro text-to-speech, so it talks back and you run the whole thing hands-free. The voice runs in your phone's RAM.
    • Custom personas - give each assistant its own system prompt, voice, and persistent memory, so it stays in character across conversations.
    • Draft, then approve - connect Calendar, email, and MCP servers like Linear, Notion, and GitHub. It drafts the reply or files the ticket and waits. Nothing sends without your tap.
    • Personal Mesh sync - your phone and your Mac share chats, files, and settings over your own network. There is no relay. See the Personal Mesh guide.

    → Get Pro access - $119 once and it is yours forever (the price climbs as more people join, never down), or $7.99/month.

    Pair it with Off Grid AI Desktop on your Mac. One Pro license covers both.


    Not just another chat app

    Most "local LLM" apps give you a text chatbot and call it a day. Off Grid AI is a complete offline AI suite — text generation, image generation, vision AI, voice transcription, tool calling, and document analysis, all running natively on your phone's or Mac's hardware.


    What can it do?

    Text Generation — Run Qwen 3, Llama 3.2, Gemma 3, Phi-4, and any GGUF model. Streaming responses, thinking mode, markdown rendering, 15-30 tok/s on flagship devices. Bring your own .gguf files too.

    GPU & NPU Acceleration — Your phone has silicon sitting idle. Off Grid uses it. Adreno GPUs via OpenCL run 20-40 tok/s on a Snapdragon 8 Gen 2+, against 15-30 on CPU; Apple Silicon uses Metal. The app detects what your device has and defaults to the fastest backend that works, and you can override it in Settings. The Hexagon NPU (Snapdragon) is there too, marked experimental because it is — it only accelerates Q4_0 and Q8_0 quants, a K-quant silently falls back to CPU, and some model architectures come out garbled on it. Models that can actually use the GPU or NPU are badged in the model list, so you pick the right quant before you download 4GB.

    Remote LLM Servers — Connect to any OpenAI-compatible server on your local network (Ollama, LM Studio, LocalAI). Discover models automatically, stream responses via SSE, store API keys securely in the system keychain. Switch seamlessly between local and remote models.

    Tool Calling — Models that support function calling can use built-in tools: web search, calculator, date/time, device info, and knowledge base search. Automatic tool loop with runaway prevention. Clickable links in search results.

    Project Knowledge Base — Upload PDFs and text documents to a project's knowledge base. Documents are chunked, embedded on-device with a bundled MiniLM model, and retrieved via cosine similarity — all stored locally in SQLite. The search_knowledge_base tool is automatically available in project conversations.

    Image Generation — On-device Stable Diffusion with real-time preview. NPU-accelerated on Snapdragon (5-10s per image), Core ML on iOS. 20+ models including Absolute Reality, DreamShaper, Anything V5.

    Vision AI — Point your camera at anything and ask questions. SmolVLM, Qwen3-VL, Gemma 3n — analyze documents, describe scenes, read receipts. ~7s on flagship devices.

    Voice Input - On-device Whisper speech-to-text. Tap the microphone to start and stop, or use Auto and Hands-free modes. No audio ever leaves your phone.

    Document Analysis — Attach PDFs, code files, CSVs, and more to your conversations. Native PDF text extraction on both platforms.

    AI Prompt Enhancement — Simple prompt in, detailed Stable Diffusion prompt out. Your text model automatically enhances image generation prompts.

    Memory You Can See and Control — A phone has finite RAM, and a 4GB model does not politely share it. The model manager shows you what is resident right now and what each one is costing you in RAM, with a per-model eject. Model Loading picks the policy: Lean keeps one model in memory at a time, Balanced co-resides models that fit and swaps the ones that don't, Aggressive commits a larger share of RAM so bigger models load. If a load is refused, Load Anyway overrides it — your device, your call. When a model gets evicted mid-conversation, the chat says so and offers to bring it back rather than silently failing.

    Download Manager — Three downloads run at once, the rest FIFO-queue and show as Queued instead of quietly stalling. Pause, resume, retry, cancel. Downloads survive backgrounding the app.


    Performance

    TaskFlagshipMid-range
    Text generation (CPU)15-30 tok/s5-15 tok/s
    Text generation (GPU / OpenCL)20-40 tok/s—
    Image gen (NPU)5-10s—
    Image gen (CPU)~15s~30s
    Vision inference~7s~15s
    Voice transcriptionReal-timeReal-time

    Tested on Snapdragon 8 Gen 2/3, Apple A17 Pro. Results vary by model size and quantization.


    Install

    Or grab the latest APK from GitHub Releases.

    macOS: The iOS App Store version runs natively on Apple Silicon Macs via Mac Catalyst / iPad compatibility.

    Build from source

    git clone https://github.com/off-grid-ai/OGAM.git
    cd OGAM
    npm install
    
    # Android
    cd android && ./gradlew clean && cd ..
    npm run android
    
    # iOS
    cd ios && pod install && cd ..
    npm run ios
    

    Requires Node.js 20+, JDK 17 / Android SDK 36 (Android), Xcode 15+ (iOS). See full build guide.


    Testing

    CI codecov

    Tests run across three platforms on every PR:

    PlatformFrameworkWhat's covered
    React NativeJest + RNTLStores, services, components, screens, contracts
    AndroidJUnitLocalDream, DownloadManager, BroadcastReceiver
    iOSXCTestPDFExtractor, CoreMLDiffusion, DownloadManager
    npm test              # Run all tests (Jest + Android + iOS)
    

    This project is tested with BrowserStack.


    Documentation

    DocumentDescription
    Architecture & Technical ReferenceSystem architecture, design patterns, native modules, performance tuning
    Codebase GuideComprehensive code walkthrough
    Design philosophyThe one design philosophy for every Off Grid surface (Mobile profile included)

    Community

    Join the conversation on Slack — ask questions, share feedback, and connect with other Off Grid AI users and contributors.


    Contributing

    Contributions welcome! Fork, branch, PR. See development guidelines for code style and the codebase guide for patterns.


    Acknowledgments

    Built on the shoulders of giants: llama.cpp | whisper.cpp | llama.rn | whisper.rn | local-dream | ml-stable-diffusion | MNN | Hugging Face


    Star History

    Off Grid AI — Your AI, your device, your data.

    No cloud. Your chats and files never leave your device. Just AI that works anywhere.

    Join the Community on Slack