Install and first run
Building from source, pointing it at a model, and the first conversation.
Take the binary
Not yet: there is no tagged release, so build it from source as described below. What is already in place is what a release will consist of — an installer that downloads the archive of the newest release, verifies it against the published SHA256SUMS and unpacks the binary into ~/.local/bin or into $PREFIX/bin, never needing root; a Linux x86-64 binary linked statically against musl, so it runs on any distribution; and a Windows x86-64 build cross-compiled with mingw, with the socket transport on named pipes, which compiles but has not been lived in yet.
curl -fsSL https://gitlab.com/porky11/revolve-agent/-/raw/master/install.sh | sh
That line is what will work once the first release exists; until then it has nothing to fetch. Releases and their checksums appear on the releases page, and tools/release.sh in the repository builds and packages the same archives on your own machine today.
Build it
Everywhere else, build it yourself. Revolve is a Rust program and is built with cargo. A stable toolchain new enough for edition 2024 is required.
git clone https://gitlab.com/porky11/revolve-agent
cd revolve-agent
cargo install --path tui
That puts a revolve binary in ~/.cargo/bin. The repository root is a virtual cargo workspace of four members and holds no package of its own, so the path names the member you want: tui is the terminal binary, gui is the revolve-gui window, and core is the task-agent library both are built on, with provider holding the wire formats and the model catalog under it. To try it without installing, cargo run -p revolve inside the clone starts the terminal binary — a bare cargo run cannot choose between revolve and revolve-gui — and everything on these pages that says revolve can be written cargo run -q -p revolve -- instead.
The terminal front end is a crate rather than a feature: core/ never links a terminal library, so a host program embedding the agent depends on task-agent and gets no ratatui, crossterm or idet in its graph. One cargo feature exists:
| Feature | Crate | What it adds |
|---|---|---|
opencode | task-agent | Reading OpenCode's session database when importing conversations. Off by default, because it pulls in a bundled SQLite that nothing else needs. |
Give it a model
The quickest start is an API key in the environment and no config file at all. Revolve reads the key of every provider in the compiled catalog and offers every model those keys reach. Which one it starts on is the first provider a key reaches, preferring anthropic, openai, deepseek, zai, zhipuai and mistral in that order and falling back to any other provider whose key is set, and within that provider the model with the widest context window. A Claude Code login counts as a credential of its own, so revolve login alone is enough as well. It names the model it picked at startup, so you know you are on the fallback.
export ANTHROPIC_API_KEY=sk-...
revolve
For anything beyond that — a different endpoint, several providers, a thinking effort, a declared context window — write ~/.config/task-agent/config.cfg as described under Configuration.
The first conversation
Run revolve in the directory you want worked on. That directory is the sandbox: it is what the agent may read and write, and nothing above it.
cd ~/projects/my-thing
revolve
You get a full-screen view with your input at the bottom and the conversation above it. Type a message and press Enter. The answer streams in as it is written. Esc stops a turn that is running; Ctrl+Q quits.
Some things worth doing in that first session:
/helplists every chat command and every skill installed./infoprints which model you are on, where the session file is, and what the turn has cost so far./name my-sessiongives the conversation a name, sorevolve my-sessionbrings it back later.
The first time the agent wants to run a command no rule covers, it stops and asks. The prompt refuses to take an answer for the first three quarters of a second, and every further keystroke restarts that pause — a letter meant for the input line can never grant a permission by accident.
Without a terminal
If standard input is a pipe rather than a terminal, revolve runs one turn per input line and prints to standard output. This is the shortest way to check that a build works:
printf '/help\nWhat is 2+2?\n' | revolve
And a single question with a single answer:
revolve -p "Read README.md and tell me the first heading."
In both of these nobody can answer a permission prompt, so an unknown command is denied with a note instead of asking. --allow-all runs it anyway, and never overrides a deny rule.
Where it keeps things
| Path | What is there |
|---|---|
~/.config/task-agent/config.cfg | The config file, with providers/ beside it |
~/.config/task-agent/permissions | The global permission rules, written with defaults on first run |
~/.config/task-agent/projects/<dir>/permissions | Per-project rules, written when you allow something always |
~/.config/task-agent/skills/ | Skills available in every project |
~/.config/task-agent/prompts/ | Prompt templates, each usable as /<name> |
~/.config/task-agent/packages/ | Installed skill packages |
~/.local/state/task-agent/projects/<project>/sessions/ | The conversations, one folder per repository, as readable text files |
~/.local/state/task-agent/refinements/ | Snapshots taken before memory is rewritten |
~/.local/state/task-agent/input-history/ | What you typed, per working directory, for arrow-up recall |
~/.local/state/task-agent/drafts/ | A message typed but never sent, put back at the next start |
$XDG_CONFIG_HOME and $XDG_STATE_HOME are honored where they are set.