Repository navigation
Releases
v0.4.0
ccc-morph v0.4.0
This release makes your bindings work on modern desktop terminals, not just over SSH: ccc-morph now speaks the Kitty keyboard protocol, so the Ctrl-D guard and your Ctrl-B leader chords register even when the wrapped program has switched the terminal into "report every key as an escape code" mode.
ccc-morph is still the same transparent PTY wrapper that remaps key sequences to your own actions for Claude Code, Codex, or any interactive terminal program. v0.4.0 builds full keyboard-protocol support on top of the v0.3.0 response capture and notes hub.
Highlights
- Kitty keyboard protocol support: on terminals that negotiate the protocol (Ghostty, Foot, kitty, WezTerm, recent GNOME/VTE), keys arrive as CSI-u escape sequences instead of legacy bytes. ccc-morph tracks the wrapped program's negotiated keyboard mode, decodes CSI-u input to match your bindings, and re-encodes
sendactions in the program's active mode. So the double-Ctrl-Dguard that was working over SSH now also works in a desktop terminal, where before the bytes slipped straight through to the child. - More combinations bindable by name: because the protocol reports modifiers explicitly, combinations that legacy terminals cannot distinguish now work as plain named bindings on Kitty-capable terminals, for example
ctrl-enter,ctrl-tab, andshift-enter. - Bundled
opencodeconfig: wrappingopencodenow gets Codex-style single-/double-Ctrl-Dhandling out of the box, the same as the bundled Codex config. A loneCtrl-Dis swallowed and a double press sends exactly one. - Resilient behind a modal: if a wrapped program floods keyboard-mode controls while the notes hub or editor is open, the wrapper stops the flood, resets the terminal cleanly, and exits with a clear status instead of hanging.
Everything from v0.3.0 still works unchanged: response capture with c and C, the persistent per-directory notes hub, add/edit/insert/archive, the bundled Claude Code and Codex configs, --ensure-defaults, --check-config, --inspect-key, and self-contained binaries.
Keyboard and capture notes
Combinations like ctrl-enter and ctrl-tab only resolve where the terminal implements the keyboard protocol; a legacy terminal sends the same bytes for Ctrl-Enter as for Enter, so those bindings will not match there. hex: bindings remain available for terminal-specific byte sequences, but a hex: value is exact bytes captured from one terminal and mode: it will not match the CSI-u form the same key produces once the wrapped program turns the protocol on, so prefer a named binding when one exists. Response capture is unchanged from v0.3.0 and covers Claude Code and Codex; opencode has no transcript adapter, so its c and C fall back to the ANSI-stripped terminal buffer rather than per-response history.
Upgrading
The simplest upgrade is to re-run the install one-liner, which fetches and installs the latest release:
curl -fsSL https://raw.githubusercontent.com/closetheloop-dev/ccc-morph/main/scripts/install.sh | bashOr download the new tarball, extract it, and re-run ./install.sh (handy offline or to verify the checksum by hand). Either way it swaps in the new binary, installs any missing bundled app configs without overwriting existing ones (this release adds opencode.toml), and runs --ensure-defaults to top up the global config. Existing app configs are preserved; compare them with the newly bundled versions if you want to adopt any app-config changes. (--ensure-defaults only updates the global config.)
Install
Self-contained binaries for linux-x64, linux-arm64, darwin-x64, and darwin-arm64 are attached below. Download the tarball for your platform and SHA256SUMS.txt, then extract and run the bundled ./install.sh.
Verify the download (optional):
sha256sum -c SHA256SUMS.txt --ignore-missing # Linux
shasum -a 256 -c SHA256SUMS.txt --ignore-missing # macOSFull install, configuration, and usage details are in the README.
v0.3.0
ccc-morph v0.3.0
This release lets you capture a Claude Code or Codex response straight into a note (the latest one, or an earlier one you pick from a scrollable history), so a useful answer or plan is one keystroke away from becoming a saved note.
ccc-morph is still the same transparent PTY wrapper that remaps key sequences to your own actions for Claude Code, Codex, or any interactive terminal program. v0.3.0 builds response capture on top of the v0.2.0 notes hub.
Highlights
- Capture the latest response: in the notes hub (
Ctrl-B N), presscto open the note editor pre-filled with the wrapped program's most recent response. For Claude Code and Codex that is the agent's latest message (read from its session transcript); for anything else it is the ANSI-stripped terminal buffer. Trim it and whatever you keep becomes the note. - Browse the response history: press
Cfor a list-and-preview of the wrapped program's recent responses (newest first). Move with↑/↓, page a long entry with the scroll keys, and pressEnterto capture the selected one. The latest-capturecstays a one-key shortcut for the common case. - Capture plans, too: the history also surfaces Claude Code and Codex plans, labelled
plan:. Because Claude Code overwrites its plan file on each revision, the history is often the only place to recover an earlier plan. Selecting one captures the clean plan markdown. - Claude Code and Codex keep running while you take notes: the bundled Claude Code and Codex app configs set
notes_child_mode = "continue", so neither agent is paused while the notes hub or editor is open. (The global default is"pause", which protects programs that stream raw output.)
Everything from v0.2.0 still works unchanged: the persistent per-directory notes hub, add/edit/insert/archive, --ensure-defaults, the bundled Claude Code and Codex configs, --check-config, and self-contained binaries.
Capture limitations
Response history works for fresh sessions and deterministic resumes by session id or latest session. When you resume through Claude Code's or Codex's interactive session picker, ccc-morph cannot reliably identify the selected transcript, so c falls back to the terminal buffer and C has no history entries. Capture cannot always distinguish multiple sessions of the same agent in one working directory. Running one Claude Code session alongside one Codex session is safe, but for fresh sessions, or when resuming Claude Code with --continue, concurrently starting another instance of the same agent can make c or C select that other session's response. Resumes by explicit session id, and Codex resume --last, pin the chosen session and are unaffected.
Upgrading
Download the new tarball, extract it, and re-run ./install.sh. It swaps in the new binary, installs any missing bundled app configs without overwriting existing ones, and runs --ensure-defaults to top up the global config. Existing app configs are preserved; compare them with the newly bundled versions if you want to adopt any app-config changes. (--ensure-defaults only updates the global config.)
Install
Quick install:
curl -fsSL https://raw.githubusercontent.com/closetheloop-dev/ccc-morph/main/scripts/install.sh | bashThe installer detects your platform, downloads the matching release archive, and verifies its SHA-256 checksum. See the README for version pinning, installation-directory overrides, and manual installation.
Full install, configuration, and usage details are in the README.
Requires Linux or macOS; Windows works via WSL2 (use the linux-x64 binary). Licensed under MIT; see the bundled notices for embedded-runtime licenses.
v0.2.0
ccc-morph v0.2.0
This release adds persistent workspace notes: a place to keep short notes and reminders next to whatever interactive program you are wrapping, and drop one straight into its prompt when you need it.
ccc-morph is still the same transparent PTY wrapper that remaps key sequences to your own actions for Claude Code, Codex, or any interactive terminal program. v0.2.0 builds the notes feature on top and makes first-run setup easier.
Highlights
- Persistent workspace notes: press
Ctrl-B Nto open the notes hub. Add and edit notes in your$EDITOR, mark one and pressEnterto insert it into the wrapped program's prompt (which archives it), and switch to the archive to restore. Notes are stored per working directory and persist across sessions. - One-command default setup:
ccc-morph --ensure-defaultscreates or tops up your global config with the default bindings (Ctrl-B Nfor the notes hub,Ctrl-B Efor the error viewer). It appends only missing, non-conflicting bindings, so it never overwrites your settings, andinstall.shruns it for you. - Bundled Claude Code config: a Claude app config now ships alongside the Codex one, so Claude Code keeps running while the notes hub or editor is open and redraws cleanly on close.
- Config validation:
ccc-morph --check-config FILEvalidates a config file and exits non-zero with a message if it would not parse.
Everything from v0.1.0 still works unchanged: transparent pass-through, configurable shortcuts (send input, run a background command, open the error viewer, quit), the safe non-interactive fallback, --inspect-key, and self-contained binaries.
Upgrading
Download the new tarball, extract it, and re-run ./install.sh. It swaps in the new binary, adds any newly bundled app configs without overwriting your own, and runs --ensure-defaults to add the new default bindings. Note that --ensure-defaults on its own only updates the global config; re-running install.sh is what installs the app configs.
Install
Self-contained binaries for linux-x64, linux-arm64, darwin-x64, and darwin-arm64 are attached below. Download the tarball for your platform and SHA256SUMS.txt, then extract and run the bundled ./install.sh.
Verify the download (optional):
sha256sum -c SHA256SUMS.txt --ignore-missing # Linux
shasum -a 256 -c SHA256SUMS.txt --ignore-missing # macOSFull install, configuration, and usage details are in the README.
Requires Linux or macOS; Windows works via WSL2 (use the linux-x64 binary). Licensed under MIT; see the bundled notices for embedded-runtime licenses.
v0.1.0
ccc-morph v0.1.0
First public release of ccc-morph — a transparent PTY wrapper that lets you remap key sequences for any interactive terminal program, without the wrapped program knowing.
The motivating case is bridging Claude Code and Codex: wrap Codex with the bundled config and a stray single Ctrl-D is ignored, while a deliberate Ctrl-D Ctrl-D sends exactly one Ctrl-D — so Claude Code muscle memory no longer nukes your shell. The tool is generic and works with any interactive program.
Highlights
- Transparent by default — the child inherits your working directory, environment,
TERM, and size; output is never re-rendered in normal operation. - Configurable shortcuts — remap key sequences to actions via
config.tomland per-app configs (a Codex app config ships in the box). - Safe fallback — in a pipe or non-interactive shell it just runs your command directly and forwards its exit code.
- Key inspector —
ccc-morph --inspect-keyprints the exact bytes a key sends. - Self-contained binaries — no Bun, Node.js, or Docker needed to run.
Install
Self-contained binaries for linux-x64, linux-arm64, darwin-x64, and darwin-arm64 are attached below. Download the tarball for your platform and SHA256SUMS.txt, then extract and run the bundled ./install.sh.
Verify the download (optional):
sha256sum -c SHA256SUMS.txt --ignore-missing # Linux
shasum -a 256 -c SHA256SUMS.txt --ignore-missing # macOSFull install, configuration, and usage details are in the README.
Requires Linux or macOS; Windows works via WSL2 (use the linux-x64 binary). Licensed under MIT; see the bundled notices for embedded-runtime licenses.