v0.4.0 — alpha, in the open

A coding agent
you actually own.

Mira reads your code, edits files, runs commands, and reviews diffs — from a terminal. Bring your own model. Sessions live as plain files on disk. No hosted control plane, no vector DB, no telemetry.

Read the source
Apache-2.0Runs on your machineAny OpenAI-compatible modelZero telemetry
~/projects/my-app — mira
ℳ mira · claude-sonnet-4-6 · manual · ⎇ main↑12.3k ↓4.1k · 15% · $0.024
> refactor the auth middleware to use httpOnly cookies
● Reading 3 files
└ src/middleware.ts
└ src/lib/supabase/server.ts
└ src/lib/supabase/client.ts
Here's a rundown of middleware.ts — the Next.js auth gatekeeper. The gap is that we're setting the session cookie without httpOnly, so any client script can read it.
● Edit src/middleware.ts+8 -3
- res.cookies.set('sb-session', session.access_token)
+ res.cookies.set('sb-session', session.access_token, {
+   httpOnly: true, secure: true, sameSite: 'lax',
+ })
Wrangling … (12s · ↓1.4k tokens · esc to interrupt)
▸▸make the change and add a test for the cookie flags
enter send · / cmd · @ file · shift+tab mode · esc esc quitask on writes · shift+tab to cycle
The premise

A coding agent should be something you can read the source of, edit, and turn off.

Manifesto

Three ideas shape it.

01

You own the whole thing.

Your key, your model, your machine. Sessions and configuration live as plain files on disk. No hosted control plane. No vector database. No telemetry.

02

A harness, not a prompt.

Tools, permissions, history, and subagents are shared infrastructure — not scaffolding you rebuild per agent. New capabilities are additions on top of the loop.

03

Safety is a policy layer.

A small DSL — Bash(cargo test:*), Edit(src/**) — decides what the model may do without asking, what needs approval, and what is off-limits.

In the box

Every piece is a real product surface.

Each cell is a pixel-approximation of what you actually see when the feature runs — same colors, same characters.

~ mira
> list the API routes in this repo
● Grep route\\( · 14 files · streaming…
└ src/routes/auth.ts
└ src/routes/billing.ts
Thinking … (0.4s · ↓210 tokens)

Chat + streaming tool use

Tokens land as they arrive; tool calls stream inline.

~ mira
mode · shift+tab to cycle
planmanualautoedityolo
current: manual · asks on writes

Plan / Manual / Auto / Edit / Yolo modes

Shift+Tab cycles the permission budget for the loop.

~ mira
● Edit src/auth.ts+2 -1
- httpOnly: false,
+ httpOnly: true,
+ secure: true,
[y] apply · [n] skip · [a] apply all

Inline diff approvals

Every write is a proposed patch you accept per hunk.

~ mira
● Spawn review-agent · ⎇ wt-42a1
└ .mira/worktrees/wt-42a1
● Reading 6 files · isolated
review-agent · returns 4 findings

Subagents on isolated worktrees

Spawn a parallel agent on a scratch branch, discard freely.

~ mira
● Write .mira/memory/project_ship_date.md
---
type: project
---
freeze begins 2026-03-05

Persistent memory as markdown

What Mira remembers is a folder you can grep.

~ mira
● Edit src/index.ts · applied
└ .mira/.undo/2026-09-18T14-02-33.patch
u ↶ undo last write
● reverted 1 file · working tree clean

One-key undo of file writes

Every apply is journaled. u rewinds the last one.

~ mira
~/.mira/mcp/linear.json · github.json
● mcp linear.search("INGEST bugs")
└ 3 open · P0 count=1

MCP server support

Any MCP tool shows up as first-class in the loop.

~ mira
> /review
● Skill code-review · from SKILL.md
└ .mira/skills/code-review/SKILL.md
└ effort=medium · comment=false

Skills from SKILL.md files

A directory of prompts becomes a slash command.

~ mira
> mira serve
● listening on http://127.0.0.1:4747
└ tui attached · browser attached
ctrl+c to detach

Terminal + browser front-ends

Same session, TUI or localhost — pick per moment.

~ mira
> /review #412
● Fetching runmira/mira#412
└ 18 files · +324 -87
● posted 6 inline comments

Pull-request review agent

One command drops inline comments on a PR.

~ mira
~/.mira/sessions/
└ 2026-09-18-httponly-cookies.jsonl
> mira --resume
● restored 47 turns · ↑12.3k ↓4.1k

Session persistence + resume

Close the terminal, pick it back up tomorrow.

~ mira
● Grep "TODO" · rg -n
└ src/lib/auth.ts:42
● Glob "**/*.rs" · 137 files
● Patch src/main.rs · +1 -0

Ripgrep, glob, patch tools

The plumbing an editor already assumes.

Bring your own model

Anything with an OpenAI-compatible API works.

Swap providers mid-session with /model. Local runtimes are first-class — no proxy required.

OpenRouterOpenAIAnthropicGroqDeepSeekGeminixAIOllamallama.cppLM StudiovLLMTogetherOpenRouterOpenAIAnthropicGroqDeepSeekGeminixAIOllamallama.cppLM StudiovLLMTogether
hosted
> /model openai/gpt-4o
● now using openai/gpt-4o
local
> /model ollama/llama3
● now using ollama/llama3
hosted
> /model anthropic/claude-sonnet-4-6
● now using anthropic/claude-sonnet-4-6
Install

One command. Then it's yours.

Everything after this line is a file on your disk.

HomebrewmacOS + Linux
$ brew install runmira/tap/mira
Install scriptno Homebrew required
$ curl -fsSL https://raw.githubusercontent.com/runmira/mira/main/install.sh | bash
From sourceRust 1.88+
$ cargo install --path mira/crates/mira-cli
Then, in any repo
$mira

Mira picks up the git root, loads your policy, and drops you in with the last session.