The smallest thing between your terminal and a model.

iota is an agent CLI written in Rust. You configure agents — a model, a prompt, a set of tools — and run them: iota run <agent>.

$brew install iotash/tap/iota

orcargo install --git https://github.com/iotash/iota

v0.1.0  ·  7.56 MiB  ·  MIT  ·  macOS, Linux and Windows

~/work/iotaclaude-sonnet-4
$ iota run coder
AGENTS.md · 3 skills · 2 mcp servers · sandbox on
why does the resume test hang on linux?
bash cargo test --test session resume
hung after 60s · exit 101
The child keeps the write end of the pipe open.
session::writer drops its handle only after the
bundle flushes, so read_to_end never returns.
let (rx, tx) = pipe()?;drop(tx);  // ← before the await
⠹ thinking24.3k / 200k

An actual session — agent mode, one bash call, one answer. No cuts.

# why it is small

The terminal is already an interface: it has scrollback, a clipboard, pipes and a shell. We did not want to rebuild any of that in a window, so iota adds the one thing the terminal is missing — a model that can use your tools — and stops there. Nothing it does is hidden from you: a session is a directory holding meta.json and messages.jsonl, one JSON record per line, appended as you talk, and /debug shows the exact request and response bodies that went over the wire. The config is one YAML file with three maps in it. There is no account, no daemon and no telemetry. And there is nothing to be locked into — any endpoint that speaks OpenAI, Anthropic or Gemini works, including one you run yourself, and a child agent is just iota run <agent> -m "<task>" run from bash, like anything else.

# what it is, and is not

it does

run an agent you named in the config — its model, its prompt, its tools

call MCP tools, and run bash inside an OS sandbox (macOS and Linux)

stream a reply, and let you keep typing while it arrives

render markdown, tables and math as ANSI, inline

save every session as plain text you can resume, grep or delete

it does not

run before you configure an agent — iota config init writes the first one

run a daemon or a server, or leave anything running after you quit

ask you to sign in, or phone home

write outside the project root unless you say so

wrap the model in a framework you have to learn first