OpenKnowledge

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 (~/.zshrc and 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).

PathWhat it isScope
~/Library/Application Support/OpenKnowledge/state.jsonRecent projects, window/view state, update channelOutside-project (home dir)
~/Library/Application Support/OpenKnowledge/path-install.jsonRecords the PATH/shell changes it made and your PATH-consent choice, so they can be revertedOutside-project (home dir)
~/.ok/logs/desktop.<date>.logDesktop app + renderer logOutside-project (home dir)
~/.ok/mcp-status.jsonRecords your first-launch MCP-setup consent choiceOutside-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 mechanismOutside-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 automaticallyOutside-project (home dir)
~/Library/Application Support/OpenKnowledge/bug-report-dirty-shutdown.jsonDirty-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.jsonRecords which crash-report invitations you already answered or dismissed, so the same crash never re-promptsOutside-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.

PathWhat it isScope
~/.ok/bin/ok, ~/.ok/bin/open-knowledgeSymlinks to the CLI bundled inside the appOutside-project (home dir)
~/.ok/env.shA managed shim that prepends ~/.ok/bin to your PATHOutside-project (home dir)
~/.zshrc, ~/.bash_profile, ~/.config/fish/conf.d/open-knowledge.fishA fenced managed block that sources ~/.ok/env.sh — written only if you consent in the first-launch dialogOutside-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 Skillsopen-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.

PathWhat it isScope
.ok/, .ok/config.ymlProject directory and its configIn-project, committed
.ok/.gitignoreKeeps machine-local runtime state (local/, principal.json, server.lock, …) out of gitIn-project, committed
.okignorePaths excluded from the editor, search, and agents — see Ignore patternsIn-project, committed
.mcp.json, .cursor/mcp.json, .codex/config.toml, opencode.jsonProject-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 teammatesIn-project, committed
.pi/extensions/open-knowledge.tsManaged bridge extension connecting Pi (which has no MCP support) to the projectIn-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 PiIn-project, committed
.ok/skills-lock.jsonProvenance for imported skills — source, selected skill, commit/ref when available, content hash, publisher, and import timeIn-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.yamlUser-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:

PathWhat it isScope
.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 pathIn-project, gitignored
.ok/local/principal.jsonYour local identity (id, email) for edit attributionIn-project, gitignored
.ok/local/sync-state.json, .ok/local/conflicts.jsonGitHub-sync engine stateIn-project, gitignored
.ok/local/state.json, .ok/local/last-spawn-error.logState-schema manifest and the UI sibling's error logIn-project, gitignored
.ok/local/telemetry/spans-*.jsonlLocal diagnostic spans, rotated at ~50 MBIn-project, gitignored
.ok/local/logs/server-*.jsonlLocal server logs, rotated at ~25 MBIn-project, gitignored
.ok/local/cache/<branch>/backlinks.jsonBacklink-graph cacheIn-project, gitignored
.ok/local/installed-skills.jsonPer-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/excludeIn-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 repoShadow git repo holding per-writer work-in-progress refs; always inside a git admin dir, never in your content treeIn-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/)

PathWhat it isSensitive?
~/.ok/global.ymlUser-global config (applies to every project)No
~/.ok/secrets.ymlEmbeddings provider API key for semantic search, if you set one. Written 0600; never in config.ymlYes (0600)
~/.ok/auth.ymlAuth-token fallback, used only when the Keychain is unavailable. Written 0600Yes (0600)
~/.ok/skill-state.yml, ~/.ok/skill-install-events.jsonlSkill-install bookkeepingNo
~/.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.jsonlLocal "open with AI" handoff stats — local-only, no phone-homeNo
~/.ok/mcp-status.jsonFirst-launch MCP consent recordNo
~/.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.shPATH 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.

PathWhat it isScope
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 packageOutside-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).

PathWhat it isScope
.ok/, .ok/config.ymlProject directory and its configIn-project, committed
.ok/.gitignoreKeeps machine-local runtime state (local/, principal.json, server.lock, …) out of gitIn-project, committed
.okignorePaths excluded from the editor, search, and agents — see Ignore patternsIn-project, committed
.gitignore (project root)Seeded (with .DS_Store) only when ok init creates a new git repoIn-project, committed
.mcp.json, .cursor/mcp.json, .codex/config.toml, opencode.jsonProject-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.tsManaged bridge extension connecting Pi (which has no MCP support) to the projectIn-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 PiIn-project, committed
.ok/skills-lock.jsonProvenance for imported skills — source, selected skill, commit/ref when available, content hash, publisher, and import timeIn-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:

PathEditorScope
~/.claude.jsonClaude CodeOutside-project (editor config)
~/Library/Application Support/Claude/claude_desktop_config.jsonClaude DesktopOutside-project (editor config)
~/.cursor/mcp.jsonCursorOutside-project (editor config)
~/.codex/config.tomlCodexOutside-project (editor config)
~/.copilot/mcp-config.jsonGitHub Copilot CLI (only when ~/.copilot/ exists; respects COPILOT_HOME)Outside-project (editor config)
~/.config/opencode/opencode.jsonOpenCodeOutside-project (editor config)
~/.openclaw/openclaw.jsonOpenClaw (only when ~/.openclaw/ exists)Outside-project (editor config)
~/.gemini/config/mcp_config.jsonAntigravity (only when ~/.gemini/ exists) — shared by the IDE and the agy CLIOutside-project (editor config)
~/.lmstudio/mcp.jsonLM Studio (only when installed; also checks ~/.cache/lm-studio/mcp.json)Outside-project (editor config)
~/.hermes/config.yamlHermes (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.

PathWhat it isScope
~/.agents/skills/open-knowledge-*/Shared hub read natively by Codex, OpenCode, and CursorOutside-project (home dir)
~/.claude/skills/open-knowledge-*/Written only when ~/.claude/ already existsOutside-project (home dir)
~/.cursor/skills/open-knowledge-*/Written only when ~/.cursor/ already existsOutside-project (home dir)
~/.codex/skills/open-knowledge-*/Written only when ~/.codex/ already existsOutside-project (home dir)
~/.opencode/skills/open-knowledge-*/Written only when ~/.opencode/ already existsOutside-project (home dir)
~/.ok/skill-state.ymlRecords which skill version is installed, so the step is skipped next timeOutside-project (home dir)
~/.ok/skill-install-events.jsonlAppend-only local log of skill-install attemptsOutside-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 init prompts for this; scripted/CI runs default to both, 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:

PathWhat it isScope
.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 pathIn-project, gitignored
.ok/local/principal.jsonYour local identity (id, email) for edit attributionIn-project, gitignored
.ok/local/sync-state.json, .ok/local/conflicts.jsonGitHub-sync engine stateIn-project, gitignored
.ok/local/state.json, .ok/local/last-spawn-error.logState-schema manifest and the UI sibling's error logIn-project, gitignored
.ok/local/telemetry/spans-*.jsonlLocal diagnostic spans, rotated at ~50 MBIn-project, gitignored
.ok/local/logs/server-*.jsonlLocal server logs, rotated at ~25 MBIn-project, gitignored
.ok/local/cache/<branch>/backlinks.jsonBacklink-graph cacheIn-project, gitignored
.ok/local/installed-skills.jsonPer-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 repoShadow git repo holding per-writer work-in-progress refs (powers the timeline); always inside a git admin dir, never in your content treeIn-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-checksWhereScope
Existing open-knowledge MCP entriesThe same editor configs ok init writes — both user-level (~/.claude.json, ~/.cursor/mcp.json, …) and project-levelOutside-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.jsonProjectRemoved 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/)

PathWhat it isSensitive?
~/.ok/global.ymlUser-global config (applies to every project)No
~/.ok/secrets.ymlEmbeddings provider API key for semantic search, if you set one. Written 0600; never in config.ymlYes (0600)
~/.ok/auth.ymlAuth-token fallback, used when no OS credential store is reachable. Written 0600Yes (0600)
~/.ok/skill-state.yml, ~/.ok/skill-install-events.jsonlSkill-install bookkeepingNo
~/.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.jsonlLocal "open with AI" handoff stats — local-only, no phone-homeNo
~/.ok/logs/CLI logs (cli.<date>.log), size- and age-cappedNo
~/.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 initok init --no-mcp
User-level (vs project) MCP writesok init --scope project
Committing .ok/ to gitok init --local-only (or choose "local only" when prompted)
The repair sweeps and the desktop app's shell / PATH changesOK_RECLAIM_DISABLE=1 (also delete the managed block from your shell config to remove the PATH entry)
Local diagnostic logs and telemetrytelemetry.localSink.enabled: false in config
Auto-starting the MCP serverOK_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):

WhatWhenWhere it goes
Diagnostic bundleOnly when you run ok diagnose bundle (you can inspect it first)Wherever you send it
In-app bug reportOnly 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 fromBy 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 feedbackOnly 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 nothingopenknowledge.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 embeddingsOnly when you enable semantic search and set a key — off by defaultYour configured embeddings provider (OpenAI by default)
GitHub sync / shareWhen you sync, clone, publish, or shareGitHub
Update checkAutomatically — on launch and periodically while the desktop app runsOpenKnowledge update service (openknowledge.ai/updates), which redirects to GitHub; sends the app version and channel
First-launch share checkOnce, automatically, on the desktop app's first launchopenknowledge.ai/continue — redeems a share link if you installed from one
Skill-install reportAutomatically, 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 reportedadd-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 fetchDuring 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