Terminal for macOS
One shortcut, one color per window. Tell your shells apart at a glance, and see the moment Claude Code or Codex CLI needs you.
~/projects/api $ claude > Add rate limiting to the upload endpoint Read src/routes/upload.ts Edit src/middleware/rate-limit.ts Bash npm test 42 passed, 0 failed
Sumi (ink) · click a color, or focus the window and press Cmd+Shift+]
A small, focused terminal. No tabs, no plugins, no setup.
Switch a window's background with Cmd+Shift+]. Eight presets drawn from traditional Japanese colors, plus your own in a JSON file.
A glowing bar shows whether Claude Code or Codex CLI is thinking, running a tool or waiting for you. Waiting windows get a Dock badge.
vim, less, htop, tmux, Claude Code and Codex CLI work as expected. Lines rewrap, history included, when you resize.
Inline IME composition, full-width characters and emoji render in place. The interface is available in English and Japanese.
Each window is its own shell. kTerm opens at the position and size you last used, and background windows can turn translucent so the front one stands out.
Terminal emulation is written from scratch with no third-party libraries. No account, no telemetry, and kTerm itself never connects to the network.
The bar along the top of the window and the label in the title bar follow your agent. When you are in another app, the Dock icon bounces once as soon as a window starts waiting for you.
| State | Bar | Label |
|---|---|---|
| Thinking | Blue light flows left to right | Thinking |
| Running a tool | Teal light flows | Tool name (Bash, Edit...) |
| Waiting for you | Blinking amber | Waiting for You |
| Done | Green, then fades | Done |
| Failed | Red | Failed |
claude-code-activity.sh, save it to ~/.claude/hooks/ and make it executable with chmod +x.~/.claude/settings.json (Claude Code) or ~/.codex/hooks.json (Codex CLI 0.155 or later), replacing <you> with your user name.{
"hooks": {
"SessionStart": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"PreToolUse": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"PostToolUse": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"PermissionRequest": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"Notification": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"Stop": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"StopFailure": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"SessionEnd": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }]
}
}
{
"hooks": {
"SessionStart": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"PreToolUse": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"PostToolUse": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"PermissionRequest": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"Stop": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"Interrupt": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }],
"SessionEnd": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.claude/hooks/claude-code-activity.sh" }] }]
}
}
Write these sequences to standard output. Inside hooks, which have no controlling terminal, write to the device path in $KTERM_TTY. It also works through tmux or ssh as long as KTERM_TTY is carried over.
printf '\e]7777;activity;busy;\e\\' # Thinking printf '\e]7777;activity;tool;Bash\e\\' # Running a tool (with label) printf '\e]7777;activity;attention;\e\\' # Waiting for you printf '\e]7777;activity;done;\e\\' # Done printf '\e]7777;activity;error;\e\\' # Failed printf '\e]7777;activity;off;\e\\' # Off
kTerm plays the bell with the sound and volume chosen in Settings, and wakes Bluetooth outputs first so the start of the sound is not cut off. For Claude Code, set "preferredNotifChannel": "terminal_bell" in ~/.claude/settings.json. For Codex CLI, add this to ~/.codex/config.toml:
[tui] notifications = true notification_method = "bel" notification_condition = "always"
| Cmd+Shift+] / [ | Next / previous background color (this window only) |
| Cmd+N | New window |
| Cmd+W | Close window and end its session |
| Cmd+K | Clear the screen and scrollback |
| Cmd++ / - / 0 | Larger / smaller / reset font size of this window |
| Cmd+← / → | Beginning / end of line |
| Option+← / → | Move by word |
| Shift+PageUp / PageDown | Page through the scrollback |
| Drag | Select and copy in one step |
| Right-click | Paste |
| Cmd+, | Settings: font, line spacing, default color, scrollback, Option as Meta, bell, background window opacity |
Add or override colors in ~/Library/Application Support/kTerm/themes.json. Changes apply as soon as you save; "Show in Finder" in Settings creates a template.
kTerm is signed with a Kodama & Co. Developer ID and notarized by Apple, so macOS opens it after a single "downloaded from the internet" confirmation. No security workarounds are needed.
Move kTerm to the Trash. To remove your settings and custom colors as well, delete ~/Library/Preferences/com.kodama.kTerm.plist and ~/Library/Application Support/kTerm.
| Version | Released | Download |
|---|---|---|
| 1.0.3 | Sep 23, 2026 | kTerm-1.0.3.dmg (570 KB)SHA-256 cdcd5fc91e5082109a0387eef1c57f60908b5bbe90fcc1a7f166986d5c47f3a1 |
Verify a download in Terminal:
shasum -a 256 ~/Downloads/kTerm-1.0.3.dmg
Free for macOS 14 Sonoma or later. Questions or bug reports? Contact us.
Download kTerm 1.0.3