~/solo <100 lines 1 file 3 deps 1 tool public domain

Solo_

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.

Get Solo

Straight into your Bash shell as a function

. <(curl -fsSL solo.luxferre.top/solo)

Or keep the file and run it later

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.

Non-interactive mode

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.

Subagents

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.

REPL commands

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.

Commands understood by the prompt loop:
CommandEffect
/helpPrint the built-in command list
/quitLeave the agent and restore the host shell
/clearDrop the history, keep the system prompt
/modelsList 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
!cmdRun a shell command yourself, with no agent and no tokens spent
Ctrl-DEnd of input exits as cleanly as /quit

Environment variables

Every knob, with the value used when it is unset:
Variable Default Meaning
SOLO_ENDPOINThttps://api.kilo.ai/api/openrouterBase LLM endpoint URL
SOLO_MODELkilo-auto/freeAny model id the endpoint serves
SOLO_TEMP0.7Sampling temperature
SOLO_REASONhighReasoning effort level
SOLO_API_KEYunsetOptional API token
SOLO_TIMEOUT120Tool call timeout, in seconds
SOLO_TMPDIR$TMPDIR/soloScratch space for temporary artifacts, and where subagents live
SOLO_SYSPROMPTbuilt-inReplaces the system prompt entirely
SOLO_SKILLSunsetDirectory of skills
SOLO_TOOLSunsetDirectory of extra shell tools
NO_COLORunsetDisables ANSI colors