furb runs a model as a programmer, not as a caller of tools. You give the model a task. It answers with a short Python program, which furb calls a word. furb checks the word, runs it, and shows the model what happened. The model writes its next word, and so on, until it gives you its answer.
Each step goes into a record: each word, each answer of a model, and each result of a command. Stop furb at any time, open the record again, and the work goes on from where it stopped.
Why it matters
- One answer does a lot of work. Most agents call one tool for each turn of the model. In furb, one word reads files, runs commands, asks other models, waits for them, and joins the results with loops and conditions.
- Nothing is hidden from you. The whole system prompt is one Python file,
src/furb/engine.py, smaller than 6520 tokens. The transcript is the exact text that the model reads. - A word is checked before it runs. A type checker reads each word first. A word that it refuses never runs, and the model reads why.
- The record is the truth. A life that a crash stopped goes on from its record. A later run replays it exactly, and an audit checks it with no model and no network.
- Work runs side by side. A word can start many commands and questions, then wait for all of them. Chains, which are separate conversations, work in parallel, each with its own state.
- You stay in control. The model can ask you a question and wait for your answer. You can pause any work, set a dollar ceiling, rewind a chain to an earlier point, or change the plan of a model while it works.
- Extensions are Python too. An extension is a word that each chain runs, so the model reads it as it reads its own work. Five come with furb: the memory of a project, its skills, compaction, the web, and a guide to extend furb.
Install
| Where | Command | What you get |
|---|---|---|
| PyPI | pip install furb |
The Python package and furb, the command line. It needs Python 3.14 or later. |
| npm | npm install furb@npm:@uael/furb |
The engine for Node.js 22 or later and Bun 1.4.2 or later, with no Python. |
| Rust | cargo add furb --git https://github.com/uael/furb |
The engine for a program of Rust, with no Python. Copy the Cargo.lock of furb into a new crate before its first build, since a newer version of a dependency breaks the build today. |
furb asks the models of the claude command line when it finds it,
then the models of each provider whose key stands in the environment, such as ANTHROPIC_API_KEY, then the models of
a local server. The page of models says how to choose one.
A first life
The TUI runs from a clone of this repository, with no Python. It needs Git, Bun 1.4.2 or later and the Rust toolchain, and the TUI says how to install them on macOS, Linux and Windows. The first build takes some minutes:
git clone https://github.com/uael/furb && cd furb
bun install && bun run build # The TypeScript package that the TUI runs on.
bun run demo # Watch a life that plays by itself. It asks no model and costs nothing.
bun run tui # Start a real life on your models.
In a program, a life is a few lines. This one asks for a plan, and keeps its record in release.jsonl:
import asyncio
import furb
async def main() -> None:
life = await furb.open("release.jsonl")
print(await life.prompt(str, "Plan the release of version 2."))
asyncio.run(main())
Stop it while the model works, and run it again: it finds its prompt in the record and goes on, and no answer of the model is asked for twice. The examples show the same program in TypeScript and in Rust, and four more.
The words of furb
- A life is one run of furb, and its record is the file that holds it.
- A chain is a conversation with its own state. A life starts with one chain, and a word can start more.
- A prompt asks a model, or you, for an answer of a type, such as
strorint. - A word is the Python that a model writes for one step, and a rung runs it.
- An act is each thing that a word does: a read, a command, a prompt, a wait.
- The operator is you.
Documentation
| To | Read |
|---|---|
| Use the TUI | The TUI, and a picture of each screen |
| Run a life in a window | The desktop app |
| Choose a model, or use a local one | Models |
| Use furb from a program | The examples, Python, TypeScript |
| Use the command line | The command line, and its JSON-RPC |
| Extend furb | Extensions |
| Check a record that someone gave you | The audit |
| Change furb | Contributing, and the contract, every law of the engine |
License
Copyright (C) 2026 Abel Lucas. furb is free software under the GNU Affero General Public License, version 3, which
LICENSEholds. You may use, study, change, and share it. Anyone who ships it, or who runs a changed furb as a service, must offer the source under the same terms. The engine carries no notice of its own, because its text is the system prompt of a model and every word of it counts.
Metadata
Release files for furb 0.3.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 | Actions |
|---|---|---|---|---|
| furb-0.3.3.tar.gz | 87.1 kB | Without provenance | Details for furb-0.3.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| furb-0.3.3-py3-none-any.whl | Python 3 | none | any | Details for furb-0.3.3-py3-none-any.whl |
Total release size: 172.9 kB
Release files / furb-0.3.3.tar.gz
| Download URL | furb-0.3.3.tar.gz |
|---|---|
| Size | 87.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
120f97fe7c7b2d3bf1bd01d389b18ecd7734e6f236fc215bf63cde30730f7405
|
|
BLAKE2b-256 checksum How to use checksums |
161d8bfee5ed5bbf08146c910c8a1a6be81dcabd610e89e6d2aed1086f9085e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / furb-0.3.3-py3-none-any.whl
| Download URL | furb-0.3.3-py3-none-any.whl |
|---|---|
| Size | 85.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ae3acd06996d463d8ad4d0df95ac2c3f3f4eaf179f05a1cc81935dd9fe7e292f
|
|
BLAKE2b-256 checksum How to use checksums |
1c93a6676acd07ce291899ec8c4eb6522f9b98d0db3dcf6cb093c1128abddd69
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for furb 0.3.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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.