Skip to content

Files and paths

An install keeps everything in its home, ~/.kndl, or KNDL_HOME. Back up hub.env and hub.db together: the database’s Sensitive values can’t be read without the key in hub.env.

PathWhat it is
app/The install: a checkout of kndl, which the services and the kndl command run. kndl update moves it, and discards changes made in it.
hub.envThe Hub’s settings, with HUB_SECRETS_KEY. Readable only by you (600).
runner.envThe Runner’s settings, with its RUNNER_TOKEN. Readable only by you.
github-app-<id>.pemThe GitHub App’s private key, when onboard created the App. Readable only by you.
hub.dbThe Hub’s database: Sessions, their history, Runners, Environments and Variables.
hub.db.lockThe lock the running Hub holds, so a second Hub or a secrets reset on the same database is refused.
sessions/The Runner’s Sessions, one directory each. See One Session’s directory.
claude-code/Linux builds of Claude Code, mounted read-only into every Sandbox.
runner-update.jsonThe Runner’s update under way, or its last failed one, so it can go back.
logs/hub.log, logs/runner.logEach service’s output. kndl logs prints it.
cli/<commit>/kndl-<os>-<arch>The kndl binaries the Hub serves.

kndl uninstall removes app/, the command and the services, and keeps the rest. --purge removes the whole home.

PathWhat it is
~/.local/bin/kndlThe kndl command: a small script that runs the install’s CLI. On a machine without an install, it can be the binary installed from a Hub. KNDL_BIN_DIR moves it.
~/.config/kndl/cli.jsonThe Hub the CLI is signed in to, and its CLI token after kndl login. Readable only by you. $XDG_CONFIG_HOME/kndl/cli.json when that’s set.
~/Library/LaunchAgents/io.github.kddige.kndl.hub.plist, ….runner.plistmacOS: the services, as launchd agents.
~/.config/systemd/user/kndl-hub.service, kndl-runner.serviceLinux: the services, as systemd user units.
~/.microsandbox/microsandbox’s home, with its Sandboxes, volumes and snapshots.
~/.claude.json, ~/.claude/projects/Claude Code’s config and transcripts, if Claude Code is on the machine. The Runner copies a Session’s transcripts from there into its Sandbox, for Sessions from before they ran in Sandboxes, and removes them and their config entries when it purges the Session. Under $CLAUDE_CONFIG_DIR when that’s set. Sessions never use this machine’s Claude login.

Each service runs the install’s Hub or Runner with its env file and KNDL_HOME, logs to logs/, starts at login and restarts if it crashes.

A checkout keeps the Runner’s files in the dev home, ~/.kndl-dev, with the same names as an installed home. The Hub’s are in the checkout:

PathWhat it is
packages/hub/.env.localThe Hub’s settings. git ignores it.
packages/hub/hub.db, hub.db.lockThe Hub’s database, and the lock the running Hub holds. HUB_DATABASE moves it.
packages/web/dist/The web UI’s build, which the Hub serves. HUB_WEB_DIR moves it.
packages/mod/The mod, which each Session’s Claude Code loads. RUNNER_MOD_DIR moves it.

Under sessions/, each <session id>/ holds:

PathWhat it is
workspace/The Workspace: the Repo’s checkout on the Session’s Work branch, mounted at /workspace in the Sandbox.
mod/The copy of the mod the Session’s Claude Code runs with, made each time it starts.

Archiving a Session keeps its directory and the volume with Claude Code’s state. Purging deletes both.

PathWhat it is
/workspaceThe Workspace, mounted from the Runner.
/var/lib/kndl/depsThe disk holding the Environment’s dependency folders, bound over each match in /workspace, such as node_modules.
/var/cache/kndlPackage caches, on a disk. XDG_CACHE_HOME, BUN_INSTALL_CACHE_DIR and npm_config_cache point into it.
/var/lib/kndl/claudeClaude Code’s state and the Session’s transcripts, its CLAUDE_CONFIG_DIR, on a disk kept when the Session is archived.
/opt/kndl/claude-codeThe Runner’s Linux builds of Claude Code, read-only.
/opt/kndl/modThe Session’s copy of the mod, read-only.
/run/kndl/github-tokenThe Sandbox token, in memory only.
WhatName
The tmux server in a Sandboxtmux -L kndl
A Session’s tmux sessionhub-<session id>
A Session’s Sandboxkndl-<session id>
A Sandbox’s volumeskndl-<session id>.<key>: .deps, .cache, .claude, and .docker with Docker on. A Repo without an Environment has .deps-node-modules instead of .deps.
A Repo’s Environment Buildssnapshots b<build version>-<libc>, in a group per Runner and Repo

Everything a Runner makes in microsandbox is labelled kndl.runner with a digest of its tmux socket and sessions root. A Runner only stops or removes what carries its own label.

kndl is an independent project. It is not affiliated with or endorsed by Anthropic. Claude and Claude Code are trademarks of Anthropic, PBC. About kndl