MilanCode is a rust based agentic coding harness for Nano-GPT - A clone of pebble
It supports:
- Nano-GPT
MilanCode is designed around an interactive REPL, local tools, managed sessions, MCP servers, and a user-controlled permission model. Web retrieval is provider-agnostic and always runs through Exa.
Check the Changelog for update/patch notes
MilanCode can prompt you for credentials interactively:
milancode loginYou can also target Nano-GPT directly:
milancode login nanogptOr pass the key inline:
milancode login nanogpt --api-key "$NANOGPT_API_KEY"Inside the REPL, the equivalent commands are:
/login
/auth
/login nanogpt
/logout nanogpt
If you run /login or /auth without a service, MilanCode opens a picker with:
nanogptexa
MilanCode uses Exa for all web search and scrape functionality.
Save it with:
milancode login exaOr from inside the REPL:
/login exa
/auth exa
You can also provide it inline:
milancode login exa --api-key "$EXA_API_KEY"Or export it in your shell:
export EXA_API_KEY=...Launch the REPL:
milancodeUseful first commands:
/help
/status
/model
/login
/logout
/sessions
Basic prompt flow:
> summarize this project
> inspect Cargo.toml and explain the workspace layout
> find the session restore logic
For a single command without entering the REPL:
milancode prompt "Summarize this repository"Or:
milancode "Inspect the current Rust workspace and explain the top-level crates"milancode --allowedTools read,glob "Summarize Cargo.toml"Common commands:
/help/help auth/help sessions/help extensions/help web/status/model/login/logout/provider/permissions/bypass/proxy/mcp/skills/plugins/sessions/resume/resume last/session switch <id>
Notes:
/provideronly applies to NanoGPT-backed models.Shift+EnterandCtrl+Jinsert a newline in the input editor.
MilanCode stores user config under:
~/.milancode/
Credentials are stored in:
~/.milancode/credentials.json
Possible stored keys:
nanogpt_api_keyexa_api_key
Environment variables still take precedence over saved credentials.
Useful environment variables:
NANOGPT_API_KEYEXA_API_KEYNANOGPT_BASE_URLEXA_BASE_URLMILANCODE_CONFIG_HOME
EXA_BASE_URL defaults to https://api.exa.ai.
MilanCode keeps managed sessions under:
.milancode/sessions/
Useful flows:
/sessionslists recent sessions/resumeopens the picker/resume lastrestores the most recently modified session/session switch <session-id>switches inside the REPLmilancode resume [SESSION_ID_OR_PATH]resumes from the CLI
Session restore includes more than just transcript history. MilanCode persists and restores:
- active model
- permission mode
- thinking toggle
- proxy tool-call toggle
- allowed tool set
That makes restored sessions behave much closer to the original live session.
MilanCode supports:
read-onlyworkspace-writedanger-full-access
Examples:
/permissions
/permissions workspace-write
/bypass
/bypass is a shortcut for danger-full-access in the current session.
MilanCode keeps the tool names WebSearch and WebScrape, but both use Exa.
- uses Exa
POST /search - defaults to Exa search type
auto - promotes to
deepfor deeper or more structured requests - maps allowed and blocked domains into Exa domain filters
- uses Exa
POST /contents - supports one or more URLs
- validates URLs before sending requests
- returns normalized previews in the TUI
Run:
/status
MilanCode reports Exa readiness separately from the active model backend.
MilanCode has three main extension surfaces:
- skills
- MCP servers
- plugins
Create a project-local skill:
/skills init my-skill
This creates:
.milancode/skills/my-skill/SKILL.md
Useful commands:
/skills
/skills help
Create a starter MCP server entry:
/mcp add my-server
This updates:
.milancode/settings.json
Inspect what is configured:
/mcp
/mcp tools
/mcp reload
Enable or disable a configured server locally:
/mcp disable context7
/mcp enable context7
These local toggles are written to:
.milancode/settings.local.json
That lets you keep a shared project MCP config while turning specific servers on or off per machine.
Useful commands:
/plugins
/plugins help
/plugins install ./plugins/my-plugin
/plugins enable my-plugin-id
MilanCode expects plugins to expose:
.milancode-plugin/plugin.json
MilanCode can run in XML proxy tool-call mode:
/proxy status
/proxy on
/proxy off
When proxy mode is enabled, tool use is expected through XML <tool_call> blocks rather than native tool schemas.
- run
/status - confirm you saved credentials with
milancode login - or export the matching
*_API_KEY - verify the active model with
/model
- run
milancode login exa - or export
EXA_API_KEY - check
/statusfor Exa readiness
- run
/mcp - run
/mcp tools - run
/mcp reload - check
.milancode/settings.json - check
.milancode/settings.local.json - if the server is marked
disabled, run/mcp enable <name>
- inspect
/status - use
/resume lastor/session switch <id> - verify the session was saved after changing model, permissions, proxy, or thinking state
- run
/plugins help - confirm the plugin root contains
.milancode-plugin/plugin.json
cargo build --release -p milancodeBinary output:
./target/release/milancodeOn Windows, the binary output is target\\release\\milancode.exe. MilanCode resolves config and
credentials from MILANCODE_CONFIG_HOME first, then %USERPROFILE%\\.milancode when HOME is not set.
cargo run -p milancode --cargo test --workspace -- --test-threads=1Common project-local files:
MILANCODE.md.milancode/settings.json.milancode/settings.local.json.milancode/skills/.milancode/sessions/
MilanCode’s self-update flow targets the GitHub releases for:
nanogpt-community/milancode