A local-first coding agent.
Runs on your own machine by default. One loop, five tools, zero config.
Think → call tools → feed results back → repeat.
No plugins, no hooks, no middleware.
Loops until the model stops calling tools. All calls in a single turn run in parallel.
A local model by default — no key, no account, nothing leaving the box.
Reach a hosted one only when you ask for it.
A provider is an endpoint — one URL, one credential, one connection pool. Credentials may be absent, an API key, or a renewable subscription grant. Its models get short aliases: qwen, chatgpt, flash. /model switches which one answers for the session.
read File contentswrite Create or overwriteedit Search-and-replacebash Shell commandselisp Live Emacs stateelisp evaluates bounded expressions in a running Emacs server, exposing unsaved buffers, windows, diagnostics, and process output. Load the bundled emacs skill before use.
Reachable, but not tools: skill returns a playbook for the model to follow — prompt engineering, not an action. web is OpenRouter's, executed server-side.
Markdown playbooks the model loads on demand.
Not in the system prompt — pulled in only when needed.
The model sees names + descriptions at startup.
It calls skill("name") when the task matches — no user action needed.
Every message, tool call, and result is appended to a JSONL file.
No mutation, no corruption.
Nothing is summarized. Nothing is silently dropped.
A session is what was said, in order, until you clear it.
No context window is configured anywhere — the server is the
authority on what fits, and it says so by saying no.
When it stops fitting, OneLoop says so and names the fix:
/clear, or a model with a larger window.
Summarizing a thread to keep it alive trades accuracy for length
on your behalf. /clear is the same move, made deliberately.
| Retry with fallback | Retries 3× on transient failures, then offers another model; a rejected request fails at once |
| Bounded waits | Connections and finite responses time out; an active stream may run long, but a stalled one cannot |
| Parallel tools | Multiple calls execute concurrently |
| Output truncation | Large outputs trimmed before re-entering context |
| Stop anywhere | Ctrl+C stops cleanly; session preserved |
| AGENTS.md | Loaded as system prompt if present |
| skills/ | Playbooks loaded on demand via the skill tool |
| Language | Files | Lines |
|---|---|---|
| Rust | 24 | 5,645 |
| HTML | 1 | 439 |
| Markdown | 8 | 1,022 |
| Total | 33 | 7,106 |