md-terminal for macOS, Linux and Windows

The terminal
that thinks ahead

Every project gets its own workspace, with splits, tabs and a browser beside your shell. Claude is one shortcut away: ask for a command, hand a task to the agent, and approve each step it runs.

Free · macOS, Linux and Windows · Runs on your Claude plan, an API key, or free open models.

Split it. Ask it. Hand it off.

⌘D splits the pane. ⌘⇧B opens a browser beside it.

Workspaces

Every project has a place.
And it tells you when it needs you.

api ⌘1
~/code/api · main · node · 3 panes
web ⌘2
~/code/web · feat/login · vite
infra ⌘3
~/ops · main
Deploy finished · prod
1234

Vertical workspaces

Each workspace shows its folder, git branch (● when there are uncommitted changes), the process running in it and how many panes it has. ⌘1…9 jumps to one. ⌘B folds the list into a rail of numbered badges.

⌘⇧→ move⌘⌥→ focus

Split, move, dock

⌘D splits right, ⌘⇧D splits down. Move a pane with ⌘⇧ and an arrow, or drag it by its grip onto an edge to dock, or onto the middle to swap.

1❯ npm run build ✓ built in 41.2s 🔔 Build · done

Rings when it needs you

OSC 9, OSC 777 or a bell in an unfocused pane gives it a blue ring and a badge, puts the message in the sidebar and posts a macOS notification. ⌘⇧U jumps to the latest.

zshserverdocs+

Tabs inside workspaces

Each tab keeps its own split layout. ⌘T opens a terminal tab, ⌘⇧T a browser tab. Drag to reorder, double-click to rename, or turn tabs off in Settings.

⋮⋮‹ › ↻
localhost:3000

A browser beside your shell

⌘⇧B opens a browser split with an address bar. Links you click in the terminal open there; ⌥-click sends them to your default browser. Cookies persist across restarts.

⌘⇧D
↓
⌃⌥D
Also used by “Split down” in Tabs

Every shortcut is yours

Rebind any shortcut, remove it, or give it extra combinations. Conflicts are flagged, and ⌘/ always shows the bindings you have now.

# ring the pane when a long job ends ❯ make release && bin/mdt-notify "Release" "ready" # or from any language, with an escape sequence ❯ printf '\e]777;notify;Tests;all green\a' # Claude Code rings when it needs input ❯ claude config set --global preferredNotifChannel iterm2

Notify from anything

Any script can ring its pane. md-terminal listens for the same escape sequences other terminals use, so tools like Claude Code can tell you when they're waiting on you.

❯ git checkout -b feat/login
→take it⌥→one word

Suggestions as you type

Grey text finishes the command from your history first, then from a list of about 300 common commands. Built into zsh, no oh-my-zsh needed. Already use zsh-autosuggestions? md-terminal adds its list to yours.

❯ gti status
did you mean git status? [y/n] y
On branch main

Typos fixed on y

Mistype a command and md-terminal offers the fix. It checks about 160 common slips, then one swapped or extra letter against what's on your PATH. Your own .zshrc still loads as usual.

Workspaces⌘1…9 switches between them.2 of 9Next →

A tour on day one

The first launch walks you through the app with a spotlight and small animated demos. Take it again any time from Help (⌘/) or Settings.

Built-in agent

Say what you want.
Approve what runs.

Three shortcuts cover most of it. Each one reads where you are: the workspace, its folder, and what's on screen.

⌘KAsk for a command

Describe it in a sentence. You get the command, a short explanation, and a warning when it would change or delete things.

✦shrink every png in here by half
mogrify -resize 50% *.png
⚠ Overwrites the files in place
↵Insert⌘↵Run⇥Agent

⌘IHand it to the agent

One conversation per workspace. The agent proposes each shell command; you edit it, approve it, or reject it with a note. cd carries over between steps.

run_command~/code/web
npm run build
RejectApprove ⌘↵

⌘EExplain what broke

Reads the visible output, diagnoses the last command, and offers a command that fixes it.

npm ERR! code ERESOLVE
npm ERR! peer react@"^18" from react-day-picker
✦react-day-picker 8 expects React 18, and this project uses React 19.
npm install react-day-picker@9

You decide what runs on its own.

The shield next to Send sets how commands are approved. It applies from the next command, and Settings has the same choice.

ls -la cat package.json git diff npm install npm run build rm -rf dist sudo pfctl -d git push --force
✓ runs on its own? waits for your approval

It can check the page, too

The agent can open a URL in the workspace's browser pane and read its text. Ask it to start the dev server and confirm the homepage renders. Page text reaches the model marked as untrusted.

✓ open_url http://localhost:5173✓ read_page · 1,284 chars

And your Mac, if you allow it

For things a shell can't do, the agent can see your screen and use the mouse and keyboard. It asks once per task, lists every action, and ⌘⇧Esc stops it from any app. Turn it off in Settings.

screenshot · primary displayleft_click (812, 440)type "Release notes"
Made for the keyboard

Everything is a shortcut.
And you can change all of them.

Ask for a command⌘K
Split right⌘D
Open the agent⌘I
Split down⌘⇧D
Explain the last command⌘E
Open a browser pane⌘⇧B
Jump to the latest notification⌘⇧U
Switch workspace⌘1…9
Collapse the sidebar⌘B
Show every shortcut⌘/
1,900

lines in all, HTML and CSS included

0

bundlers. Plain Electron, xterm.js and node-pty

3

ways to power the AI, switchable in Settings

120s

limit on each agent command, run apart from your shell

Models

Your plan, your key,
or free open models.

Pick a provider in Settings (⌘,). Commands go through the same approval card whichever one you use.

Default

Claude subscription

Uses the Pro or Max plan you already sign in to with Claude Code, through the Claude Agent SDK.

  • No API key to manage
  • Usage counts toward your plan's limits
  • Runs isolated: your hooks, CLAUDE.md files and permission rules stay out, and no transcripts are written
❯ claude
then /login, once
Pay per token

Anthropic API key

Paste a key in Settings, or export ANTHROPIC_API_KEY before launching.

  • Stored in config.json with mode 600
  • Computer use with Anthropic's computer toolset
  • Requests opt into server-side refusal fallbacks
~/Library/Application Support/
md-terminal/config.json
Free

Free & open models

Runs opencode and Command Code in the background over the Agent Client Protocol and rotates through models you choose.

  • Fail over down the list, or round robin per chat
  • A failed model is skipped for 5 minutes, and the next one gets a recap
  • Optional OpenCode Go and Command Code keys, without touching the CLIs' own logins
opencode-go/deepseek-v4.1-flashskipped
deepseek/deepseek-v4.1-flash
opencode/deepseek-v4.1-flash-free
opencode/big-pickle
Claude models: Opus 5.5 · defaultSonnet 5.5Haiku 4.5Fable 5.1your Claude Code default
Built right

Small. Local.
Careful with your Mac.

Small enough to read

Plain Electron with xterm.js and node-pty, no bundler. The whole app is about 1,900 lines, so you can read what it does in an afternoon.

The agent works apart from you

Agent commands run non-interactively with $SHELL -lc, no TTY and a 120-second timeout, separate from the shell you're typing in.

Tools stay on your machine

With free models, the agent's tools are served from 127.0.0.1 on a random port with a random path per chat. The CLIs' own shell, edit and fetch tools are turned off.

A clean environment

Started from inside cmux or Ghostty, md-terminal strips that terminal's variables and shims, so your shells and the agent run as md-terminal.

Questions

Good to know.

Do I need an API key?

No. By default md-terminal uses your Claude Pro or Max plan through the login you already have in Claude Code. Run claude and /login once if you haven't. An API key is optional, for paying per token instead.

Will it pick up my Claude Code hooks and CLAUDE.md files?

No. The subscription backend runs the Agent SDK in isolation mode, with no setting sources, no built-in tools and no transcripts written to ~/.claude/projects. Your Claude Code setup stays as it is.

Can the agent run anything it likes?

Only what you allow. Every command shows up as a card you can edit, approve or reject. You can let read-only commands like ls and git status run on their own, or approve everything except destructive ones like rm, sudo and force pushes.

Which free models can I use?

Any model opencode or Command Code accepts, including ones you have through opencode auth login. The defaults are DeepSeek V4.1 Flash on three providers, then opencode/big-pickle and reflection/beam:free. You'll need opencode v2, and either cmd login once or a Command Code API key. An OpenCode Go key is optional too; both go in Settings → AI and are stored like the Anthropic key.

Why does it ask for Screen Recording and Accessibility?

Only for computer use, where the agent sees your screen and moves the mouse. macOS asks the first time the agent tries it, and the agent asks you again once per task. Turn the feature off in Settings and it never asks.

How do I get a ring when Claude Code needs me?

Run claude config set --global preferredNotifChannel iterm2. Claude Code then sends OSC 9 when it's waiting, and the pane lights up even in another workspace.

Which systems does it run on?

macOS on Apple silicon and Intel, Linux on x64 and arm64 (AppImage or .deb), and Windows on x64 and ARM64. On Linux the default shell is your $SHELL, and on Windows it's PowerShell.

Why does my computer warn me the first time I open it?

The installers aren't code-signed yet. On macOS, right-click the app and choose Open, or run xattr -dr com.apple.quarantine /Applications/md-terminal.app. On Windows, choose More info, then Run anyway when SmartScreen appears.

Where are my settings stored?

In ~/Library/Application Support/md-terminal/config.json: font, cursor, scrollback, shell, provider, approval mode and every shortcut binding.

md-terminal app icon

Open a workspace.
Hand off the rest.

Free to download for macOS, Linux and Windows, on Intel/AMD and ARM.

macOS

Apple silicon and Intel

Your system
Apple silicon.dmg

Not notarized yet. The first time, right-click the app and choose Open.

Latest release · Release notes and all files