model rig · rev 1.5.7 one binary · no runtime · MIT
█▀▄ █ █▀▀
█▀▄ █ █ █
▀ ▀ ▀ ▀▀▀

A real agent for the model you already run.

max · default · auto up 214k down 18k · cache r 211k 99%
❯curl -fsSL https://tryrig.ai/install.sh | sh

linux · macOS · amd64 · arm64 · no Go, no sudo

installs to ~/.local/bin

rig -update keeps the runtime current

99%of every token served from cache, over thousands of real turns
417lines is the whole agent loop, batch included
666commits, most of them written by rig, running inside rig

what it is

rig turns the model on your desk into something that works. Point it at your repo and it reads the code, edits it, runs the tests, and remembers what it learned. One binary, one endpoint, one terminal.

It is small enough to read before you trust it. The loop is a few hundred lines, and everything around it plugs in: tools, guardrails, schedules, workers. Tool calls run concurrently, sessions stay fast for hours because the prompt never wobbles, and the cache does the rest.

Close the laptop. Pick the session back up from your phone.

getting set up

1

Install it

One file lands in your path. Signed releases, and it updates itself in place.

curl -fsSL https://tryrig.ai/install.sh | sh
✓ rig 1.5.7 installed to ~/.local/bin/rig

# later
rig -update

2

Point it at a model

Anything that speaks the OpenAI API, on your desk or hosted: llama.cpp, llama-swap, Ollama, OpenRouter, or any compatible endpoint with a key. Three small files in ~/.rig, and these are real ones.

~/.rig/settings.json · which model, where the endpoint is

{
  "model": "local",
  "baseUrl": "http://127.0.0.1:8090/v1",
  "sandbox": "off",
  "plugins": { "enabled": [] }
}

~/.rig/models.json · one row per model: its window, its budget, its dials

[
  {
    "id": "local",
    "window": 393216,
    "maxTokens": 65536,
    "reserve": 104858,
    "keepRecent": 98304,
    "role": "interactive",
    "effort": "max",
    "efforts": ["low", "high", "max"],
    "vision": true
  },
  {
    "id": "sonnet",
    "window": 200000,
    "maxTokens": 8192,
    "provider": "openrouter",
    "baseUrl": "https://openrouter.ai/api/v1",
    "apiKey": "sk-or-…",
    "reasoning": "reasoning"
  }
]
# switch any time: /models sonnet

~/.rig/workers.json · the fleet: which model background workers run on, and how many at once

{
  "model": "local",
  "slots": 2
}

3

Make it yours

Two optional files. A theme is a base plus the colours you want to change. AGENTS.md in the rig home is your standing instructions, read before every session, ahead of the project's own.

~/.rig/theme.json

{
  "base": "oled",
  "slots": {
    "ember": "#6b7fa3",
    "text": "#b8bfcc",
    "dim": "#3a4150"
  }
}

~/.rig/AGENTS.md

# how I like to work
- run the tests before you say something is done
- prefer small commits with one idea each
- never add a dependency without saying why

4

Run it in a repo

The terminal opens. Ask for something real. Tool calls run in parallel and results land in order, so three reads cost one round trip and the transcript still reads top to bottom.

cd your-project && rig
❯ look around, run the tests in the background, remember what you learn

● todo · create   0/3 · next t1
● read · AGENTS.md
● find · PACKAGE.md
● grep · interface ./core
  three reads admitted together · results applied in call order
  batch ✓ 0.08s

5

Let it run things for you

Hand the slow part to a worker, or put a job on real cron. Workers are sandboxed and keep a transcript you can resume.

❯ have a worker run the full test sweep while we keep going
● delegate · w1 · running in a jail · 3m 12s

❯ /scheduler create health check the fund and note anything odd 0 */2 * * *
scheduler: j8 health · every 2 hours · next fire 14:00

6

Add a tool in one file

A plugin is a Python file: a description, a schema, and a run function. Drop it in and it shows up beside the built-in tools on the next turn. The model can write one too; it lands in a pending folder until you approve it.

~/.rig/plugins/weather.py

DESCRIPTION = "current weather for a city"
SCHEMA = {"type": "object", "properties": {"city": {"type": "string"}}}

def run(args):
    return fetch_weather(args["city"])

❯ /plugins
weather   current weather for a city   plugins/weather.py

7

Organize the work

Tasks live on a board in the repo, with requires and blocks links between them. The model claims, works, and completes; you accept or reject. Add workers and they drain the same board.

❯ /todo
○ t1 map the architecture
○ t2 run the test sweep            requires t1
○ t3 record the durable facts      requires t2

❯ /swarm 2
swarm: added 2 agents · w1 claimed t1 · w2 waiting on t1

8

Come back later

Everything is on disk in the repo: tasks, memory, schedules, sessions. Resume from the phone over SSH, or glance at the dashboard.

rig -resume 1a0d99397efd
session 1a0d99397efd · 214k up · 3 todo · 1 job · resumed