What OpenKnowledge writes to your system
Every file OpenKnowledge creates or changes — when, where, in-project vs. your home directory — plus the opt-outs and what leaves your machine (nothing by default).
OpenKnowledge keeps your knowledge base as plain markdown in your own project directory, but the tooling around it — the CLI, the MCP server, and the desktop app — also writes a handful of supporting files, some of them outside the project, in your home directory, your shell startup files, your editors' configs, and the OS credential store.
This page lists every one of them: when each write happens, what it is, and where it is written.
The short version
Nothing about your content leaves your machine by default. Diagnostic logs and telemetry stay on your machine. The things that can send data off it — semantic search, a diagnostic or bug-report bundle, and GitHub sync — are opt-in or on-demand. Three automatic exceptions, none of which touch your documents: the desktop app checks for updates (sending its app version and channel), on its first launch it opens your browser once to check for a pending share link, and installing a published skill reports that install to skills.sh so the skill's public install count is accurate — the skill's name and source repository, once per skill (per project, for a skill installed into a project), and never for a private or local source. All of them are listed under What leaves your machine, and the skill report can be turned off.
How to read this page
Writes fall into two buckets, and each table's Scope column tells you which:
- In-project — inside your project folder. Either committed (shared through git with your team) or gitignored (this machine only, under
.ok/local/or.git/). - Outside-project — your home directory (
~/.ok/,~/Library/...), your shell startup files (~/.zshrcand friends), your editors' user-level configs, or the OS credential store.
OpenKnowledge installs one of two ways, and the footprint differs a little between them. Pick yours below — each tab lists the complete set of writes for that path. The opt-outs and what leaves your machine at the end apply to both.
Installing and launching the app
The macOS app ships as a signed .dmg you drag into /Applications. On launch it writes app-level state and logs, and — because a .dmg app can't put a CLI on your PATH on its own — first launch asks, in one dialog, whether to register the MCP server with your AI editors and whether to add ok to your shell's PATH (both covered below, both with your consent).
| Path | What it is | Scope |
|---|---|---|
~/Library/Application Support/OpenKnowledge/state.json | Recent projects, window/view state, update channel | Outside-project (home dir) |
~/Library/Application Support/OpenKnowledge/path-install.json | Records the PATH/shell changes it made and your PATH-consent choice, so they can be reverted | Outside-project (home dir) |
~/.ok/logs/desktop.<date>.log | Desktop app + renderer log | Outside-project (home dir) |
~/.ok/mcp-status.json | Records your first-launch MCP-setup consent choice | Outside-project (home dir) |
~/Library/Caches/OpenKnowledge-updater/ | Staged auto-update downloads (electron-updater) | Outside-project (home dir) |
~/Library/Caches/com.inkeep.open-knowledge.ShipIt/ | Install log of the macOS update helper (Squirrel's ShipIt), which swaps the app bundle after the app has quit. The only record of why an update failed to install, so a bug report you send collects it — only this app's, never those of other applications that use the same update mechanism | Outside-project (home dir) |
~/Library/Application Support/OpenKnowledge/Crashpad/ | Native crash minidumps, written by the OS crash handler (Electron's Crashpad) if the app ever crashes. Local-only: the crash reporter runs with uploadToServer: false, so no dump is ever uploaded automatically | Outside-project (home dir) |
~/Library/Application Support/OpenKnowledge/bug-report-dirty-shutdown.json | Dirty-shutdown sentinel — written on every launch, refreshed as it runs, and removed on a clean quit. The next launch reads it to tell an app crash (prompts you) from the machine ending the session — a reboot, an OS shutdown, or dying asleep (suppressed and logged instead) | Outside-project (home dir) |
~/Library/Application Support/OpenKnowledge/bug-report-crash-acks.json | Records which crash-report invitations you already answered or dismissed, so the same crash never re-prompts | Outside-project (home dir) |
The app registers the openknowledge:// URL scheme (for deep links) and checks for updates — on launch and periodically while it runs — against the OpenKnowledge update service at openknowledge.ai/updates, which redirects to the GitHub release asset and counts the update per version and channel (falling back to GitHub directly if it's unreachable). An update on your channel downloads in the background and installs on the next quit; you can also check on demand from Check for updates… in the app and Help menus. The channel (stable or beta) is fixed by the build you installed — switch by reinstalling the other from openknowledge.ai/download/stable or /download/beta. Override the feed with OK_UPDATER_FEED_URL.
On its first launch the app also opens your default browser once to openknowledge.ai/continue, to check whether you installed from a share link and redeem it if so; the exchange completes over a short-lived local loopback listener.
Shell and PATH
So ok can work in your terminal too, the packaged app manages a PATH shim. This is macOS-only, packaged-build-only, and disabled by OK_RECLAIM_DISABLE=1. It never uses sudo, never runs an admin prompt, and never installs a login item.
The first two rows below live in OpenKnowledge's own ~/.ok/ directory and are maintained automatically. The third — the only write into files OpenKnowledge doesn't own — happens only with your consent: the first-launch dialog has an "Add the ok command to your terminal" toggle (checked by default), and nothing is written to your shell config if you uncheck it.
| Path | What it is | Scope |
|---|---|---|
~/.ok/bin/ok, ~/.ok/bin/open-knowledge | Symlinks to the CLI bundled inside the app | Outside-project (home dir) |
~/.ok/env.sh | A managed shim that prepends ~/.ok/bin to your PATH | Outside-project (home dir) |
~/.zshrc, ~/.bash_profile, ~/.config/fish/conf.d/open-knowledge.fish | A fenced managed block that sources ~/.ok/env.sh — written only if you consent in the first-launch dialog | Outside-project (shell config) |
If you decline, only ok typed in an external terminal (Terminal, iTerm) is affected — the app's built-in terminal, the MCP server, and the "Open with AI" launches all work without it. You can add it later from File → Set up OpenKnowledge integrations…. Machines that already had the block from a version before the consent dialog are treated as consented: the block is left in place and maintained.
The managed block is clearly fenced so you can see and remove it:
# >>> open-knowledge cli >>>
# ! Contents within this block are managed by OpenKnowledge. Do not edit.
# ! Delete this whole block to opt out — OpenKnowledge will not re-add it.
[ -f "$HOME/.ok/env.sh" ] && . "$HOME/.ok/env.sh"
# <<< open-knowledge cli <<<Delete the block and the app won't re-add it — the removal is recorded and respected. Or set OK_RECLAIM_DISABLE=1 to disable all of this before first launch.
User-global Agent Skills
OpenKnowledge ships two user-global Agent Skills — open-knowledge-discovery (helps your coding agent recognize and route through OpenKnowledge projects) and open-knowledge-write-skill (a workflow for authoring new skills). They install into each detected editor's global skill folder (~/.claude/skills/, ~/.cursor/skills/, ~/.codex/skills/, ~/.opencode/skills/) plus the shared ~/.agents/skills/ hub.
These are consent-gated, one checkbox per skill in the same first-launch dialog (both checked by default). Uncheck one and it is never installed; uncheck an already-installed one and its copies are removed. The choice is recorded in ~/.ok/skill-state.yml and honored by every install path — the desktop app, ok init, and ok start — so a skill you declined is never re-added. Machines that already had the skills before the consent dialog are treated as consented (left in place). Re-enable later from File → Set up OpenKnowledge integrations….
Setting up a project
When you initialize or open a project, the app scaffolds the same project files the CLI's ok init creates, and registers the open-knowledge MCP server with the AI editors it detects. The MCP registration is surgical — it adds only its own entry and leaves your other settings, comments, and formatting byte-for-byte intact.
| Path | What it is | Scope |
|---|---|---|
.ok/, .ok/config.yml | Project directory and its config | In-project, committed |
.ok/.gitignore | Keeps machine-local runtime state (local/, principal.json, server.lock, …) out of git | In-project, committed |
.okignore | Paths excluded from the editor, search, and agents — see Ignore patterns | In-project, committed |
.mcp.json, .cursor/mcp.json, .codex/config.toml, opencode.json | Project-scoped MCP registration for the four MCP-capable project editors (Claude, Cursor, Codex, OpenCode), written regardless of what's installed so the repo is ready for teammates | In-project, committed |
.pi/extensions/open-knowledge.ts | Managed bridge extension connecting Pi (which has no MCP support) to the project | In-project, committed |
.claude/skills/, .cursor/skills/, .codex/skills/, .github/skills/, .opencode/skills/, .pi/skills/ | Project-local "rich" OpenKnowledge skill (SKILL.md) for Claude, Cursor, Codex, GitHub Copilot, OpenCode, and Pi | In-project, committed |
.ok/skills-lock.json | Provenance for imported skills — source, selected skill, commit/ref when available, content hash, publisher, and import time | In-project, committed |
~/.claude.json, ~/Library/Application Support/Claude/claude_desktop_config.json, ~/.cursor/mcp.json, ~/.codex/config.toml, ~/.copilot/mcp-config.json, ~/.config/opencode/opencode.json, ~/.openclaw/openclaw.json, ~/.gemini/config/mcp_config.json, ~/.lmstudio/mcp.json, ~/.hermes/config.yaml | User-level open-knowledge MCP registration, one per detected editor, so it's available in every project (~/.copilot/mcp-config.json only when ~/.copilot/ exists; ~/.openclaw/openclaw.json only when ~/.openclaw/ exists; ~/.gemini/config/mcp_config.json is Antigravity's shared IDE + agy config, only when ~/.gemini/ exists; ~/.lmstudio/mcp.json and ~/.hermes/config.yaml only when those apps are installed) | Outside-project (editor config) |
While a project is open
The app runs a collaboration server for the open project. It writes runtime state, gitignored under .ok/local/, plus a shadow git repo that powers the timeline and recovery features:
| Path | What it is | Scope |
|---|---|---|
.ok/local/server.lock (and .ok/local/ui.lock on the legacy --ui-port path) | Advertise the running server's URL; ok start now serves the UI from the same server, so ui.lock is written only by the deprecated sibling path | In-project, gitignored |
.ok/local/principal.json | Your local identity (id, email) for edit attribution | In-project, gitignored |
.ok/local/sync-state.json, .ok/local/conflicts.json | GitHub-sync engine state | In-project, gitignored |
.ok/local/state.json, .ok/local/last-spawn-error.log | State-schema manifest and the UI sibling's error log | In-project, gitignored |
.ok/local/telemetry/spans-*.jsonl | Local diagnostic spans, rotated at ~50 MB | In-project, gitignored |
.ok/local/logs/server-*.jsonl | Local server logs, rotated at ~25 MB | In-project, gitignored |
.ok/local/cache/<branch>/backlinks.json | Backlink-graph cache | In-project, gitignored |
.ok/local/installed-skills.json | Per-project skill-install markers (which editors each skill is projected into) | In-project, gitignored |
.ok/worktrees/<branch>/ | Git worktree checkout created when you open a branch in its own window (project switcher); the path is also added to .git/info/exclude | In-project, gitignored |
.git/ok/ — or .git/worktrees/<name>/ok/ in a linked worktree, or the enclosing repo's .git/ok-<slug>/ when your project is a subfolder of a larger repo | Shadow git repo holding per-writer work-in-progress refs; always inside a git admin dir, never in your content tree | In-project, gitignored (inside .git/) |
Diagnostic logs and telemetry are on by default but local-only — credential-bearing attributes are redacted ([REDACTED]) before anything is written, the files rotate at the size caps above, and nothing leaves the machine until you explicitly run ok diagnose bundle. Turn the local sink off with telemetry.localSink.enabled: false; see Configuration.
On each launch and project open, the app also runs repair sweeps: it rewrites existing open-knowledge MCP entries (in the editor configs above) to the current canonical form, and seeds the built-in OpenKnowledge skill bundles (open-knowledge-discovery and open-knowledge-write-skill, in ~/.agents/skills/ and each detected editor's ~/.claude/skills/, ~/.cursor/skills/, ~/.codex/skills/, ~/.opencode/skills/) only when they are missing — an existing copy is left untouched (updates to a built-in flow through the skills.sh "update available" path, never a force-refresh). It also removes any stale open-knowledge-ui entry left in .claude/launch.json by an older OK version. It never adds an MCP entry to an editor that doesn't already have one. Same OK_RECLAIM_DISABLE=1 opt-out.
Home directory and credentials (~/.ok/)
| Path | What it is | Sensitive? |
|---|---|---|
~/.ok/global.yml | User-global config (applies to every project) | No |
~/.ok/secrets.yml | Embeddings provider API key for semantic search, if you set one. Written 0600; never in config.yml | Yes (0600) |
~/.ok/auth.yml | Auth-token fallback, used only when the Keychain is unavailable. Written 0600 | Yes (0600) |
~/.ok/skill-state.yml, ~/.ok/skill-install-events.jsonl | Skill-install bookkeeping | No |
~/.agents/skills/<name>/, ~/.claude/skills/<name>/, … | Your global-scope skills, versioned in place in your home editor dirs (kept by ok uninstall unless --purge-content) | No |
~/.ok/stats.jsonl | Local "open with AI" handoff stats — local-only, no phone-home | No |
~/.ok/mcp-status.json | First-launch MCP consent record | No |
~/.ok/logs/, ~/.ok/bug-reports/ | Desktop and CLI logs, and bug-report bundles from ok bug-report and the app's Help → Report a bug… dialog (ok diagnose bundle writes into the project, under .ok/local/diagnostics/) | No |
~/.ok/bin/, ~/.ok/env.sh | PATH shim (see Shell and PATH above) | No |
Auth tokens (for GitHub sync, sharing, and cloning) are stored in the macOS Keychain under the service name open-knowledge. The ~/.ok/auth.yml file is only a fallback for headless environments where the Keychain isn't reachable; when the Keychain becomes available, the token is migrated into it and the file copy is removed.
The Install for Claude Chat & Cowork command (command palette or Help menu) builds ~/Downloads/openknowledge.skill on demand and hands it to Claude Desktop for upload; the build is version-gated via ~/.ok/skill-state.yml.
Installing the package
Installing @inkeep/open-knowledge from npm (or invoking it with npx) drops the two CLI binaries plus a bundled native addon. Nothing is written to your home directory at install time — no lifecycle scripts run, and no skills are registered until you run ok init.
| Path | What it is | Scope |
|---|---|---|
ok, open-knowledge (on your PATH) | The two CLI binaries (identical entry point) | Outside-project (npm global/bin) |
<pkg>/dist/native/ | Bundled native TOML-editing addon, shipped inside the package | Outside-project (package dir) |
Opt out
Installing the package writes nothing outside its own directory, so there is nothing to opt out of here. The user-global skills are installed by ok init, and ok init --no-skills skips installing them for that run.
ok init
ok init turns a folder into an OpenKnowledge project. It scaffolds the project's .ok/ directory, and — unless you pass --no-mcp — registers the open-knowledge MCP server with the AI editors it detects. The MCP registration is surgical: it adds only its own entry and leaves your other settings, comments, and formatting byte-for-byte intact (if a config can't be parsed safely, it's left untouched and reported).
| Path | What it is | Scope |
|---|---|---|
.ok/, .ok/config.yml | Project directory and its config | In-project, committed |
.ok/.gitignore | Keeps machine-local runtime state (local/, principal.json, server.lock, …) out of git | In-project, committed |
.okignore | Paths excluded from the editor, search, and agents — see Ignore patterns | In-project, committed |
.gitignore (project root) | Seeded (with .DS_Store) only when ok init creates a new git repo | In-project, committed |
.mcp.json, .cursor/mcp.json, .codex/config.toml, opencode.json | Project-scoped MCP registration for the four MCP-capable project editors (Claude, Cursor, Codex, OpenCode) regardless of what's installed — prepares the repo for teammates (with --scope project or both) | In-project, committed |
.pi/extensions/open-knowledge.ts | Managed bridge extension connecting Pi (which has no MCP support) to the project | In-project, committed |
.claude/skills/, .cursor/skills/, .codex/skills/, .github/skills/, .opencode/skills/, .pi/skills/ | Project-local "rich" OpenKnowledge skill (SKILL.md) for Claude, Cursor, Codex, GitHub Copilot, OpenCode, and Pi | In-project, committed |
.ok/skills-lock.json | Provenance for imported skills — source, selected skill, commit/ref when available, content hash, publisher, and import time | In-project, committed |
With --scope user or both (the default), ok init also registers the open-knowledge MCP server in each detected editor's user-level config, so it's available in every project:
| Path | Editor | Scope |
|---|---|---|
~/.claude.json | Claude Code | Outside-project (editor config) |
~/Library/Application Support/Claude/claude_desktop_config.json | Claude Desktop | Outside-project (editor config) |
~/.cursor/mcp.json | Cursor | Outside-project (editor config) |
~/.codex/config.toml | Codex | Outside-project (editor config) |
~/.copilot/mcp-config.json | GitHub Copilot CLI (only when ~/.copilot/ exists; respects COPILOT_HOME) | Outside-project (editor config) |
~/.config/opencode/opencode.json | OpenCode | Outside-project (editor config) |
~/.openclaw/openclaw.json | OpenClaw (only when ~/.openclaw/ exists) | Outside-project (editor config) |
~/.gemini/config/mcp_config.json | Antigravity (only when ~/.gemini/ exists) — shared by the IDE and the agy CLI | Outside-project (editor config) |
~/.lmstudio/mcp.json | LM Studio (only when installed; also checks ~/.cache/lm-studio/mcp.json) | Outside-project (editor config) |
~/.hermes/config.yaml | Hermes (only when ~/.hermes/ exists) | Outside-project (editor config) |
ok init also installs the user-global discovery skill — a short instruction file that teaches an agent host how to find and initialize OpenKnowledge — so it is available in every project. It is written only into the skills directories of agent hosts already present in your home directory, plus the shared ~/.agents/skills/ hub those hosts read. If none of them is present, nothing is written at all.
| Path | What it is | Scope |
|---|---|---|
~/.agents/skills/open-knowledge-*/ | Shared hub read natively by Codex, OpenCode, and Cursor | Outside-project (home dir) |
~/.claude/skills/open-knowledge-*/ | Written only when ~/.claude/ already exists | Outside-project (home dir) |
~/.cursor/skills/open-knowledge-*/ | Written only when ~/.cursor/ already exists | Outside-project (home dir) |
~/.codex/skills/open-knowledge-*/ | Written only when ~/.codex/ already exists | Outside-project (home dir) |
~/.opencode/skills/open-knowledge-*/ | Written only when ~/.opencode/ already exists | Outside-project (home dir) |
~/.ok/skill-state.yml | Records which skill version is installed, so the step is skipped next time | Outside-project (home dir) |
~/.ok/skill-install-events.jsonl | Append-only local log of skill-install attempts | Outside-project (home dir) |
The install is non-fatal (ok init still exits 0 if it fails), version-gated (a no-op when the current version is already installed), and needs no network access. Skip it for one run with ok init --no-skills, or choose individual bundles with --skills <ids>. Skipping records nothing and removes nothing, so skills already on the machine are left alone. An installed bundle is remembered in ~/.ok/skill-state.yml and honored by every later install path; to turn the built-in skills off for good, use the first-launch prompt or the Settings toggle, which record a durable machine-wide choice. ok repair-skills re-runs it.
Pi is the exception: it has no user-level MCP config (it has no MCP support at all), so its integration is only ever the project-scoped bridge extension above.
On Windows, Claude Desktop and OpenCode configs live under %APPDATA%\Claude\ and %APPDATA%\opencode\, and the MCP entry is a PowerShell launcher.
ok init also installs the two user-global skills (open-knowledge-discovery and open-knowledge-write-skill), honoring any prior consent choice, and, if you choose local-only sharing, adds the OpenKnowledge paths to .git/info/exclude so .ok/ stays off your remote. Switch modes later with ok config-sharing share / unshare (unshare refuses if an OK config file is already tracked); ok config-sharing status prints the current mode and the excluded paths.
Controlling it
--no-mcp— scaffold.ok/only; register nothing with any editor.--scope user | project | both— where the MCP entry is written. In an interactive terminal,ok initprompts for this; scripted/CI runs default toboth, so pass the flag to constrain them.--no-skills— install no user-global skills on this run;--skills discovery,write-skill— install only the named bundles. Default installs both. Installing is recorded and honored by the desktop app too; skipping is not recorded, so it never affects another project.--local-only(vs--shared) — keep.ok/out of git.
ok start
ok start runs the collaboration server. Most of what it writes stays inside your project, gitignored under .ok/local/, plus a shadow git repo for the timeline and recovery features:
| Path | What it is | Scope |
|---|---|---|
.ok/local/server.lock (and .ok/local/ui.lock on the legacy --ui-port path) | Advertise the running server's URL; ok start now serves the UI from the same server, so ui.lock is written only by the deprecated sibling path | In-project, gitignored |
.ok/local/principal.json | Your local identity (id, email) for edit attribution | In-project, gitignored |
.ok/local/sync-state.json, .ok/local/conflicts.json | GitHub-sync engine state | In-project, gitignored |
.ok/local/state.json, .ok/local/last-spawn-error.log | State-schema manifest and the UI sibling's error log | In-project, gitignored |
.ok/local/telemetry/spans-*.jsonl | Local diagnostic spans, rotated at ~50 MB | In-project, gitignored |
.ok/local/logs/server-*.jsonl | Local server logs, rotated at ~25 MB | In-project, gitignored |
.ok/local/cache/<branch>/backlinks.json | Backlink-graph cache | In-project, gitignored |
.ok/local/installed-skills.json | Per-project skill-install markers (which editors each skill is projected into) | In-project, gitignored |
.git/ok/ — or .git/worktrees/<name>/ok/ in a linked worktree, or the enclosing repo's .git/ok-<slug>/ when your project is a subfolder of a larger repo | Shadow git repo holding per-writer work-in-progress refs (powers the timeline); always inside a git admin dir, never in your content tree | In-project, gitignored (inside .git/) |
Diagnostic logs and telemetry are on by default but local-only — credential-bearing attributes are redacted ([REDACTED]) before anything is written, the files rotate at the size caps above, and nothing leaves the machine until you explicitly run ok diagnose bundle. Turn the local sink off with telemetry.localSink.enabled: false; see Configuration.
On each boot, ok start also runs repair sweeps: it re-checks a few things that drift as OpenKnowledge updates and rewrites any that have fallen out of the current canonical form — a no-op when nothing has changed, and it never adds an entry that isn't already there.
| What it re-checks | Where | Scope |
|---|---|---|
Existing open-knowledge MCP entries | The same editor configs ok init writes — both user-level (~/.claude.json, ~/.cursor/mcp.json, …) and project-level | Outside-project (editor config) and in-project |
OpenKnowledge skill bundles (open-knowledge-discovery, open-knowledge-write-skill) | Project (.claude/skills/…) and user-global — ~/.agents/skills/ plus each detected editor's ~/.claude/skills/, ~/.cursor/skills/, ~/.codex/skills/, ~/.opencode/skills/ | In-project and outside-project (home dir) |
Stale open-knowledge-ui entry in .claude/launch.json | Project | Removed if present — OK no longer writes launch.json |
Disable all three with OK_RECLAIM_DISABLE=1.
ok mcp
ok mcp is the stdio bridge your editor spawns to talk to the server. It writes nothing to disk — it routes tool calls to a running ok start backend (starting one on the first tool call that needs it — reads included).
Home directory and credentials (~/.ok/)
| Path | What it is | Sensitive? |
|---|---|---|
~/.ok/global.yml | User-global config (applies to every project) | No |
~/.ok/secrets.yml | Embeddings provider API key for semantic search, if you set one. Written 0600; never in config.yml | Yes (0600) |
~/.ok/auth.yml | Auth-token fallback, used when no OS credential store is reachable. Written 0600 | Yes (0600) |
~/.ok/skill-state.yml, ~/.ok/skill-install-events.jsonl | Skill-install bookkeeping | No |
~/.agents/skills/<name>/, ~/.claude/skills/<name>/, … | Your global-scope skills, versioned in place in your home editor dirs (kept by ok uninstall unless --purge-content) | No |
~/.ok/stats.jsonl | Local "open with AI" handoff stats — local-only, no phone-home | No |
~/.ok/logs/ | CLI logs (cli.<date>.log), size- and age-capped | No |
~/.ok/bug-reports/ | Bug-report bundles from ok bug-report — the desktop app's Help → Report a bug… dialog writes here too (ok diagnose bundle writes into the project, under .ok/local/diagnostics/) | No |
Auth tokens (for GitHub sync, sharing, and cloning) are stored in your operating system's secure credential store when one is available — the macOS Keychain (service open-knowledge), or the platform equivalent (Windows Credential Manager, Linux Secret Service) — falling back to a 0600 ~/.ok/auth.yml file on headless systems (a Linux server, CI) where none is reachable.
Opt-outs in one place
| To skip… | Do this |
|---|---|
The postinstall skill install (CLI) | npm install --ignore-scripts |
The shell-config PATH block (macOS app) | Uncheck "Add the ok command to your terminal" in the first-launch dialog |
All editor MCP registration in ok init | ok init --no-mcp |
| User-level (vs project) MCP writes | ok init --scope project |
Committing .ok/ to git | ok init --local-only (or choose "local only" when prompted) |
The repair sweeps and the desktop app's shell / PATH changes | OK_RECLAIM_DISABLE=1 (also delete the managed block from your shell config to remove the PATH entry) |
| Local diagnostic logs and telemetry | telemetry.localSink.enabled: false in config |
| Auto-starting the MCP server | OK_MCP_AUTOSTART=0 |
To review the footprint after the fact, ok diagnose reports what's on disk (and the desktop path-install.json records exactly which shell/PATH changes were made). To reverse it, ok deinit removes OpenKnowledge from one project and ok uninstall removes it from the whole machine — both keep your markdown content, and your global skills in your editors' skill dirs (~/.agents/skills, ~/.claude/skills, and the like) are never touched, and both take --dry-run to preview. See the CLI reference for the full semantics.
In the desktop app you don't need the CLI for finer control. Settings → AI tools & CLI (under User) lists every global component OpenKnowledge manages — each editor's open-knowledge MCP entry, the ok PATH command, and the user-global skills — with a checkbox reflecting its live installed state; toggling a row installs or removes just that one component. Settings → This project → AI tools does the same for the open project's local footprint — its project-scoped MCP configs and the project skill. Removal keeps the same guest discipline as install: only entries OpenKnowledge recognizably wrote are removed, and anything you customized is left intact.
What leaves your machine
None of your content, by default. Everything above is written to your own disk. The only ways data leaves your machine are these — all opt-in or on-demand, except three automatic actions that carry no document content (the desktop update check, a one-time share-link check on first launch, and the skill-install report):
| What | When | Where it goes |
|---|---|---|
| Diagnostic bundle | Only when you run ok diagnose bundle (you can inspect it first) | Wherever you send it |
| In-app bug report | Only when you click Send in the desktop app's Help → Report a bug… dialog — it builds a secret-redacted zip you can reveal and inspect first, and nothing is sent without that explicit click. After a crash, the same dialog adds an off-by-default "Include crash dump" checkbox: a crash dump is a memory snapshot that can contain document content and can't be redacted, and it is only ever attached when you check that box. On macOS the zip also carries the update helper's install log (listed above), which is machine-wide rather than project-scoped; the zip's own README names it and says where it came from | By default, Send makes no network request — it opens a prefilled email draft to support@inkeep.com that you send yourself, naming the zip to attach. Only when an operator has configured a bug-report intake endpoint (OK_BUG_REPORT_INTAKE_URL) does Send upload the zip there, falling back to the same email draft if the upload fails |
| Uninstall feedback | Only after an uninstall has already succeeded, and only if you pick a reason, type a note, or give an email address on the optional "Before you go" screen (desktop app) or prompt (ok uninstall). Skipping it, --yes, --json, and any non-interactive run send nothing | openknowledge.ai/api/feedback — the reason you picked, your note, your email address if you gave one, plus the app version and platform. It files one ticket for the team; nothing from your notes is included |
| Semantic search embeddings | Only when you enable semantic search and set a key — off by default | Your configured embeddings provider (OpenAI by default) |
| GitHub sync / share | When you sync, clone, publish, or share | GitHub |
| Update check | Automatically — on launch and periodically while the desktop app runs | OpenKnowledge update service (openknowledge.ai/updates), which redirects to GitHub; sends the app version and channel |
| First-launch share check | Once, automatically, on the desktop app's first launch | openknowledge.ai/continue — redeems a share link if you installed from one |
| Skill-install report | Automatically, the first time a published skill is actually installed — OpenKnowledge's own built-in and starter-pack skills, and skills you install from a skills.sh listing. Counted once per skill for machine-wide installs (the built-in bundles), and once per skill per project for skills installed into a project, since each project gets its own copy in its own editor dirs. Never re-sent on a re-run, a reinstall, an app launch, or reopening a project — an app launch that installs nothing sends nothing. A skill you install by typing a third-party repository yourself is not reported, and neither is a private, local, or internal-hostname source. A skill bundle you switched off is never installed and so is never reported | add-skill.vercel.sh — the skill's name, its source repository, and which agent tools it was installed for. No file contents. This is what gives a published skill an accurate install count. Turn it off in Settings → Preferences, by setting telemetry.skillInstallReports.enabled: false, or with DO_NOT_TRACK=1 / DISABLE_TELEMETRY=1 |
npm/npx fetch | During install (CLI) | The npm registry |
Local diagnostic logs and telemetry are scrubbed of credential-bearing attributes and never sent anywhere on their own.
See also
Configuration
Every config key and environment variable, including the telemetry and semantic-search settings referenced here.
CLI & web app
Install the CLI, run ok init / ok start, and the commands behind these writes.
Ignore patterns
Control which files the editor, search, and agents can see.
Core Concepts
Why the file system is the database, and how attribution works.