nextv2.0.0
Security and project

Data and privacy

What leaves your machine, where it goes, how to turn it off, and where Kraft keeps secrets and state.

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.

CallGoes toWhenTurn it off
Agent CLIIts provider, such as api.anthropic.comEvery agent taskNot possible: this is the work.
Update checkapi.github.com, this project's releases listkraft admin start, kraft admin doctor and the web interface, at most once a day, or once an hour after a failed checkKRAFT_NO_UPDATE_CHECK=1. It stops the automatic checks only.
kraft admin updateThe 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 installOnly when you run itDo not run it.
Forge CLI (gh, glab)Your forgeMerge-request nodes: open, read checks and reviews, mark ready, mergeA chain without merge-request nodes makes none.
git fetch, git pushYour repository's originFetching 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 itselfNot possible.
Kraft add-on collectionsEach git URL in addons.yaml, with your own git loginkraft admin addon installs, updates and collection fetches; after a server start and once a day, for an add-on set to auto-update; and to restore an add-on's missing filesAdd no git collection.
NotificationsThe webhook URL in notify.yamlFor each event you chose, only while notifications are onOff by default.
API docs pagescdn.jsdelivr.net, fetched by your browserOnly 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 modelHugging Face, Qdrant/bge-small-en-v1.5-onnx-Q, about 130 MBThe first vector index or search, only with the vector extra installedDo not install the vector extra.
Kit image registryThe registry named by a Kit's digest-pinned image reference, through your own docker or podman and its loginOnly for a kind: kit sandbox, when Kraft reads the Kit's descriptorDo 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=1 stops the automatic checks. The About page's Check now and kraft admin update still 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.yaml points at before you turn notifications on. Get notified when an item needs you sets them up.
  • API docs pages. /docs loads swagger-ui-bundle.js and swagger-ui.css from swagger-ui-dist@5.32.15. /redoc loads redoc.standalone.js from redoc@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/fastembed when that is unset), or in $KRAFT_EMBED_CACHE if 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

WhatWhereMode
Settings password (scrypt hash) and bindconfig/access.yaml0600 once Kraft writes it
Notification webhook URLconfig/notify.yaml0600 once Kraft writes it
Repo env: valuesconfig/repos.yaml0600 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.

PathWhat it holdsMode
mcp-tokenBearer token for the CLI and MCP0600; kraft admin doctor checks it
trigger-tokenBearer token for POST /api/triggers only0600; kraft admin doctor checks it
kraft.pidThe process id of the running server0644, less your umask
kraft.modeWhether the server was started detached or attached, so kraft admin restart can start it the same way
update-check.jsonThe cached update check0600
orchestrator.dbLogin sessions (token hashes), work items, events0600 when Kraft creates it
orchestrator.db.pre-v<N>-<time>The database as it was before an upgrade migrated it0600
index.dbSearch index of specs, plans and other documents0600 when Kraft creates it
logs/Agent logs, and server.log0600 for a session log; none on server.log
results/Agent results
addons/Each git collection's mirror, the files of each installed add-on, and status.json, the last auto-update of each. See On disk.
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

PathWhat it holdsMode
sn/Each sandboxed session's egress socket0700
ca/Kraft's own certificate authority (CA) for sandboxes: its certificate, its key, and the certificates it signed0700; the key is 0600, the certificates 0666 less your umask
kit/Each Kit's descriptor as fetched0644
sandbox-ca/The combined CA bundles for sandboxed containers, one set per image0644 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 worktreeThe 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.

Copyright © 2026