little-coder
A harness optimized to smaller LLMs
Install / Use
npx skills add itayinbarr/little-coderInstalls into whichever agent you are using.
Other
Other agent config
Quality Score
Category
AI & Machine LearningSupported Platforms
Skill content
View source on GitHublittle-coder
A coding agent tuned for small local models, built on top of pi.
The research story behind all this — why scaffold–model fit matters, how a 9.7 B Qwen beat frontier entries on Aider Polyglot, and what the load-bearing mechanisms actually do — is written up on Substack: Honey, I Shrunk the Coding Agent. Start there if you want the "why"; stay here for the "how".
How it relates to pi
pi is the minimal substrate — agent loop, multi-provider API, TUI, session tree, compaction, extension model. Four built-in tools (read / write / edit / bash) and a ~1000-token system prompt.
little-coder is pi + 30-odd extensions + 30 skill markdown files + a Python benchmark harness. It doesn't fork pi or shadow its CLI — pi is a plain dependency in package.json, and everything little-coder-specific lives under .pi/extensions/, skills/, and benchmarks/. It ships no npm install scripts; the launcher does everything at launch time.
The launcher runs pi with --no-extensions and wires in exactly the bundled set. That's what keeps the cold-start context around 7k tokens and makes behavior predictable — the set that loads is the set that ships, and nothing in your working directory changes it mid-task. The consequence is that a globally pi install'd package won't load inside little-coder by default, because pi install registers into pi's settings and --no-extensions skips those.
You have three opt-in ways around that, none of which change the default: drop your own extensions in ~/.config/little-coder/extensions/, point LITTLE_CODER_EXTRA_EXTENSIONS at files anywhere, or relaunch with --with-pi-extensions to let pi discover its own. Run /extensions to see what's loaded. Full guide: Extending little-coder. (Themes are unaffected — pi themes have always loaded.)
If you've never used pi, it's useful to skim pi.dev first — the rest of this doc assumes pi's model of --agent-import-path, --mode rpc, and .pi/extensions/ auto-discovery.
Install
One-line install (Node.js 22.19+ required):
curl -fsSL https://raw.githubusercontent.com/itayinbarr/little-coder/main/install.sh | bash
Or with npm directly:
npm install -g little-coder
Or with bun:
bun add -g little-coder
That's the whole install. No clone, no npm install in a workspace, no PATH fiddling. little-coder is now on your PATH and works from any directory.
Note for
bun add -gusers. The launcher (bin/little-coder.mjs) is a Node.js script with#!/usr/bin/env nodeat the top, so Node ≥ 22.19 still has to be on your PATH for the binary to start — bun is fine for installing/updating the package, but the runtime is Node. If you want a fully node-less setup, replace the shebang in$(bun pm bin -g)/little-coderwith#!/usr/bin/env bun.
Run
cd ~/your-project
little-coder # launches the default model (see below)
little-coder --model llamacpp/qwen3.6-35b-a3b # or name one explicitly
This is the canonical setup little-coder is tuned for: a local llama.cpp server hosting Qwen3.6-35B-A3B. See Local model setup (optional) below for how to serve it.
Bare little-coder (no --model) launches the default model declared in models.json ("default": "llamacpp/qwen3.6-35b-a3b" out of the box), printing its friendly name at startup. This only kicks in on a first run — once you pick a model in-session, that choice sticks and the default never overrides it. Change the default with a default key in your user override file. See Configuring models.
Cloud models work the same way:
little-coder --model anthropic/claude-haiku-4-5
little-coder --model openai/gpt-4o-mini "What does this codebase do?"
little-coder --model ollama/qwen3.5 # local Ollama
little-coder --model lmstudio/local-model # local LM Studio (whatever model you have loaded)
little-coder --list-models # see everything pi knows about
The agent uses the directory you launched it from as its working directory — Read / Write / Edit / Bash operate on your project, not on little-coder's install path.
Interactive features
- Plan Mode — press ctrl+q to toggle (a
◆ PLAN MODEindicator shows below the input), or launch with--plan-mode(LITTLE_CODER_PLAN_MODE=1) to start there. Submit a request and little-coder researches it with sub-coders, asks you 1-3 clarifying questions (each with suggested answers and a free-text option), then writes a plan in the chat instead of editing anything. Esc cancels a plan mid-run. (shift+tab stays pi's thinking-level cycle.) - Deep Research — press f2 (or run
/deep-research <topic>) to scope a topic into a research brief, fan out read-only research sub-coders, and get back one cited markdown report, saved next to your working directory. Esc cancels mid-run. - Keyboard shortcuts — press ctrl+h for a panel of the keys worth knowing;
/hotkeysis the full reference. ctrl+o expands tool output ("more"), ctrl+t toggles thinking blocks, ctrl+p cycles models. - Prompt history — from an empty input, ↑ recalls your recent prompts (most-recent first), ↓ walks forward. History persists across sessions, so a fresh session can recall prompts from earlier runs.
- Sub-coders (
dispatch) — little-coder can spawn isolated child sessions to research a question (read the repo + browse online, read-only) and report back concisely, without cluttering the main conversation. A live panel above the input tracks them. Sub-coders run serially by default (two of them contend for the same local model server and finish slower than one); opt into parallelism withLITTLE_CODER_SUBCODER_CONCURRENCY=2or more. - Sessions — each session is auto-named from your first prompt (rename with
/name) and shown in the terminal tab title. Use/resumeto list and reopen past sessions for the current directory. - Read-before-edit — editing a file requires reading it first, so edits match the file's exact current text.
- Your own extensions — drop them in
~/.config/little-coder/extensions/and they load on the next launch. Run/extensionsto see what's loaded and where it came from. See Extending little-coder.
The status line
The footer at the bottom of the screen looks like this:
↑26k ↓5.4k R447k CH99.8% 9.3%/262k (auto) qwen3.6-35b-a3b • medium
| Field | Meaning |
|---|---|
| ↑26k | Cumulative input tokens billed as fresh across the whole session — not your current context size |
| ↓5.4k | Cumulative output tokens generated |
| R447k | Cumulative tokens read from cache (the prefix your server didn't have to reprocess) |
| W… | Cumulative cache-write tokens; only shown when non-zero |
| CH99.8% | Cache-hit rate of the latest response alone — cacheRead / (input + cacheRead + cacheWrite). Not a session average, so it moves turn to turn |
| 9.3%/262k | Current context usage against the window size. Amber above 70%, red above 90% |
| (auto) | Automatic compaction is enabled |
| right side | Active model, and its thinking level if it's a reasoning model |
A low CH on a long conversation means your server is reprocessing history it should have been able to reuse — worth investigating.
For local providers (llama.cpp, Ollama, LM Studio) pi expects some value in the API-key env even though local servers ignore it:
export LLAMACPP_API_KEY=noop
export OLLAMA_API_KEY=noop
export LMSTUDIO_API_KEY=noop
LLAMACPP_BASE_URL, OLLAMA_BASE_URL, and LMSTUDIO_BASE_URL override the defaults (http://127.0.0.1:8888/v1, http://127.0.0.1:11434/v1, http://127.0.0.1:1234/v1).
For cloud providers, set the standard env (ANTHROPIC_API_KEY, OPENAI_API_KEY, etc.) and pi will discover it.
Local model setup (optional)
Skip this section if you're using a cloud model.
Option A — llama.cpp (fastest for local; supports Qwen3.6-35B-A3B MoE):
# One-time: build llama.cpp with CUDA (sm_XXX = your GPU arch; Blackwell = 120)
git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=120 -DLLAMA_CURL=ON
cmake --build build --config Release -j
# Fetch the model GGUF and the matching vision projector.
# The mmproj (~900 MB) is what lets the model see attached screenshots.
pip install -U "huggingface_hub[cli]"
hf download unsloth/Qwen3.6-35B-A3B-GGUF Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --local-dir ~/models
hf download unsloth/Qwen3.6-35B-A3B-GGUF mmproj-F16.gguf --local-dir ~/models
# Serve it (MoE trick: experts in RAM, attention on GPU → 22 GB model on 8 GB VRAM)
build/bin/llama-server -m ~/models/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf \
--mmproj ~/models/mmproj-F16.gguf \
--host 127.0.0.1 --port 8888 --jinja \
-c 16384 -ngl 99 --n-cpu-moe 999 --flash-attn on
If you only need text and want to skip the projector download, drop the second hf download line and the --mmproj flag — little-coder still works text-only, but the TUI's image attachment will be rejected by the server with a 4xx.
Context window. -c sets the server's context (-c 16384 = 16K above — a conservative default for 8 GB VRAM). little-coder auto-detects the live n_ctx from llama.cpp's /props at startup and registers the model with it, so whatever you pass to -c is what the TUI shows and budgets against — no models.json edit needed. To run larger, relaunch the server with e.g. -c 131072 (128K) or -c 262144 (256K); the KV cache grows with it, so size it to your RAM/VRAM. (--list-models reflects the detected window.)
Option B — Ollama (simpler, but slower on MoE):
curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen3.5 # 9.7B — the paper's model
# or: ollama pull qwen3.6:35b-a3b
Option C — LM Studio (GUI; OpenAI-compatible server on port 1234):
- Install LM Studio and download a model (e.g. Qwen3.6 35B A3B GGUF).
- Open the Developer / Local Server tab, load the model, and click Start Server (default
http://127.0.0.1:1234). - Run little-coder:
The shippedexport LMSTUDIO_API_KEY=noop little-coder --model lmstudio/local-modellmstudio/local-modelid routes to whatever model LM Studio currently has loaded — no extra config needed for the single-model case. If you serve on a non-default port, setLMSTUDIO_BASE_URL=http://127.0.0.1:<port>/v1. To target a specific model when you have several loaded, add an entry to~/.config/little-coder/models.json(see Configuring models below).
Serving from another machine on your LAN. Each provider's *_BASE_URL env var accepts any host, not just 127.0.0.1, so you can run inference on a beefier box and connect from a laptop or another device on the same WiFi.
On the server (the box with the GPU):
- llama.cpp: start
llama-serverwith--host 0.0.0.0(or your specific LAN interface) instead of127.0.0.1. Everything else from Option A unchanged. - LM Studio: in the Server tab, enable Serve on local network so it binds
0.0.0.0:1234instead of127.0.0.1:1234. - Ollama:
OLLAMA_HOST=0.0.0.0:11434 ollama serve(or setOLLAMA_HOST=0.0.0.0in the user systemd unit). - If
ufw/firewalldis active, allow your LAN subnet to the relevant port (e.g.sudo ufw allow from 192.168.0.0/16 to any port 8888 proto tcp). - Find the LAN IP with
hostname -I(Linux) oripconfig getifaddr en0(macOS).
On th
Truncated for display — read the full file on GitHub.
Related Skills
caveman
107.1k🪨 why use many token when few token do trick. Viral skill + proxy for coding agents that cuts 65% of tokens by talking like a caveman.
claude-mem
94.4kPersistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
Understand-Anything
83.5kGraphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.
headroom
73.4kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
