Off Grid AI — private, on-device AI. Run open models (text, vision, image, voice) locally through one OpenAI-compatible gateway. No cloud, no accounts, no API keys.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 915571e · analyzer v28 · 2d ago
skills & prompt files 2
- agent-rules off-grid-ai-OGAD-915571e/AGENTS.md
- agent-rules off-grid-ai-OGAD-915571e/CLAUDE.md
danger signals5
- suspicious endpoint docs.sentry.io (telemetry) off-grid-ai-OGAD-915571e/src/renderer/src/components/connectorCatalog.ts :374
docsUrl: 'https://docs.sentry.io/product/sentry-mcp/', - suspicious endpoint mcp.posthog.com (telemetry) off-grid-ai-OGAD-915571e/src/renderer/src/components/connectorCatalog.ts :484
url: 'https://mcp.posthog.com/sse', - suspicious endpoint posthog.com (telemetry) off-grid-ai-OGAD-915571e/src/renderer/src/components/connectorCatalog.ts :486
docsUrl: 'https://posthog.com/docs', - suspicious endpoint amplitude.com (telemetry) off-grid-ai-OGAD-915571e/src/renderer/src/components/connectorCatalog.ts :501
docsUrl: 'https://amplitude.com/docs', - suspicious endpoint developer.mixpanel.com (telemetry) off-grid-ai-OGAD-915571e/src/renderer/src/components/connectorCatalog.ts :516
docsUrl: 'https://developer.mixpanel.com/',
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 714
filesystem 50
- fs off-grid-ai-OGAD-915571e/electron.vite.config.ts :2
import { existsSync } from 'node:fs' - fs off-grid-ai-OGAD-915571e/packages/clipboard/dist/adapters/electron.js :36
var fs = __toESM(require("fs")); - fs off-grid-ai-OGAD-915571e/packages/clipboard/dist/adapters/electron.mjs :2
import * as fs from "fs"; - fs off-grid-ai-OGAD-915571e/packages/clipboard/src/adapters/electron.ts :6
import * as fs from 'fs' - fs off-grid-ai-OGAD-915571e/packages/models/dist/adapters/node.js :36
var import_fs = __toESM(require("fs")); - fs off-grid-ai-OGAD-915571e/packages/models/dist/adapters/node.mjs :2
import fs from "fs"; - fs off-grid-ai-OGAD-915571e/packages/models/src/adapters/node.ts :5
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/resources/tts-worker.mjs :14
import fs from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/active-models.ts :6
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/artifacts.ts :8
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/data-privacy.ts :5
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/database.ts :6
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/dev-seed.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/diagnostics-log.ts :1
import fs from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/downloaded-models.ts :12
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/files.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/imagegen.ts :8
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/imagegen/owned-path.ts :1
import fs from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/index.ts :3
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/ipc.ts :1438
const file = fs.createWriteStream(destPath) - fs off-grid-ai-OGAD-915571e/src/main/kill-orphan-port.ts :10
import { existsSync } from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/licensing/device-fingerprint.ts :15
import { existsSync, readFileSync, writeFileSync } from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/licensing/license-service.ts :19
import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/llm.ts :6
import * as fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/mcp-oauth.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/mcp-server.ts :12
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/media-range.ts :5
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/media-server.ts :8
// Node's `fs.createReadStream(...).pipe(res)` is the battle-tested path every video - fs off-grid-ai-OGAD-915571e/src/main/mflux.ts :9
import * as fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/model-server.ts :24
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/models-manager.ts :5
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/models/download-pump.ts :11
import type fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/models/download-verify.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/ocr.ts :7
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/ogcapture-serve.ts :3
import fs from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/preload-path.ts :2
import { existsSync } from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/rag-ipc.ts :5
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/rag/extractors.ts :2
// text/code -> fs.readFile - fs off-grid-ai-OGAD-915571e/src/main/renderer-path.ts :2
import { existsSync } from 'node:fs' - fs off-grid-ai-OGAD-915571e/src/main/runtime-env.ts :11
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/sd-server.ts :22
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/skills.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/tools.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/transcription/bin-resolution.ts :6
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/transcription/parakeet-cli.ts :13
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/transcription/whisper-cli.ts :9
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/transcription/whisper-server.ts :21
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/tts.ts :13
import fs from 'fs' - fs off-grid-ai-OGAD-915571e/src/main/vision.ts :3
import * as fs from 'fs' - fs off-grid-ai-OGAD-915571e/vitest.config.ts :2
import { existsSync } from 'fs'
shell / exec 16
- shell off-grid-ai-OGAD-915571e/packages/clipboard/dist/adapters/electron.js :38
var import_child_process = require("child_process"); - shell off-grid-ai-OGAD-915571e/packages/clipboard/dist/adapters/electron.mjs :4
import { execSync } from "child_process"; - shell off-grid-ai-OGAD-915571e/packages/clipboard/src/adapters/electron.ts :8
import { execSync } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/imagegen.ts :6
import { spawn, type ChildProcess } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/kill-orphan-port.ts :9
import { execSync } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/llm.ts :1
import { spawn, execSync, ChildProcess } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/mflux.ts :7
import { spawn, ChildProcess } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/ocr.ts :4
import { execFile } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/rag/extractors.ts :11
import { execFile } from 'node:child_process' - shell off-grid-ai-OGAD-915571e/src/main/sd-server.ts :20
import { spawn, type ChildProcess, execSync } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/settings-store.ts :7
exec(sql: string): unknown - shell off-grid-ai-OGAD-915571e/src/main/transcription/parakeet-cli.ts :11
import { execFile } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/transcription/whisper-cli.ts :7
import { execFile } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/transcription/whisper-server.ts :19
import { spawn, type ChildProcess, execSync } from 'child_process' - shell off-grid-ai-OGAD-915571e/src/main/tts.ts :11
import { spawn, type ChildProcess } from 'child_process' - shell off-grid-ai-OGAD-915571e/vitest.config.ts :106
// Cross-platform orphan-port reaper: execSync(netstat/lsof/tasklist/ps) + process.kill
network 27
- net off-grid-ai-OGAD-915571e/packages/models/dist/adapters/node.js :65
const res = await fetch(url, { headers, signal: opts.signal }); - net off-grid-ai-OGAD-915571e/packages/models/dist/adapters/node.mjs :31
const res = await fetch(url, { headers, signal: opts.signal }); - net off-grid-ai-OGAD-915571e/packages/models/dist/index.js :1376
var defaultFetch = (url, init) => fetch(url, init); - net off-grid-ai-OGAD-915571e/packages/models/dist/index.mjs :1312
var defaultFetch = (url, init) => fetch(url, init); - net off-grid-ai-OGAD-915571e/packages/models/src/adapters/node.ts :2
// (HTTP Range) and progress. Uses global fetch (Node 18+/Electron). RN supplies - net off-grid-ai-OGAD-915571e/packages/models/src/hf.ts :36
const defaultFetch: FetchLike = (url, init) => fetch(url, init) as unknown as ReturnType<FetchLike> - net off-grid-ai-OGAD-915571e/packages/models/src/providers.ts :58
const defaultFetch: FetchLike = (url, init) => fetch(url, init) as unknown as Promise<FetchResponse> - net off-grid-ai-OGAD-915571e/src/main/free-port.ts :7
import net from 'node:net' - net off-grid-ai-OGAD-915571e/src/main/imagegen.ts :249
const res = await fetch(url) // Electron main = Node 18+, follows redirects (HF → CDN) - net off-grid-ai-OGAD-915571e/src/main/index.ts :238
// (net.fetch(file://) sidesteps this but doesn't honour Range, so seeking is dead.) - net off-grid-ai-OGAD-915571e/src/main/licensing/keygen-client.ts :82
return await fetch(`${KEYGEN_API_BASE}${path}`, init) - net off-grid-ai-OGAD-915571e/src/main/llm.ts :881
const res = await fetch(`http://127.0.0.1:${this.port}/health`) - net off-grid-ai-OGAD-915571e/src/main/llm/http-post.ts :12
import * as http from 'http' - net off-grid-ai-OGAD-915571e/src/main/llm/stream.ts :8
import http from 'http' - net off-grid-ai-OGAD-915571e/src/main/mcp-oauth-loopback.ts :1
import http from 'http' - net off-grid-ai-OGAD-915571e/src/main/mcp-server.ts :10
import http from 'http' - net off-grid-ai-OGAD-915571e/src/main/media-server.ts :14
import http from 'http' - net off-grid-ai-OGAD-915571e/src/main/model-server.ts :22
import http from 'http' - net off-grid-ai-OGAD-915571e/src/main/model-server/proxy-response.ts :1
import type http from 'node:http' - net off-grid-ai-OGAD-915571e/src/main/models-manager.ts :264
const res = await fetch(file.url, { - net off-grid-ai-OGAD-915571e/src/main/ogcapture-serve.ts :21
* failed load and resets the player to 0:00. (net.fetch(file://) sidesteps this but - net off-grid-ai-OGAD-915571e/src/main/sd-server.ts :200
/** fetch() to the resident server, but a REJECTION (server died mid-job) is re-thrown - net off-grid-ai-OGAD-915571e/src/main/setup.ts :10
import * as http from 'http' - net off-grid-ai-OGAD-915571e/src/main/tools.ts :72
const res = await fetch(u, { headers: { 'User-Agent': 'Mozilla/5.0' } }) - net off-grid-ai-OGAD-915571e/src/main/transcription/whisper-server.ts :232
const res = await fetch(`${this.base()}/`) - net off-grid-ai-OGAD-915571e/src/renderer/src/components/VoiceBubble.tsx :74
const res = await fetch(url) - net off-grid-ai-OGAD-915571e/src/renderer/src/components/setup/StoragePanel.tsx :204
// A companion-only fetch (e.g. adding a vision projector to a model
install hooks 2
- prepare off-grid-ai-OGAD-915571e/package.json :11
git config core.hooksPath scripts/hooks || true - postinstall off-grid-ai-OGAD-915571e/package.json :29
electron-builder install-app-deps
declared dependencies 78
- @modelcontextprotocol/sdk@^1.29.0
- @dnd-kit/core@^6.3.1
- @dnd-kit/sortable@^10.0.0
- @electron-toolkit/preload@^3.0.2
- @electron-toolkit/utils@^4.0.0
- @lancedb/lancedb@^0.30.0
- @offgrid/clipboard@file:./packages/clipboard
- @offgrid/design@file:./packages/design
- @offgrid/models@file:./packages/models
- @offgrid/rag@file:./packages/rag
- @phosphor-icons/react@^2.1.10
- @scure/bip39@^2.2.0
- @tabler/icons-react@^3.36.1
- @tailwindcss/vite@^4.1.18
- @xenova/transformers@^2.17.2
- apache-arrow@^18.1.0
- async-mutex@^0.5.0
- better-sqlite3@^12.6.2
- better-sqlite3-multiple-ciphers@^12.11.1
- class-variance-authority@^0.7.1
- clsx@^2.1.1
- cmdk@^1.1.1
- electron-updater@^6.8.9
- get-windows@^9.3.0
- hash-wasm@^4.12.0
- jszip@^3.10.1
- kdbxweb@^2.1.1
- kokoro-js@^1.2.1
- mammoth@^1.8.0
- mdast-util-to-string@^4.0.0
- motion@^12.27.1
- node-machine-id@^1.1.12
- ollama@^0.6.3
- pdf-parse@^1.1.1
- radix-ui@^1.6.0
- react-markdown@^10.1.0
- react-resizable-panels@^2.1.9
- remark-breaks@^4.0.0
- remark-gfm@^4.0.0
- remark-parse@^11.0.0
- sharp@^0.35.2
- tailwind-merge@^3.4.0
- unified@^11.0.5
- @electron-toolkit/eslint-config-prettier@^3.0.0
- @electron-toolkit/eslint-config-ts@^3.1.0
- @electron-toolkit/tsconfig@^2.0.0
- @electron/asar@3.4.1
- @playwright/test@^1.61.1
- @testing-library/react@^16.3.2
- @testing-library/user-event@^14.6.1
- @types/better-sqlite3@^7.6.13
- @types/node@^22.19.1
- @types/react@^19.2.7
- @types/react-dom@^19.2.3
- @vitejs/plugin-react@^5.1.1
- @vitest/coverage-v8@^4.1.10
- autoprefixer@^10.4.23
- dependency-cruiser@^18.0.0
- electron@^39.2.6
- electron-builder@26.15.3
- electron-vite@^5.0.0
- eslint@^9.39.1
- eslint-plugin-react@^7.37.5
- eslint-plugin-react-hooks@^7.0.1
- eslint-plugin-react-refresh@^0.4.24
- eslint-plugin-sonarjs@^4.1.0
- jsdom@^29.1.1
- knip@^6.25.0
- postcss@^8.5.6
- prettier@^3.7.4
- react@^19.2.1
- react-dom@^19.2.1
- tailwindcss@^4.1.18
- typescript@^5.9.3
- typescript-eslint@^8.63.0
- vite@^7.2.6
- vitest@^4.0.17
- github.com/apple/ml-stable-diffusion@1.1.0
transport_posture 1
- network-listening, binds all interfaces, no auth detected off-grid-ai-OGAD-915571e/src/main/__tests__/image-runtime-reliability.integration.dbtest.ts :199
probe.listen(port, '0.0.0.0', () => probe.close(() => resolve(true)))