Data and privacy
Kraft has no telemetry. It sends no usage data, crash reports or analytics anywhere. The outbound calls it makes are listed below, and each one serves a feature you can see.
Model providers
Kraft never calls a model API itself. It runs the agent CLI you installed, such as Claude Code, and that CLI sends your code, prompts and tool output to its provider under your account and that provider's terms. What the provider keeps and for how long is set by your account with it, not by Kraft.
Under a sandbox with a
network: policy, the agent's traffic leaves through Kraft's own egress
proxy, and only to the hosts the policy and the harness allow.
Outbound calls
Each row is a call Kraft or your browser makes, and what turns it off.
| Call | Goes to | When | Turn it off |
|---|---|---|---|
| Agent CLI | Its provider, such as api.anthropic.com | Every agent task | Not possible: this is the work. |
| Update check | api.github.com, this project's releases list | kraft admin start, kraft admin doctor and the web interface, at most once a day, or once an hour after a failed check | KRAFT_NO_UPDATE_CHECK=1. It stops the automatic checks only. |
kraft admin update | The releases list on api.github.com, then uv tool install of kraft-sdlc from PyPI (the release's wheel on GitHub if that fails), or brew upgrade kraft on a Homebrew install | Only when you run it | Do not run it. |
Forge CLI (gh, glab) | Your forge | Merge-request nodes: open, read checks and reviews, mark ready, merge | A chain without merge-request nodes makes none. |
git fetch, git push | Your repository's origin | Fetching the base branch, git ls-remote on a base branch or a pushed branch, and pushing the item's branch. A workspace's pointer-only bump is pushed to the base branch itself | Not possible. |
| Notifications | The webhook URL in notify.yaml | For each event you chose, only while notifications are on | Off by default. |
| API docs pages | cdn.jsdelivr.net, fetched by your browser | Only when you open /docs or /redoc in a browser. The board loads nothing from outside. | Do not open them; read /openapi.json in your own viewer. See the HTTP API. |
| Embedding model | Hugging Face, Qdrant/bge-small-en-v1.5-onnx-Q, about 130 MB | The first vector index or search, only with the vector extra installed | Do not install the vector extra. |
| Kit image registry | The registry named by a Kit's digest-pinned image reference, through your own docker or podman and its login | Only for a kind: kit sandbox, when Kraft reads the Kit's descriptor | Do not use a Kit. |
The forge CLI and git calls use your own logins for those tools. More on four
of the rows:
- Update check. The result is cached in
run/update-check.json.KRAFT_NO_UPDATE_CHECK=1stops the automatic checks. The About page's Check now andkraft admin updatestill look when you ask. - Notifications. For each event you chose, Kraft posts the work item's id
and title, the event type, the gate when the event is about one, and a link
to the item on your board. A title can name a private project, so check what
notify.yamlpoints at before you turn notifications on. Get notified when an item needs you sets them up. - API docs pages.
/docsloadsswagger-ui-bundle.jsandswagger-ui.cssfromswagger-ui-dist@5.32.15./redocloadsredoc.standalone.jsfromredoc@2.5.4. Each is one pinned release, checked against a hash Kraft ships. - Embedding model. It is cached in
$XDG_CACHE_HOME/kraft/fastembed(~/.cache/kraft/fastembedwhen that is unset), or in$KRAFT_EMBED_CACHEif you set it.
Secrets and state
Everything lives under $KRAFT_HOME (default ~/.kraft). Kraft writes its
config files through a temporary file created with mode 0600, so a file
Kraft has written is readable only by you. The defaults Kraft copies into a
new home on its first start are 0600 too, in 0700 directories. A file you
created or edited by hand keeps its own mode.
Config files that hold secrets
| What | Where | Mode |
|---|---|---|
| Settings password (scrypt hash) and bind | config/access.yaml | 0600 once Kraft writes it |
| Notification webhook URL | config/notify.yaml | 0600 once Kraft writes it |
Repo env: values | config/repos.yaml | 0600 once Kraft writes it (kraft repo connect or a Settings save) |
The rest of config/ is described in Configuration.
The run directory
run/ is 0700, and Kraft sets that on every start. Because of that, other
users on the machine cannot reach anything inside it, whatever mode a file has.
Every path in the two tables below is under it. A row with no mode is one Kraft
sets none on.
| Path | What it holds | Mode |
|---|---|---|
mcp-token | Bearer token for the CLI and MCP | 0600; kraft admin doctor checks it |
trigger-token | Bearer token for POST /api/triggers only | 0600; kraft admin doctor checks it |
kraft.pid | The process id of the running server | 0644, less your umask |
kraft.mode | Whether the server was started detached or attached, so kraft admin restart can start it the same way | |
update-check.json | The cached update check | 0600 |
orchestrator.db | Login sessions (token hashes), work items, events | 0600 when Kraft creates it |
orchestrator.db.pre-v<N>-<time> | The database as it was before an upgrade migrated it | 0600 |
index.db | Search index of specs, plans and other documents | 0600 when Kraft creates it |
logs/ | Agent logs, and server.log | 0600 for a session log; none on server.log |
results/ | Agent results | |
attachments/, worktrees/ | Attachment copies and the item worktrees | |
harness-config/<harness id>/ | Permission-rule files Kraft writes for a harness, and the config files a harness profile declares. For a sandboxed item the config files go to sandbox-home/<id>/.kraft-harness-config/<harness id> |
Agent logs hold whole sessions: prompts, the code the agent read and wrote,
and command output. A database created by an older Kraft keeps its mode. Treat run/ like the repositories it works on.
Sandbox working files
| Path | What it holds | Mode |
|---|---|---|
sn/ | Each sandboxed session's egress socket | 0700 |
ca/ | Kraft's own certificate authority (CA) for sandboxes: its certificate, its key, and the certificates it signed | 0700; the key is 0600, the certificates 0666 less your umask |
kit/ | Each Kit's descriptor as fetched | 0644 |
sandbox-ca/ | The combined CA bundles for sandboxed containers, one set per image | 0644 for each bundle |
sandbox-git/ | A private copy of the refs for each sandboxed worktree, so a worker cannot move another branch | |
sandbox-home/<work item id>/ | The home directory a sandboxed item's containers share, kept across its sessions | |
set-aside/ | Setup lockfiles kept aside while a rebase runs, one directory per worktree | The directory is 0700; the files keep their own modes |
sandbox-client/ | A working directory for each running sandboxed session, removed when it ends |
Repo environment values
A repo's env: values go into each worker's process environment, not onto
its command line. Your own user and root can read them there, for example
with ps eww on macOS or from /proc/<pid>/environ on Linux. Every agent
running for that repo can read them too.
Related
- Security: the default posture and the threat model.
- The bearer token: what it grants.
- Rotate the token: how to replace the bearer token or the trigger token.
- Architecture: how the stores fit together.
Security
What Kraft does on your machine, the few settings that make it safe to run, and the threat model behind them: what it protects against and what it does not.
What's new in 2.0
What to do before you upgrade from 1.4, and what Kraft 2.0 brings, from a new interface and code-host review to a repo connect that reads more of the repo and safer sharing.