Cursor / Claude Code, but local.
An offline AI pair-programmer in your terminal, powered by Ollama.
Private by default. Free forever.
miii lives in your terminal and codes alongside you — reading files, writing features, running tests, fixing bugs. The twist: it runs on your hardware, powered by Ollama (or any local OpenAI-compatible server like llama.cpp / LM Studio).
Your code never leaves your disk. There's nothing to log in to. Pull a model, type miii, go.
ollama pull qwen2.5-coder:14b # any coding model works
npm install -g miii-agent
miiiThen just talk to it:
> refactor the auth module to use async/await
> @src/server.ts add rate limiting to all POST routes
> why are my tests failing in utils/parser.ts
Needs: Node ≥ 18 and Ollama running locally.
Most "AI coding tools" are just wrappers around a cloud API — slow, metered, and they ship your private codebase to someone else's server.
| Cloud agents | miii | |
|---|---|---|
| Your code | Sent to a third party | Never leaves your machine |
| Cost | Per-token billing | Free — runs on your hardware |
| Setup | API keys, accounts | npm i -g miii-agent |
| Offline | No | Yes |
| Latency | Network + queue | Your GPU only |
It doesn't just chat, either — it decomposes the problem, calls tools, and checks its own work before claiming victory.
small · simple · smart · strategic · semantic — a tiny codebase you can read in an afternoon, no config ceremony, plans before it acts, and operates on the meaning of your code, not blind text matching.
- 🧪
miii doctor— not every local model can drive an agent. Doctor runs your models through real engineering tasks and tells you which ones actually deliver.miii doctor # grade every installed model miii doctor qwen2.5-coder:7b # grade one
- 💧 Lossless output spill — that 50K-line test log won't get truncated and leave the model guessing. miii spills the full output to disk and lets the model page through it. Nothing is ever lost.
- 🔒 Permission-gated tools — you approve what the agent can touch; "always" approvals persist. File tools are confined to your working directory.
- 📄
MIII.md— drop one in your repo to teach miii your conventions, build/test commands, and do's & don'ts. Same idea asCLAUDE.md, read every turn.
Built-in tools
| Tool | Function |
|---|---|
read_file |
Read any file in your workspace |
write_file |
Create new files |
edit_file |
Precise string-level edits, whitespace-tolerant |
glob |
Pattern-match files across the project |
grep |
Regex search across files |
run_bash |
Execute shell commands |
File tools (read_file, write_file, edit_file) reject ../ traversal and absolute paths outside the workspace. run_bash is not path-confined — its only boundary is the permission prompt, so review commands before approving (especially "always"). Saved rules live in ~/.miii/permissions.json.
Keyboard shortcuts
| Key | Action |
|---|---|
Enter |
Send prompt |
@filename |
Attach file to context |
/models |
Switch active model |
/clear |
Reset conversation |
Esc |
Stop generation or tool run |
Ctrl+O |
Toggle full tool output |
Ctrl+C |
Quit |
Configuration & other backends
Settings live in ~/.miii/config.json, created on first run:
{
"model": "qwen2.5-coder:14b",
"ollamaHost": "http://localhost:11434",
"effort": "medium"
}effort (low | medium | high) controls temperature and limits.
miii talks to any OpenAI-compatible local server too. Start llama-server, then point a named provider at it:
{
"model": "qwen2.5-coder-14b",
"provider": "llamacpp",
"providers": {
"llamacpp": { "type": "openai", "baseUrl": "http://localhost:8080" }
}
}Switch at launch with miii --provider llamacpp. Any openai-type provider on localhost counts as local — no key, no cloud.
How it spills output
When a tool result exceeds the inline budget (~10K bytes), the full output is written to ~/.miii/output/<id>.txt. Only a head + tail preview is inlined, with a pointer:
[command output truncated: 5184 lines / 412900 bytes.
Full output at ~/.miii/output/9f3a1c.txt — read it with
read_file offset/limit to see the elided middle.]
The model pages through the middle with ranged read_file reads. Spill files are garbage-collected after 24 hours.
Development
git clone https://github.com/maruakshay/miii-cli.git
cd miii-cli
npm install
npm run devnpm run build # production build
npm run typecheck # type-check src + eval
npm run eval # regression gate (powers `miii doctor`)To run your local working tree against the global miii:
npm run build && npm link # restore later with: npm install -g miii-agentMVP. Core agent loop is stable; actively refining tool execution, streaming, and the permission model. PRs welcome — fork it, break it, improve it.
MIT © maruakshay
Built for engineers who'd rather own their tools than rent them.
