Built for many windows

A small, focused terminal. No tabs, no plugins, no setup.

A color for every window

Switch a window's background with Cmd+Shift+]. Eight presets drawn from traditional Japanese colors, plus your own in a JSON file.

Knows when your agent needs you

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.

Runs your TUI apps

vim, less, htop, tmux, Claude Code and Codex CLI work as expected. Lines rewrap, history included, when you resize.

Japanese input done right

Inline IME composition, full-width characters and emoji render in place. The interface is available in English and Japanese.

One window, one session

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.

Under 1 MB, no dependencies

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.

Claude Code and Codex CLI activity

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.

StateBarLabel
ThinkingBlue light flows left to rightThinking
Running a toolTeal light flowsTool name (Bash, Edit...)
Waiting for youBlinking amber (clears when you type)Waiting for You
DoneGreen briefly, then waiting for youDone
FailedRedFailed

Set it up

  1. Open kTerm Settings (Cmd+,).
  2. Under Agent Hooks, click "Set Up Claude Code" or "Set Up Codex CLI". Your existing settings stay as they are, and the previous file is saved next to it as a backup.
  3. For Codex CLI, start it once in interactive mode and choose "Trust all and continue". Hooks do not run until they are trusted.

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.

Set it up by hand

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" }] }]
  }
}
Report state from your own program

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
Completion sounds (terminal bell)

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 still shows in Login Items after I quit it

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.

Keyboard shortcuts

Cmd+Shift+] / [Next / previous background color (this window only)
Cmd+NNew window
Cmd+WClose window and end its session
Cmd+KClear the screen and scrollback
Cmd++ / - / 0Larger / smaller / reset font size of this window
Cmd+← / →Beginning / end of line
Option+← / →Move by word
Shift+PageUp / PageDownPage through the scrollback
DragSelect and copy in one step
Right-clickPaste
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.

Install

  1. Download kTerm-1.0.10.dmg and open it.
  2. Drag kTerm to the Applications folder.
  3. Open kTerm from Applications or Spotlight.

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.

Uninstall

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.

Releases

VersionReleasedChanges & download
1.0.10 Oct 9, 2026
  • Cmd+F finds text on the screen and in the scrollback, highlighting every match and showing the count
  • Return / Cmd+G moves to the next match and Shift+Return / Cmd+Shift+G to the previous one, scrolling to matches off screen
  • Search ignores case by default (toggle with Aa in the find bar) and finds words split across wrapped lines
kTerm-1.0.10.dmg (667 KB)
SHA-256 deac9176433a04913a7cb3ca0a92056978c56eb45654c1b3bf7c446179ff7658
1.0.9 Oct 7, 2026
  • Shows waiting for you while Claude Code waits for your answer to a question or a plan approval
  • The thinking and tool bars show their state color at every moment, not only while the light passes
  • Text colors too dark to read on the background, such as dark blue, are brightened while keeping their hue
  • Japanese input shows the caret inside the text being typed, and a thick underline marks the clause being converted
1.0.8 Sep 27, 2026
  • Plays the bell sound when an agent's state changes to waiting, done or failed (turn it off in Settings)
  • After done, the window moves on to waiting for you, the same for Claude Code and Codex CLI
  • The waiting and done states clear when you type a key
  • Shows the working state with the default setup of Codex CLI 0.157 or later
  • Fixed the working state sometimes appearing in a different window
1.0.7 Sep 27, 2026
  • Agent Hooks in Settings sets up Claude Code or Codex CLI with one click
  • The working-state script is bundled with the app and updates along with kTerm
1.0.6 Sep 27, 2026
  • Fixed garbled divider lines and a shifted input box that could appear right after Claude Code or Codex CLI started
  • Updated the working-state script. If you placed it by hand, replace it with the new one
1.0.5 Sep 26, 2026
  • The view stays put while you read back through the scrollback, even when new output arrives
  • A badge at the bottom right counts new lines while you read back; click it to jump to the bottom
  • Cmd+Home / Cmd+End jump to the top / bottom of the scrollback
  • A cleaner installer window with readable icon names
1.0.4 Sep 25, 2026
  • Set the size of new windows (columns x rows) in Settings
  • "Use Current Window" makes the size of the window you are using the default
  • Numbers in Settings apply as you type, without pressing Return
  • The About window links to the product page and the license
1.0.3 Sep 23, 2026
  • First public release

Verify a download in Terminal:

shasum -a 256 ~/Downloads/kTerm-1.0.10.dmg
Requirements
macOS 14 Sonoma or later
Architecture
Universal (Apple Silicon and Intel)
Price
Free
Languages
English, Japanese
License
kTerm License - free for personal and business use; redistribution allowed unmodified and free of charge
Publisher
Kodama & Company, Inc.

Never miss the moment your agent needs you

Free for macOS 14 Sonoma or later. Questions or bug reports? Contact us.

Download kTerm 1.0.10

Use of kTerm is subject to the kTerm License, our Terms of Use and Application Privacy Policy.