Small process
Compiled to native code, not interpreted. Startup is fast and memory use stays low, so you can run several Nimlet processes without a heavy runtime behind each one.
Point Nimlet at a repo, describe the change, and it inspects, edits, runs the commands you approve, and keeps the session. Extend it in any language so it works the way you do.
$ nimlet
› Fix the failing parser test and run the focused test.
plan Inspect the parser and its tests
read src/parser.nim, tests/parser_test.nim
edit Apply the smallest safe change
bash nimble test parser
done The focused test passes.
Native binary
Nimlet compiles to native code. There is no language runtime to install, startup is fast, and memory stays low enough to run one process per branch, workspace, or CI job.
Compiled to native code, not interpreted. Startup is fast and memory use stays low, so you can run several Nimlet processes without a heavy runtime behind each one.
It waits on you, a provider, or a subprocess. No polls, no timers, no idle CPU.
Requests go straight to the API you pick. Credentials stay in your environment or in ~/.nimlet/auth.json.
Run independent processes for separate workspaces, branches, or jobs. Each one has its own queues and session.
In your repository
Ask for the outcome you want. Nimlet gathers context from the project, makes the smallest edit that fits, and runs the checks you approve.
Read files, search by pattern, inspect Git history, and attach the context that matters instead of pasting files in.
Start in read-only plan mode, switch to act mode when you are ready, and reuse the investigation instead of starting over.
Reads, searches, and workspace edits run freely. Shell commands and extensions ask the first time, with per-session and per-project grants.
Queue the next thought while a turn runs, resume a saved session, and let compaction make room for longer tasks.
Extend it
An extension is a program Nimlet starts and keeps running. Python, Go, Rust, JavaScript, a shell script: if it can read stdin and write stdout, it can add tools, slash commands, hooks, and live status to Nimlet. There is no client library and no language lock-in.
#!/usr/bin/env node
import readline from 'node:readline'
const send = (message) => process.stdout.write(JSON.stringify(message) + '\n')
send({
type: 'register',
commands: [{ name: 'note', description: 'Append a note to NOTES.md' }],
tools: [{
name: 'save_note',
description: 'Save a note about the current work.',
input_schema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] },
}],
})
for await (const line of readline.createInterface({ input: process.stdin })) {
const message = JSON.parse(line)
if (message.type === 'shutdown') break
}
JSON lines on stdin and stdout. No plugin host, no bundle step, no FFI into the agent process.
A tool.json executable runs per call. An extension stays up, sees session events, and can push status whenever it likes.
Register slash commands, model tools, and lifecycle hooks from the same program. Reply when you have something to change.
Put extensions in .nimlet/extensions or the portable ~/.agents/extensions layout other agents already share.
One agent, several surfaces
The same agent is an interactive TUI, a one-shot command, a JSON event stream, or a long-running RPC process.
Start in a few lines
Put the nimlet binary on your PATH, set a provider key, and launch it from the workspace you want to work on.
$ export OPENROUTER_API_KEY=your-key
$ cd /path/to/your/project
$ nimlet