Limbo
A terminal AI coding agent that is small enough to understand and sturdy enough to trust with long work.
Tell Limbo what you want in plain language. It explores your repository, reads and edits files, runs commands, and streams its reasoning and every tool call as it goes. When the work runs long, Limbo keeps it safe: every turn is journaled to disk, a crash or a closed terminal picks up where it stopped, and you can branch, hand off, or replay any session.
Who it's for
- Developers who live in the terminal and want an agent that fits next to their editor, multiplexer, and dotfiles instead of a separate app.
- People who use more than one model. DeepSeek, Kimi, GLM, OpenAI Codex, or any OpenAI-compatible endpoint, switchable mid-conversation.
- Anyone who wants to see what the agent did. Every request, tool call, and token is recorded and browsable; nothing happens off-screen.
- Hackers who want to read the code. Seven tools, one agent loop, plain
JSONL on disk.
AGENTS.mdexplains every design decision.
What you get
Work that survives
- Durable sessions. Messages, tool-call intents, queued follow-ups, and compactions are appended to a JSONL journal as they happen. Kill the process mid-turn and resume: read-only calls that were interrupted are re-run, calls that may have had side effects are flagged so the model checks before retrying, and nothing you queued is lost.
- Resume, branch, hand off.
limbo --continueor/sessionsto pick up,/forkto try another direction without touching the original,/handoffto start a clean context with a written brief that links back. - Long runs stay alive. Automatic compaction summarizes old turns when the context fills up, while the full record stays in the journal.
You stay in control
/planputs the agent in read-only mode: it explores and proposes a step-by-step plan, while writes, edits, and mutating shell commands are blocked until you say/plan off./goal <task>closes the loop: the model proposes a verify command, you confirm it, and Limbo iterates until it passes.- Steer while it works. Type while a turn is running to redirect it;
Alt+Enterqueues a follow-up for after the task;Escinterrupts. - Side channels.
/btw <question>asks something quick without polluting the history;!<command>runs a shell command yourself, never sent to the model.
Any model, set up in seconds
- Guided setup. On first run with no key, Limbo asks for one and saves it
to
~/.limbo/auth.json(readable only by you).limbo auth loginverifies a key against the provider before saving;limbo modelslists the catalog and which models are ready to use. - Switch without restarting.
Ctrl+L(or/model) opens a searchable picker with recent models first. Pick a model whose provider has no key yet and it asks for one inline.Shift+Tabsteps through thinking levels. - Three wire formats (OpenAI completions, Anthropic messages, OpenAI responses) behind one catalog, with per-provider overrides for relays, renamed key variables, and extra headers.
Fast turns
- Tool calls issued together run concurrently; edits to the same file are serialized.
- Code Mode (
/code-mode) collapses the tool catalog into a singlerun_codetool: the model writes one Python program against a generated SDK, turning many round trips into one.
Nothing hidden
/tracing-vieweropens a local web page with a live view of every LLM request, tool call, and token count in the session./exportdumps the session as a full JSONL log (request bodies, usage, tool results, errors) or as readable Markdown.
A TUI worth living in
- Limbo Dusk, the default theme, with
limbo-darkandlimbo-lightalternatives, all checked for contrast. - Follows Omarchy. On an Omarchy desktop Limbo picks up the system theme and switches live when you change it.
- Limbo Motion. Subtle animation that tells the story from unsettled to
settled. Set
[ui] motion = "reduced"or"off"if you prefer stillness (SSH sessions default to reduced). Ctrl+Pcommand palette, image and file paste withCtrl+V, collapsible tool output withCtrl+O.
Scriptable
limbo --headless gives the same agent as a line-oriented REPL, and
limbo --json prints one JSON event per line so scripts can drive it without
parsing the screen. Inside the Herdr multiplexer, Limbo
reports its working, idle, and blocked state to the pane.
Quick start
Requires Python 3.11 or later.
pip install limbo-code
cd ~/code/my-project
limbo # first run asks for an API key
Prefer to set up keys first:
limbo auth login # choose a provider, paste a key, verified and saved
limbo auth list # where each provider's key comes from
limbo models # what you can run right now
limbo -m glm-4.7 # one run on a different model
limbo -m kimi-k3:high # ...with a thinking level
Then just describe the task: "find why the login test is flaky and fix it".
Everyday use
| Key | Action |
|---|---|
Enter / Shift+Enter |
send / new line |
Alt+Enter |
queue a follow-up for after the current task |
Esc |
interrupt |
Ctrl+L |
model picker |
Shift+Tab |
cycle thinking level |
Ctrl+P |
command palette |
Ctrl+S |
sessions |
Ctrl+O |
expand or collapse tool output |
| Command | What it does |
|---|---|
/model [name] |
switch model (picker when bare); persists to config |
/plan [on|off] |
read-only mode: explore and propose, mutations blocked |
/goal <task> |
iterate until a confirmed verify command passes |
/code-mode [on|off] |
one run_code tool: a Python program, many tool calls |
/btw <question> |
side question that stays out of history |
/compact |
compact the conversation now |
/sessions /new |
switch to a past session, or start fresh |
/fork [n] |
branch into a new session (optionally keep only the first n turns) |
/handoff <brief> |
clean context seeded with a brief, linked to this session |
/export [path] |
full JSONL log, or Markdown when the path ends in .md |
/tracing-viewer [id|off] |
live trace of this session in your browser |
!<command> |
run a shell command yourself, outside the conversation |
From the shell: limbo --continue resumes the latest session for the current
directory, limbo --resume <id-prefix> resumes any session.
Models and providers
| Provider | Wire format | Endpoint |
|---|---|---|
deepseek |
openai-completions | https://api.deepseek.com/v1 |
moonshotai (Kimi) |
openai-completions | https://api.moonshot.ai/v1 |
kimi-coding |
anthropic-messages | https://api.kimi.com/coding |
glm (GLM Coding Plan) |
openai-completions | https://open.bigmodel.cn/api/coding/paas/v4 |
codex (OpenAI Codex) |
openai-responses | https://api.openai.com/v1 (relay expected) |
Unknown model ids fall back to generic OpenAI-compatible defaults, and the
model picker can connect any OpenAI-compatible endpoint. Everything can also
live in ~/.limbo/config.toml:
[llm]
model = "deepseek-v4-pro" # endpoint and key variable come from the catalog
[providers.codex] # override one provider only
base_url = "https://my-relay.example.com/v1"
api_key_env = "CODEX_API_KEY"
headers = { x-relay = "on" }
[ui]
theme = "auto" # Omarchy if installed, else limbo-dusk
motion = "full" # full | reduced | off
Make it yours
- Project instructions. Limbo reads
AGENTS.mdfrom the working directory and~/.limbo/AGENTS.mdinto its system prompt. - Skills. Drop a
SKILL.mdinto<project>/.agents/skills/<name>/or~/.limbo/skills/<name>/. The model loads it when the task matches, or you call it as/<name>. See docs/skills.md.
Safety
There are no fences. Tools run immediately and unconfined: file tools
honor absolute paths and symlinks anywhere, there is no sensitive-file
blocklist, and bash runs every command as written, rm -rf included. Use
/plan when you only want the agent to look, run Limbo with trusted models,
and keep it in repositories you can afford to modify or lose.
[tools]
bash_enabled = false # if you need a hard stop
Development
uv sync # dev tools are a PEP 735 group, installed by default
make check # sync + tests + lint + typecheck
Individually, always python -m pytest, never uv run pytest (which can fall
through to a global pytest on PATH):
uv run python -m pytest tests/ -v
uv run ruff check src tests
uv run mypy src
The screenshot above is rendered from the real UI by
scripts/readme_hero.py (uv run python scripts/readme_hero.py), so it can't
drift from what ships.
Learn more
AGENTS.md: architecture and design decisionsCONTEXT.md: domain glossarydocs/session-management.md: sessions, recovery, fork and handoff, tracing viewerdocs/skills.md: writing skillsdesign/: RFCs for headless mode, bang commands, and the UI
Metadata
Release files for limbo-code 0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| limbo_code-0.3.tar.gz | 1.4 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| limbo_code-0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.7 MB
Release files / limbo_code-0.3.tar.gz
| Download URL | limbo_code-0.3.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e41c9466025d102841f1677736e260e90ae6215a149dac5d717b85bc71856655
|
|
BLAKE2b-256 checksum How to use checksums |
a78be1104892464cc714a5d1144f4bfde4b9fee8b59e19ec004a3ed985f0facf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / limbo_code-0.3-py3-none-any.whl
| Download URL | limbo_code-0.3-py3-none-any.whl |
|---|---|
| Size | 284.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
122a4cbcb9ee8fa8c1b535dd43357103bdc1c5cce6173f94ffbd2e7cafbf2496
|
|
BLAKE2b-256 checksum How to use checksums |
6425db92e9357e186901a303b06c2f7014544b5df13ceb0f99340634043608a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logSecurity for limbo-code 0.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for limbo_code-0.3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.