Repository navigation
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.