Skip to content

Directories

Everything keelson manages lives in one directory, the home, resolved deterministically at every entry point. Secrets are the single exception: they live in your OS keychain, never in the home. Below is the exact layout, and the variables that relocate each piece.

The home is the first of these that applies, checked in order:

PrecedenceSourceWhen it wins
1KEELSON_HOMESet and non-empty. The explicit override.
2An existing .keelson/ walking up from the working directoryThe monorepo dev layout, where the home is <repo>/.keelson.
3The per-user defaultEverything else. ~/.keelson on macOS and Linux; on Windows see below.

The walk-up branch is what lets keelson data live beside an embedding project’s source during development; an installed harness almost always lands on the per-user default.

On Windows the per-user default is %LOCALAPPDATA%\keelson, not %USERPROFILE%\.keelson. The home holds node_modules, a live SQLite database, and a pid file — none of which should follow a user between machines, and %USERPROFILE% roams in AD environments. An existing %USERPROFILE%\.keelson still wins, so upgrading an install that predates the move never relocates its data; only a fresh install lands in %LOCALAPPDATA%. With no %LOCALAPPDATA% set, the profile path is the fallback.

PathWhat
keelson.dbThe SQLite store: conversations, workflow runs and node outputs, projects and notebooks, memory rows.
config.jsonThe operator’s settings: provider enablement and defaults, cross-rib grants, the MCP gateway block, registered gateways, and the Claude and Codex provider blocks. Optional; a missing file falls back to defaults.
server.jsonThe running server’s record: URL, pid, version, schema version, start timestamp, shutdown token, and (when MCP token-gating is enabled) an MCP token. Written on start, cleaned on stop.
workflows/Your global workflow YAML files.
commands/Named markdown prompt files a workflow command node runs.
artifacts/Published canvas artifacts, one <slug>.html page (openable in any browser) plus a <slug>.json sidecar; re-registered at boot.
node_modules/@keelson/Installed rib packages, discovered at boot.
rib-<id>/Private data directory for a rib that calls getDataDir(). Created on first write; named to mirror the @keelson/rib-<id> package.
logs/server.logThe background server’s log, named in the error hints when something is wrong.

Each path has an override, applied over the resolved home:

VariableRelocates
KEELSON_HOMEThe whole home.
KEELSON_DBThe database file (for keelson start --db, too).
KEELSON_WORKFLOWS_DIRThe global workflows directory.
KEELSON_CONFIGThe config file.

See Configuration for the full KEELSON_* table.

A registered project carries its own .keelson/ under its root path. Today that holds workflows/: a project workflow shadows a same-named global one within that project. Conversations and runs attach to the project, and memory recall is scoped by it. A git-worktree isolated run (workflow run --worktree) checks out under <project>/.worktrees/, and keelson worktree prune sweeps the leftovers there, not in the home.

No secret is stored in the home. Provider keys and rib credentials live in the OS keychain under the keelson service; the database and the API only ever report that a credential exists, never its value. The split is the trust model: data you may want to inspect sits in files you can open, and secrets sit behind the operating system’s own lock.