github TypeScript analyzed 915571e

off-grid-ai/off-grid-ai-desktop

github

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.

maintainer
off-grid-ai
license
AGPL-3.0
first seen
2026-06-30
last seen
2026-07-09
releases · 30d
5
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport stdio · streamable-http · http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
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

danger signals5

code evidence vv0.0.39-beta.61 · github-tarball
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)))