{"id":50405489,"url":"https://github.com/emretheus/inclave","last_synced_at":"2026-05-31T01:13:30.187Z","repository":{"id":357167557,"uuid":"1160958957","full_name":"emretheus/inclave","owner":"emretheus","description":"Local-first AI assistant for macOS — chat with your PDFs, spreadsheets, CSVs and code using a local LLM via Ollama. Model-generated Python runs in a Seatbelt sandbox with no network. No cloud, no telemetry, no API keys.","archived":false,"fork":false,"pushed_at":"2026-05-11T15:33:39.000Z","size":3644,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-11T17:29:59.745Z","etag":null,"topics":["ai-assistant","chatbot","cli","llm","local-first","local-llm","macos","offline-ai","ollama","pdf-chat","privacy","python","rag","sandbox","seatbelt"],"latest_commit_sha":null,"homepage":"https://github.com/emretheus/inclave","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emretheus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-18T15:17:14.000Z","updated_at":"2026-05-11T15:40:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/emretheus/inclave","commit_stats":null,"previous_names":["emretheus/inclave"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/emretheus/inclave","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emretheus%2Finclave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emretheus%2Finclave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emretheus%2Finclave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emretheus%2Finclave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emretheus","download_url":"https://codeload.github.com/emretheus/inclave/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emretheus%2Finclave/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33715896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-assistant","chatbot","cli","llm","local-first","local-llm","macos","offline-ai","ollama","pdf-chat","privacy","python","rag","sandbox","seatbelt"],"created_at":"2026-05-31T01:13:28.611Z","updated_at":"2026-05-31T01:13:30.181Z","avatar_url":"https://github.com/emretheus.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# InClave — your local AI assistant, in one CLI\n\n\u003e A **local-first, privacy-first AI assistant** for macOS. Talk to your PDFs,\n\u003e spreadsheets, CSVs, and code with a **local LLM via Ollama** — and let the\n\u003e model run Python code in a **Seatbelt sandbox** with no network access.\n\u003e No cloud, no telemetry, no API keys, no data leaves your machine.\n\n[![CI](https://github.com/emretheus/inclave/actions/workflows/ci.yml/badge.svg)](https://github.com/emretheus/inclave/actions/workflows/ci.yml)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n[![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org/downloads/)\n[![macOS](https://img.shields.io/badge/platform-macOS-lightgrey.svg)]()\n\n![demo](demo-data/demo.gif)\n\n---\n\n## Install\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/emretheus/inclave/master/install.sh | sh\n```\n\nThen just:\n\n```bash\ninclave\n```\n\nThat's it. On first run, InClave starts the Ollama daemon for you, lets you\npick a model from a curated list (`llama3.2`, `llama3.1:8b`,\n`qwen2.5-coder:7b`, or your own), pulls it, and drops you into a chat.\n\n\u003e **Requires:** macOS, Python 3.12+. Ollama is auto-detected; if missing the\n\u003e CLI tells you to `brew install ollama`.\n\n## What it does\n\n- **Local LLM via [Ollama](https://ollama.com/)** — every prompt and response\n  stays on `127.0.0.1`. No API keys, no rate limits, no usage caps.\n- **Native macOS sandbox** ([Seatbelt](https://en.wikipedia.org/wiki/Seatbelt_(software)))\n  — model-generated Python runs in a jail with **no network**, locked to a\n  single read/write directory, with CPU/memory/wall-clock limits.\n- **A workspace of your files** the model can read — PDF, Excel, CSV, Markdown,\n  text, and source code. Originals are never modified; only content-hashed\n  copies live under `~/.inclave/`.\n- **Drop a file, ask a question.** Drag any file from Finder onto the chat\n  prompt — it's attached automatically. Add a question on the same line to\n  send everything in one shot.\n\n## Quick demo\n\n````text\n$ inclave\n●  inclave  qwen2.5-coder:7b  workspace: 0 files  workdir: ~/Downloads\n\n›  ~/Downloads/mrr_2026.csv  print total mrr_usd growth in %\n\n  + mrr_2026.csv  (added)\n\n  ```python\n  import pandas as pd\n  df = pd.read_csv(\"mrr_2026.csv\")\n  total = (df[\"mrr_usd\"].iloc[-1] - df[\"mrr_usd\"].iloc[0]) / df[\"mrr_usd\"].iloc[0] * 100\n  print(f\"Total MRR_USD growth: {total:.2f}%\")\n  ```\n\n  ╭──────────── stdout ────────────╮\n  │ Total MRR_USD growth: 96.06%\n  ╰────────────────────────────────╯\n  ran · exit 0 · 1.2s\n\n  MRR_USD grew by approximately 96 % from September to April.\n````\n\nThe python block ran **automatically** in a temporary sandbox: no network,\nno escape to `~/.ssh`, output fed back to the model so the summary is\ngrounded in real stdout — not a prediction.\n\n## Why InClave?\n\nCloud AI wants your files. Letting an LLM run code on your laptop is\nconvenient *and* dangerous. InClave keeps the model local and sandboxes\nthe execution — an **offline AI code interpreter** that respects your\nfilesystem.\n\n## Inside the chat\n\n- **Python blocks auto-run** in the sandbox; the model reads its own\n  stdout and writes the follow-up.\n- **Drop a path** from Finder, with or without a question on the same line.\n- `/help` `/run` `/setup` `/model` `/save` `/files` `/clear` `/reset` —\n  see `/help` for full descriptions.\n\nSessions autosave after every reply. Resume the last with\n`inclave chat --resume`; `inclave sessions list` shows everything saved.\n\n## Supported file types\n\n| Type   | Extensions                                        | Notes                                |\n|--------|---------------------------------------------------|--------------------------------------|\n| Text   | `.txt` `.md`                                      | Read as-is                           |\n| Tables | `.csv`                                            | First 1,000 rows as markdown         |\n| Excel  | `.xlsx` `.xls`                                    | Each sheet as markdown               |\n| PDF    | `.pdf`                                            | Text via `pypdf`                     |\n| Code   | `.py .js .ts .go .rs .java .sh .sql .json .yaml`… | Fenced as source                     |\n\nLimits: 5 files / 200 KB total / 100 KB per file. Excess is truncated.\n\n## Privacy contract\n\n- Talks only to `127.0.0.1:11434` (local Ollama). CI guard rejects any\n  non-localhost URL in production code.\n- Sandbox profile blocks network, denies file I/O outside the run dir,\n  enforces CPU / memory / wall-clock rlimits.\n- Workspace files live at `~/.inclave/workspaces/default/` as content-\n  hashed copies. `inclave files clear` or `rm -rf ~/.inclave` wipes them.\n- No telemetry, no analytics, no auto-update. Logs are off by default;\n  `--debug` writes operational events only — **never** message content.\n\n## Configuration\n\n`~/.inclave/config.json` — edit by hand or with `inclave config set \u003ckey\u003e \u003cvalue\u003e`:\n\n| Key                    | Default | Purpose                                     |\n|------------------------|---------|---------------------------------------------|\n| `default_model`        | `null`  | Model used when `--model` isn't passed      |\n| `sandbox_cpu_seconds`  | `30`    | CPU time limit per sandbox run              |\n| `sandbox_memory_mb`    | `512`   | Memory limit per sandbox run                |\n\nGlobal flags: `--debug` (operational logs only) and `--no-color`\n(also via `NO_COLOR=1`).\n\n## Status \u0026 platform\n\n`v0.1`, macOS only — the sandbox depends on Seatbelt (`sandbox-exec`).\nCore flow is stable; APIs may still change.\n\n## Roadmap\n\n- [ ] **Linux support** via [`bubblewrap`](https://github.com/containers/bubblewrap).\n      Same policy (no network, single read/write directory, rlimits),\n      different backend behind the same `inclave_sandbox.api` contract.\n- [ ] **Windows support** via the WSL2 Linux backend, or — longer term —\n      a native sandbox using AppContainer / Job Objects. Tracking issue\n      welcome.\n- [ ] Image attachments (drag a PNG into the prompt, send to a\n      vision-capable local model).\n- [ ] Per-project sandbox profile overrides (allow specific paths /\n      domains for the rare workflow that legitimately needs them).\n- [ ] Better long-context handling for big PDFs (chunking + retrieval\n      across pages instead of the current 100 KB truncate).\n\n## Manual install\n\nDon't want to pipe `curl` into `sh`?\n\n```bash\nbrew install ollama \u0026\u0026 ollama serve \u0026\ngit clone https://github.com/emretheus/inclave.git \u0026\u0026 cd inclave\nuv tool install --from packages/cli inclave-cli\n```\n\n## Development\n\n```bash\nuv sync --all-packages --all-extras\nuv run pytest                   # 170+ tests\nuv run ruff check . \u0026\u0026 uv run ruff format --check .\nuv run mypy packages shared     # strict\n```\n\nA [`uv`](https://docs.astral.sh/uv/) workspace: `packages/cli` (Typer +\nREPL), `packages/ollama` (inference), `packages/sandbox` (Seatbelt\nexecutor), `shared/inclave_core` (config, sessions, logging).\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) — issues for non-trivial changes,\ntests required, CI gates lint / format / type-check / coverage / the\nno-outbound-HTTP guard.\n\n## Authors\n\nBuilt by:\n\n- **Emre Ulgac**\n- **Emre Kocyigit**\n- **Ibrahim Furkan Gulcan**\n\nSee the [contributors page](https://github.com/emretheus/inclave/graphs/contributors)\nfor everyone who has contributed.\n\n## License\n\nApache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femretheus%2Finclave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femretheus%2Finclave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femretheus%2Finclave/lists"}