Installation¶
Tilth is a small Python package; setup is straight uv plumbing plus a .env.
Prerequisites¶
- Python 3.12 or newer.
uvfor env management (installation guide).git— Tilth uses git worktrees as session sandboxes, so a working git is non-optional.- An OpenAI-compatible LLM endpoint and API key. Tilth is actively tested against OpenRouter; other OpenAI-flavour gateways should work via the OpenAI SDK but haven't been validated yet.
Install¶
Tilth publishes to PyPI, so the CLI installs like any other Python tool. Pick whichever runner you already use:
# uv (recommended — Tilth is uv-native)
uv tool install tilth # `tilth` on your PATH, runnable from any directory
# -- OR --
uvx tilth --help # …or run it ephemerally, npx-style, with no install
# pipx: Installing with pipx is another option
pipx install tilth # persistent
pipx run tilth --help # ephemeral
Tilth and the project you point it at are independent checkouts — Tilth lives wherever you install it, and the codebase it works on lives somewhere else. The command takes a feature directory as a plain path argument (tilth run <repo>/.tilth/<feature>) and derives the enclosing repo from it, so any layout works.
tilth init # scaffolds ~/.tilth/.env from the template
# edit ~/.tilth/.env, set TILTH_BASE_URL, TILTH_API_KEY, and TILTH_WORKER_MODEL
tilth init creates the per-user home (~/.tilth/) with a sessions/ directory and a .env you fill in. It never overwrites an existing .env.
Install from source (maintainers)¶
Working on the harness, or want to run an unreleased revision? Install it editable from a clone — tilth goes on your PATH but resolves to your working copy, so edits take effect without reinstalling:
git clone git@github.com:AlteredCraft/tilth.git
cd tilth
uv tool install --editable . # `tilth` on your PATH; --editable tracks the clone
Contributor path. If you're iterating on the code rather than using the installed tool, skip the tool install entirely:
uv syncfor the dev env, then run the CLI from the clone withuv run tilth …. Either way, state lands under~/.tilth/unless you override it (below). Cutting and shipping a release is documented in Releasing to PyPI.About the example paths in these docs. Later pages show commands like
tilth run ~/projects/project-x/.tilth/<feature>and reference paths such as~/.tilth/sessions/<id>/. The feature-directory path (and the feature name) is just one illustrative choice — substitute whatever matches your own setup.
All three of TILTH_BASE_URL, TILTH_API_KEY, and TILTH_WORKER_MODEL are required — Tilth refuses to start without them so a misconfigured run can't silently fall back to a provider/model your account doesn't have. The example .env points at OpenRouter.
Where Tilth stores things¶
Everything Tilth writes for a user lives under one home directory, resolved at startup. Each location has an environment override:
| Path | Default | Override |
|---|---|---|
| Home directory | ~/.tilth/ |
$TILTH_HOME |
| Sessions (one dir per run, including its worktree) | <home>/sessions/ |
$TILTH_SESSIONS_DIR |
| Provider config | <home>/.env |
$TILTH_ENV_FILE |
The .env is discovered in order — $TILTH_ENV_FILE, then ~/.tilth/.env, then a .env in the current directory (a convenience for running from a clone before ~/.tilth is set up). The first one found wins; Tilth doesn't merge an unrelated project's .env just because you're standing in it. $TILTH_HOME and $TILTH_SESSIONS_DIR must be real shell variables to relocate the tree, since they decide where the .env itself is read from.
Required environment variables¶
| Variable | What it does |
|---|---|
TILTH_BASE_URL |
Provider's OpenAI-compatible endpoint (e.g. https://openrouter.ai/api/v1). |
TILTH_API_KEY |
Bearer token for that provider. |
TILTH_WORKER_MODEL |
The model that does the work. |
Optional environment variables¶
| Variable | Default | What it does |
|---|---|---|
TILTH_EVALUATOR_MODEL |
same as worker | Model that reviews finished tasks. |
TILTH_EVALUATOR_BASE_URL |
inherits worker | Point the evaluator at a different provider for stronger independence. |
TILTH_EVALUATOR_API_KEY |
inherits worker | Bearer token for the evaluator provider. |
TILTH_CONTEXT_FILES |
AGENTS.md,CLAUDE.md |
Comma-separated project-context files read from the workspace root (in order, concatenated) into the worker and evaluator prompts. |
TILTH_MAX_ITERATIONS_PER_TASK |
32 |
Tool-use iterations before a task is marked failed. |
TILTH_MAX_WALL_CLOCK_MINUTES |
120 |
Outer-loop wall-clock cap. |
TILTH_MAX_TOKEN_DOLLAR_SPEND |
10.00 |
Cumulative session USD-spend cap, read from the provider's per-call cost (OpenRouter reports it; gateways that don't leave it uncapped — wall-clock is the backstop). |
MAX_EVALUATOR_CALLS_PER_TASK |
0 (off) |
Optional cap on worker↔evaluator ping-pong. |
See What can stop a run for the safety story behind the caps.
Provider notes¶
Tilth talks to an OpenAI-compatible endpoint via the openai Python SDK. Today the only actively tested gateway is OpenRouter (https://openrouter.ai/api/v1); support for other OpenAI-flavour gateways is on the roadmap but unverified.
When the base URL points at OpenRouter, Tilth sends OpenRouter's normalised reasoning: { enabled: true } opt-in on every request so thinking-mode models populate reasoning_details reliably across parallel-tool-call turns. For non-OpenRouter base URLs the opt-in is omitted automatically — no configuration needed.
Tool-calling caveat. Not every model on OpenRouter supports tool calling, and OpenRouter routes through many backends — some don't implement function calling. Pick a model whose card explicitly says
toolsis supported, or you'll get text responses where the loop expects tool calls. Test with the demo workspace first; it'll fail fast.
Building these docs locally¶
The docs site itself is built with MkDocs. The --extra docs flag resolves the docs dependency group on the fly:
mkdocs serve opens a live-reload preview at http://127.0.0.1:8000.