60-second taste¶
~/projects — do
$ pipx install doer-cli
installed package doer-cli 0.3.0, installed using Python 3.13
· do (short form)
· doer (long form)
$ do "find files larger than 100MB"
./video.mp4 412M
./archive.tar.gz 168M
./model.bin 124M
$ cat error.log | do "what broke"
redis connection timeout at 14:22 —
likely the REDIS_URL env var is stale.
$ do --img screenshot.png "what's in this UI?"
login form, 3 fields, submit button disabled.
a password validator is throwing — check password_regex.py:22
$ do --train 200 && DOER_PROVIDER=mlx DOER_ADAPTER=~/.doer_adapter do "reply terse"
loading 127 turns...
training LoRA (rank 8, 200 iters)...
✓ saved → ~/.doer_adapter
ok.
$
why doer¶
Not a chatbot. Not a wrapper. grep with a brain.
-
Pipes > GUIs
stdinin,stdoutout. Chain it. Cron it. Ship it. -
No state
Every call is pure. The filesystem is the memory.
-
Small is kind
~730 lines of Python. Core is one dep. Auditable in an afternoon. Closes its own training loop (text + VLM).
-
Transparent
Own source in its system prompt. Ask it how it works.
the arrow¶
┌─────┐ ┌──────┐ ┌──────┐
│stdin│ ───▶ │ do │ ───▶ │stdout│
└─────┘ └──────┘ └──────┘