Skip to main content

Zrb Logo

🤖 Zrb: A Coding Agent With a Build System Inside

Zrb is a terminal coding agent you can wire into a build pipeline.

The agent part you already know: zrb llm chat is a full coding session in your terminal.

The other half is why Zrb exists. A skill can tell an agent to run the tests before deploying; a DAG makes it impossible not to. Zrb ships both — same file, same language, one pip install.

Contribution Guidelines | Report an Issue


📑 Table of Contents


1. Start where you'd start with any coding agent

pip install zrb
export OPENAI_API_KEY="your-key-here"   # or Anthropic, Gemini, Ollama, OpenRouter, ...

zrb llm chat

That's a full agent session: it reads and writes files, runs commands behind a permission gate, searches the web, and remembers the conversation across restarts. If you already have .claude/skills/ or CLAUDE.md in the repo, it picks them up.

Zrb Chat

For most days, this is the whole product. Stop reading here if that's what you came for.


2. Then you hit the thing prompting can't fix

You write a skill: "always run the tests before deploying." It works. Usually.

Then one run the model decides the tests are unrelated to the change. Another run it runs them, misreads a green summary under a red failure, and deploys anyway. A third run it deploys to staging because the prompt didn't say which environment. Nothing crashed — the agent did what it thought you meant, and you find out on Monday.

The problem isn't prompt quality. It's that a skill is advice, and some steps need to be a guarantee. So write those as a graph instead:

# zrb_init.py
from zrb import cli, CmdTask, LLMTask

write_fix = LLMTask(
    name="write-fix",
    message="Read the failing test output and fix the bug in src/.",
)
run_tests = CmdTask(name="run-tests", cmd="pytest -x")
deploy = CmdTask(name="deploy", cmd="./deploy.sh production")

cli.add_task(deploy)

write_fix >> run_tests >> deploy   # the agent proposes; the pipeline decides
zrb deploy

run-tests is not a suggestion the model can reason its way around. It is an edge in a graph. If pytest exits non-zero, deploy never starts, and zrb deploy exits with pytest's own exit code — which is what your CI actually branches on.

This is the part no amount of prompt engineering reaches, and it's why the agent lives inside an automation framework instead of the other way around:

  • The agent is one node, not the administrator. Its answer flows downstream through XCom and gets checked by the next step.
  • Readiness is a loop, not a request. HttpCheck/TcpCheck wait for a service to actually come up. "Wait until it's ready" is not a prompt-able behavior.
  • Failure is a number. Tasks exit with the underlying command's code, so CI can tell a lint failure from a deploy failure.
  • Scheduled and triggered runs have no one to ask. At 3am there is nobody to approve a tool call, so the boundaries have to be structural.

3. And sometimes you just want the one command

No session, no pipeline, no config:

zrb please "find every file over 100MB in this repo"
find . -type f -size +100M
📋 Copied to clipboard

It runs on the small model, answers in a couple of seconds, and puts the result on your clipboard instead of running it. Same install, same API key, none of the ceremony.


4. A fuller example: let the agent draw your codebase

Same shape as section 2, with a real payoff: an LLMTask reads your source and writes a Mermaid diagram, then a CmdTask renders it to PNG. The agent does the part that needs judgment; the shell does the part that needs to be exact.

Prerequisites

  • An LLM API key, set as in section 1 (export OPENAI_API_KEY="your-key-here"; OpenAI is the default provider).
  • Mermaid CLI, which renders Mermaid scripts to images:
    npm install -g @mermaid-js/mermaid-cli
    

Define the pipeline

Add the following to your existing zrb_init.py file (or create a new one if you prefer to keep examples separate):

# zrb_init.py (continued)
from zrb import cli, LLMTask, CmdTask, StrInput, Group, Tpl
from zrb.llm.tool.code import analyze_code
from zrb.llm.tool.file import write_file

# Create a group for Mermaid-related tasks
mermaid_group = cli.add_group(Group(
    name="mermaid",
    description="🧜 Mermaid diagram related tasks"
))

# Task 1: Generate a Mermaid script from your source code using an LLM
make_mermaid_script = mermaid_group.add_task(
    LLMTask(
        name="make-script",
        description="Create a mermaid diagram from source code in the current directory",
        input=[
            StrInput(name="dir", default="./"),
            StrInput(name="diagram", default="state-diagram"),
        ],
        message=(
            "Read all necessary files in {ctx.input.dir}, "
            "make a {ctx.input.diagram} in mermaid format. "
            "Write the script into `{ctx.input.dir}/{ctx.input.diagram}.mmd`"
        ),
        tools=[analyze_code, write_file],
    )
)

# Task 2: Convert the Mermaid script into a PNG image using CmdTask
make_mermaid_image = mermaid_group.add_task(
    CmdTask(
        name="make-image",
        description="Create a PNG from a mermaid script",
        input=[
            StrInput(name="dir", default="./"),
            StrInput(name="diagram", default="state-diagram"),
        ],
        cmd=Tpl("mmdc -i '{ctx.input.diagram}.mmd' -o '{ctx.input.diagram}.png'"),
        cwd=Tpl("{ctx.input.dir}"),
    )
)

# Set up the dependency: the image task runs after the script is created
make_mermaid_script >> make_mermaid_image

Run it

From any project with source code:

git clone https://github.com/someuser/my-python-project.git
cd my-python-project
zrb mermaid make-image

Zrb asks for the directory and diagram name; press Enter to accept the defaults (./ and state-diagram). The agent analyzes your code and writes the Mermaid script, then mmdc renders it to a PNG.

State Diagram

🔥 Why Zrb?

  • 🤖 A coding agent you program in Python. Tools, hooks, prompts, permission policies and history processors are plain Python in your zrb_init.py — not a config format, not a separate SDK.
  • 🔒 Determinism where it matters. Put the model between deterministic steps and keep approvals, sandboxing and ordering under your control instead of the model's judgment.
  • 🐍 Pure Python, no DSL. Tasks are objects; >> is the dependency operator.
  • 💻 Terminal, web UI, or CI. The same task definition runs in all three.
  • 🧩 Bring your Claude Code assets. Skills, hooks and MCP servers work as-is.
  • 🌍 Open source, and white-labelable into your own branded CLI.

🖥️ Try the Web UI

zrb server start

Open http://localhost:21213. The server binds to 127.0.0.1 by default, so the UI is reachable only from the local machine. Full details: Web UI Guide.

Safety boundary: Zrb's web UI can start and control automation tasks, so it is not intended to be exposed publicly without deliberate hardening. If you set ZRB_WEB_HTTP_HOST to a non-loopback address, enable authentication and replace the documented default admin password and secret key with unique values. Startup warnings call out unsafe network-exposed configurations; see the Web UI Guide before using a shared or public bind.

Zrb Web UI


🧩 Program Your AI Agent

zrb llm chat works out of the box — but the moment you need it to do something specific, you don't reach for a config file or a separate SDK. You write Python, in the same file where you define the rest of your automation.

Every part of the agent is a value you can supply or a callable you can register:

You want to… You write a…
Give the agent abilities custom tool — a plain Python function it can call in-process
React to what it does lifecycle hook — fires on tool calls, prompts, session start/end
Gate dangerous actions permission policy / async approval channel
Inject live context into the prompt dynamic prompt section — a lambda ctx: ... evaluated per request
Keep long conversations affordable history processor — prune, redact, or summarize the message history
Route by cost or task a model callable — pick the model per request

Example: a custom tool the agent calls in-process

from zrb import cli, LLMChatTask

# A normal Python function becomes a tool — typed args + docstring are the spec.
async def get_open_incidents(team: str) -> str:
    """Return the current open incidents for a given team."""
    return my_oncall_db.query(team)  # your code, running in-process

chat = LLMChatTask(name="ops-chat", tools=[get_open_incidents])
cli.add_task(chat)

The part nothing else does: the agent is a pipeline node

Because an LLMTask is just a Zrb task, you can wire it between deterministic steps. Its answer flows downstream through XCom, and your tools can call straight into your codebase:

fetch_ticket >> triage_with_llm >> route_to_team

👉 Full walkthrough and every hook in one place: Programming the Agent. Runnable example: examples/agent-in-pipeline.


⚙️ Installation & Configuration


🤝 CI/CD Integration

See the CI/CD Integration Guide for examples with GitHub Actions, GitLab CI, and Bitbucket Pipelines.


🗺️ Documentation Directory

Zrb scales from a one-line zrb please to a hundred-node pipeline with an agent in the middle.

Here for the agent? Programming the Agent → Extending the LLM → Permission Policy.

Here to write pipelines? Tasks & Execution Lifecycle → CLI and Groups → Inputs.

Prefer copy-pasting a working example? See examples/.

docs/adr/ and docs/technical-specs/ are maintainer-facing design history, not part of the reading path below.

I. The Agent

Shaping zrb llm chat and the LLM task types.

II. Core Concepts

The foundational pillars of the framework.

III. Task Types

All task types available in Zrb, from basic to advanced.

IV. Advanced Topics

V. Contributing

VI. Configuration

VII. Examples

  • examples/ — runnable zrb_init.py for every topic above, grouped by category

VIII. Changelog


🎥 Demo Video

Watch a video demonstration of Zrb in action:

Video Title


💖 Support Zrb

If you find Zrb valuable, please consider showing your support:


🎉 Fun Fact

Did you know? Zrb is named after Zaruba, a powerful, sentient Madou Ring that acts as a guide and support tool in the Garo universe.

Madou Ring Zaruba (魔導輪ザルバ, Madōrin Zaruba) is a Madougu which supports bearers of the Garo Armor. (Garo Wiki | Fandom)

Madou Ring Zaruba on Kouga's Hand

Release files for zrb 3.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zrb 3.8.0
File Size Uploaded
zrb-3.8.0.tar.gz 2.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for zrb 3.8.0
File Interpreter ABI Platform
zrb-3.8.0-py3-none-any.whl Python 3 none any Details

Total release size: 5.0 MB

Release files / zrb-3.8.0.tar.gz

Download URL zrb-3.8.0.tar.gz
Size 2.3 MB
Tags Source
SHA-256 checksum
How to use checksums
5d51511d82d30749d98c95e7fe457edb4d39c975ada37154223d7fae01a6d411
BLAKE2b-256 checksum
How to use checksums
870ae1bdaa2914a46b47b50fb9cc373db5831e2dbd2c9daf4539db7ec6955076
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.1 CPython/3.14.6 Linux/6.2.1-PRoot-Distro

Release files / zrb-3.8.0-py3-none-any.whl

Download URL zrb-3.8.0-py3-none-any.whl
Size 2.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
55e1f5472947dc05e50c8e5277e50a7a9a78c6bd7e0542c9eb46e8bbdb208152
BLAKE2b-256 checksum
How to use checksums
30406e407cdb7104dc6052945043278c220b5829b53453076bcc9e005f9ea0de
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.1 CPython/3.14.6 Linux/6.2.1-PRoot-Distro

Release history Release notifications | RSS feed

This release

3.8.0 This release

2 release files

3.7.0

2 release files

3.6.1

2 release files

3.6.0

2 release files

3.5.0

2 release files

3.4.1

2 release files

3.4.0

2 release files

3.3.0

2 release files

3.2.0

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.67.7

2 release files

2.67.6

2 release files

2.67.5

2 release files

2.67.4

2 release files

2.67.3

2 release files

2.67.2

2 release files

2.67.1

2 release files

2.67.0

2 release files

2.66.1

2 release files

2.66.0

2 release files

2.65.5

2 release files

2.65.4

2 release files

2.65.3

2 release files

2.65.2

2 release files

2.65.1

2 release files

2.65.0

2 release files

2.64.0

2 release files

2.63.0

2 release files

2.62.2

2 release files

2.62.1

2 release files

2.62.0

2 release files

2.61.0

2 release files

2.60.0

2 release files

2.59.0

2 release files

2.51.0

2 release files

2.50.9

2 release files

2.50.8

2 release files

2.50.7

2 release files

2.50.6

2 release files

2.50.5

2 release files

2.50.4

2 release files

2.50.3

2 release files

2.50.2

2 release files

2.50.1

2 release files

2.46.0

2 release files

2.45.0

2 release files

2.44.0

2 release files

2.43.1

2 release files

2.43.0

2 release files

2.42.1

2 release files

2.42.0

2 release files

2.41.0

2 release files

2.40.1

2 release files

2.40.0

2 release files

2.39.0

2 release files

2.38.0

2 release files

2.37.0

2 release files

2.36.0

2 release files

2.35.3

2 release files

2.35.2

2 release files

2.35.1

2 release files

2.35.0

2 release files

2.34.3

2 release files

2.34.2

2 release files

2.34.1

2 release files

2.34.0

2 release files

2.33.4

2 release files

2.31.0

2 release files

2.30.1

2 release files

2.30.0

2 release files

2.29.0

2 release files

2.28.6

2 release files

2.28.5

2 release files

2.28.4

2 release files

2.28.3

2 release files

2.28.2

2 release files

2.28.1

2 release files

2.28.0

2 release files

2.27.1

2 release files

2.27.0

2 release files

2.26.9

2 release files

2.26.8

2 release files

2.26.7

2 release files

2.26.5

2 release files

2.26.4

2 release files

2.26.3

2 release files

2.26.2

2 release files

2.26.1

2 release files

2.26.0

2 release files

2.23.1

2 release files

2.23.0

2 release files

2.22.8

2 release files

2.22.7

2 release files

2.22.6

2 release files

2.22.5

2 release files

2.22.4

2 release files

2.22.3

2 release files

2.22.2

2 release files

2.22.1

2 release files

2.22.0

2 release files

2.21.1

2 release files

2.21.0

2 release files

2.20.2

2 release files

2.20.1

2 release files

2.20.0

2 release files

2.19.1

2 release files

2.14.2

2 release files

2.14.1

2 release files

2.14.0

2 release files

2.13.0

2 release files

2.12.1

2 release files

2.12.0

2 release files

2.11.0

2 release files

2.10.4

2 release files

2.10.3

2 release files

2.10.2

2 release files

2.10.1

2 release files

2.10.0

2 release files

2.9.2

2 release files

2.9.1

2 release files

2.9.0

2 release files

2.8.4

2 release files

2.8.3

2 release files

2.8.2

2 release files

2.8.1

2 release files

2.8.0

2 release files

2.7.2

2 release files

2.7.1

2 release files

2.7.0

2 release files

2.6.21

2 release files

2.6.20

2 release files

2.6.19

2 release files

2.6.18

2 release files

2.6.17

2 release files

2.6.16

2 release files

2.6.15

2 release files

2.6.14

2 release files

2.6.13

2 release files

2.6.12

2 release files

2.6.11

2 release files

2.6.10

2 release files

2.6.9

2 release files

2.6.8

2 release files

2.6.7

2 release files

2.6.6

2 release files

2.6.5

2 release files

2.6.4

2 release files

2.6.3

2 release files

2.6.2

2 release files

2.6.1

2 release files

2.6.0

2 release files

2.5.3

2 release files

2.5.2

2 release files

2.5.1

2 release files

2.5.0

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.5

2 release files

2.3.4

2 release files

2.3.3

2 release files

2.3.2

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.15

2 release files

2.2.14

2 release files

2.2.13

2 release files

2.2.12

2 release files

2.2.11

2 release files

2.2.10

2 release files

2.2.9

2 release files

2.2.8

2 release files

2.2.7

2 release files

2.2.6

2 release files

2.2.5

2 release files

2.2.4

2 release files

2.2.3

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.14

2 release files

2.0.13

2 release files

2.0.12

2 release files

2.0.11

2 release files

2.0.10

2 release files

2.0.9

2 release files

2.0.8

2 release files

2.0.7

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.21.9

2 release files

1.21.8

2 release files

1.21.7

2 release files

1.21.6

2 release files

1.21.5

2 release files

1.21.4

2 release files

1.21.3

2 release files

1.21.2

2 release files

1.21.1

2 release files

1.21.0

2 release files

1.20.1

2 release files

1.20.0

2 release files

1.19.0

2 release files

1.18.9

2 release files

1.18.2

2 release files

1.18.1

2 release files

1.18.0

2 release files

1.17.4

2 release files

1.17.3

2 release files

1.17.2

2 release files

1.17.1

2 release files

1.16.3

2 release files

1.16.2

2 release files

1.16.1

2 release files

1.16.0

2 release files

1.15.9

2 release files

1.15.8

2 release files

1.15.7

2 release files

1.15.6

2 release files

1.15.5

1 release file

1.15.4

2 release files

1.15.3

2 release files

1.15.2

2 release files

1.15.1

2 release files

1.15.0

2 release files

1.14.3

2 release files

1.14.2

2 release files

1.14.1

2 release files

1.14.0

2 release files

1.13.3

2 release files

1.13.2

2 release files

1.13.1

2 release files

1.13.0

2 release files

1.12.0

2 release files

1.11.0

2 release files

1.10.2

2 release files

1.10.1

2 release files

1.10.0

2 release files

1.9.17

2 release files

1.9.16

2 release files

1.9.15

2 release files

1.9.14

2 release files

1.9.13

2 release files

1.9.12

2 release files

1.9.11

2 release files

1.9.10

2 release files

1.9.9

2 release files

1.9.8

2 release files

1.9.7

2 release files

1.9.6

2 release files

1.9.5

2 release files

1.9.4

2 release files

1.9.3

2 release files

1.9.2

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.12

2 release files

1.8.11

2 release files

1.8.10

2 release files

1.8.9

2 release files

1.8.8

2 release files

1.8.7

2 release files

1.8.6

2 release files

1.8.5

2 release files

1.8.4

2 release files

1.8.3

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.5

2 release files

1.7.4

2 release files

1.7.3

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.9

2 release files

1.6.8

2 release files

1.6.7

2 release files

1.6.6

2 release files

1.6.5

2 release files

1.6.4

2 release files

1.6.3

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.12

2 release files

1.5.11

2 release files

1.5.10

2 release files

1.5.9

2 release files

1.5.8

2 release files

1.5.7

2 release files

1.5.6

2 release files

1.5.5

2 release files

1.5.4

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.28.0

2 release files

0.27.1

2 release files

0.27.0

2 release files

0.26.2

2 release files

0.26.1

2 release files

0.25.0

2 release files

0.24.1

2 release files

0.24.0

2 release files

0.23.2

2 release files

0.23.1

2 release files

0.23.0

2 release files

0.22.1

2 release files

0.22.0

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.19.0

2 release files

0.18.1

2 release files

0.17.3

2 release files

0.17.2

2 release files

0.17.1

2 release files

0.17.0

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.1

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.10.0

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.99

2 release files

0.0.98

2 release files

0.0.97

2 release files

0.0.94

2 release files

0.0.93

2 release files

0.0.92

2 release files

0.0.91

2 release files

0.0.90

2 release files

0.0.89

2 release files

0.0.88

2 release files

0.0.87

2 release files

0.0.86

2 release files

0.0.85

2 release files

0.0.84

2 release files

0.0.80

2 release files

0.0.77

2 release files

0.0.76

2 release files

0.0.75

2 release files

0.0.74

2 release files

0.0.73

2 release files

0.0.72

2 release files

0.0.71

2 release files

0.0.70

1 release file

0.0.69

1 release file

0.0.68

2 release files

0.0.67

2 release files

0.0.66

2 release files

0.0.65

2 release files

0.0.64

2 release files

0.0.63

2 release files

0.0.62

2 release files

0.0.61

2 release files

0.0.56

2 release files

0.0.55

2 release files

0.0.54

2 release files

0.0.53

2 release files

0.0.52

2 release files

0.0.51

2 release files

0.0.49

2 release files

0.0.48

2 release files

0.0.44

2 release files

0.0.43

2 release files

0.0.42

2 release files

0.0.41

2 release files

0.0.40

2 release files

0.0.39

2 release files

0.0.32

2 release files

0.0.31

2 release files

0.0.30

2 release files

0.0.29

2 release files

0.0.28

2 release files

0.0.27

2 release files

0.0.26

2 release files

0.0.25

2 release files

0.0.24

2 release files

0.0.23

2 release files

0.0.22

2 release files

0.0.21

2 release files

0.0.20

2 release files

0.0.19

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page