The terminal that keeps an eye on your agents
Know the instant Claude Code or Codex CLI needs you. A glowing bar tracks what every window is doing, and one shortcut gives each window its own color, so you can tell your sessions apart at a glance.
~/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 is built never to connect to the internet.
Hand a task to your agent and go do something else. kTerm tells you the moment it is your turn. It takes a one-time setup. 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. When the state changes to waiting, done or failed, kTerm plays the bell sound chosen in Settings (turn it off with "Play the bell sound when an agent needs you" in Settings). The waiting and done states clear when you type a key.
| 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 (clears when you type) | Waiting for You |
| Done | Green briefly, then waiting for you | Done |
| Failed | Red | Failed |
Available in kTerm 1.0.7 or later. Open kTerm from the Applications folder before you set it up. The hooks point at the script inside kTerm, so updating kTerm updates them too.
From Codex CLI 0.157, a shared background server starts the hooks by default, so the hooks cannot tell which window they come from. kTerm then infers the state from the spinner Codex puts in the window title and from the bell. Inferred states show no tool name label. Start Codex with codex --no-daemon to let the hooks through for more accurate display.
Download claude-code-activity.sh, save it to ~/.claude/hooks/ (Claude Code) or ~/.codex/hooks/ (Codex CLI) and make it executable with chmod +x. Then register it for each event as shown below, replacing <you> with your user name. If you use both, one copy is enough: use its path in both files.
If you downloaded the script before, replace it with the current one for kTerm 1.0.9.
If the file already exists, add to it instead of replacing it. When it has no "hooks" key, add the "hooks" block at the top level next to your other settings. When it already has one, add each event inside it, and for an event that already has hooks, append the { "hooks": [...] } entry to the end of that event's array.
Claude Code - ~/.claude/settings.json
{
"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" }] }]
}
}
Codex CLI 0.155 or later - ~/.codex/hooks.json
{
"hooks": {
"SessionStart": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"PreToolUse": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"PostToolUse": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"PermissionRequest": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"Stop": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"Interrupt": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }],
"SessionEnd": [{ "hooks": [{ "type": "command", "command": "/Users/<you>/.codex/hooks/claude-code-activity.sh" }] }]
}
}
Write these sequences to standard output. Hooks and other processes without a controlling terminal send the same text without the escape characters, one line per connection, to the socket in $KTERM_ACTIVITY_SOCKET, for example printf '7777;activity;busy;\n' | nc -U "$KTERM_ACTIVITY_SOCKET". Inside tmux this works as long as KTERM_ACTIVITY_SOCKET 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 activity sounds itself, so Claude Code needs no setting. For Codex CLI, add this to ~/.codex/config.toml so it rings the bell when it finishes:
[tui] notifications = true notification_method = "bel" notification_condition = "always"
kTerm itself has quit. What keeps running is the Codex CLI background server: from Codex CLI 0.157, it stays up after you close the terminal it was started from, so that Codex starts faster next time. macOS counts the server as part of the app that launched it, so it lists it under kTerm's name in System Settings > General > Login Items. To stop it, run codex app-server daemon stop. To use Codex without it, start Codex with codex --no-daemon.
| 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, activity sounds, 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 | Changes & download |
|---|---|---|
| 1.0.10 | Oct 9, 2026 |
SHA-256 deac9176433a04913a7cb3ca0a92056978c56eb45654c1b3bf7c446179ff7658
|
| 1.0.9 | Oct 7, 2026 |
|
| 1.0.8 | Sep 27, 2026 |
|
| 1.0.7 | Sep 27, 2026 |
|
| 1.0.6 | Sep 27, 2026 |
|
| 1.0.5 | Sep 26, 2026 |
|
| 1.0.4 | Sep 25, 2026 |
|
| 1.0.3 | Sep 23, 2026 |
|
Verify a download in Terminal:
shasum -a 256 ~/Downloads/kTerm-1.0.10.dmg
Free for macOS 14 Sonoma or later. Questions or bug reports? Contact us.
Download kTerm 1.0.10