A coding agent in under 100 SLOC of Bash with exactly one tool: the shell.
Running commands is the only thing it knows how to do,
and the only thing it does.
. <(curl -fsSL solo.luxferre.top/solo)
curl -fsSLO https://solo.luxferre.top/solo chmod +x solo ./solo
Dependencies: bash, curl,
jq, coreutils timeout command.
Note: If you're looking for the pure C version, see the Solo-C repo instead.
Hand Solo a prompt as an argument and it runs that one task and exits: no
editor, no prompt loop. The answer arrives on stdout together
with progress and token stats, the ready banner on stderr, so a
task drops straight into pipes, scripts and cron.
./solo "list every TODO in this repo and fix the trivial ones" | tee todo-report.md answer=$(solo "summarize the last commit") solo '!make test'
All words are joined into one task, so quoting is optional, and an empty or
missing argument opens the REPL instead. Solo exits 0 when the
task is done, 1 when it failed or the endpoint was
unreachable, 130 on Ctrl-C, and with the command's
own status for !cmd.
Solo splits large work by itself. The system prompt tells it to copy the
current session file .solo_sess.json into a fresh directory
under $SOLO_TMPDIR and launch another copy of itself from
there, on the same endpoint and with the same model, tools and system
prompt:
mkdir -p $SOLO_TMPDIR/sub1 && cp .solo_sess.json $SOLO_TMPDIR/sub1/ cd $SOLO_TMPDIR/sub1 SOLO_ENDPOINT=https://api.kilo.ai/api/openrouter ~/solo 'audit the SQL layer, read-only'
The subagent runs its own tool loop in its own session file and reports its
final answer on stdout, so independent subtasks can run in
parallel without filling the caller's context with their tool output. The prompt names Solo's own path, so keep it
as a file on disk — sourcing it from a pipe leaves no copy to
re-launch — when you want subagents.
Any line not starting with / or ! is sent to the agent as
a task. A trailing backslash continues the prompt onto the next line, so multi-line
input needs no quoting. Any of them also works as a one-shot argument, as in
./solo /models, which prints the list and exits.
| Command | Effect |
|---|---|
| /help | Print the built-in command list |
| /quit | Leave the agent and restore the host shell |
| /clear | Drop the history, keep the system prompt |
| /models | List model ids offered by the endpoint |
| /api_key [key|null] | Show, set or clear the API token. null, none, off or - clears it |
| /endpoint [url] | Show or set the API base URL |
| /name [value] | Set any request parameter, e.g. /model stealth/yet-another-cool-model, /temperature 0.5, /reasoning_effort low. With no value it prints the current one |
| !cmd | Run a shell command yourself, with no agent and no tokens spent |
| Ctrl-D | End of input exits as cleanly as /quit |
| Variable | Default | Meaning |
|---|---|---|
| SOLO_ENDPOINT | https://api.kilo.ai/api/openrouter | Base LLM endpoint URL |
| SOLO_MODEL | kilo-auto/free | Any model id the endpoint serves |
| SOLO_TEMP | 0.7 | Sampling temperature |
| SOLO_REASON | high | Reasoning effort level |
| SOLO_API_KEY | unset | Optional API token |
| SOLO_TIMEOUT | 120 | Tool call timeout, in seconds |
| SOLO_TMPDIR | $TMPDIR/solo | Scratch space for temporary artifacts, and where subagents live |
| SOLO_SYSPROMPT | built-in | Replaces the system prompt entirely |
| SOLO_SKILLS | unset | Directory of skills |
| SOLO_TOOLS | unset | Directory of extra shell tools |
| NO_COLOR | unset | Disables ANSI colors |