0xR32

Ply — Development skill for Claude Code

Development community

macOS workspace for the real Claude Code and Codex CLIs: tabs of up to four terminal panes, per-pane status (running, needs permission, your turn), plan progress, session history and worktrees.

How to install Ply

This entry records only its repository, not the path inside it, so there is no exact command to give. Open 0xR32/ply and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

What Ply does

macOS workspace for the real Claude Code and Codex CLIs: tabs of up to four terminal panes, per-pane status (running, needs permission, your turn), plan progress, session history and worktrees. Rust daemon on libghostty-vt, React UI on GPUIX. Not an LLM wrapper.

Alternatives in Development

README

ply

ply is a macOS app that runs the real `claude` (Claude Code) and `codex` (Codex CLI) terminal UIs side by side, each in its own terminal pane, and adds what a terminal multiplexer lacks: a status per pane (running, needs permission, needs input, your turn, exited), progress from the agent's own plan, a stored history of every session, the CLIs' own worktrees, and a keyboard-first layout of tabs with up to four panes each (side by side up to three, quadrants at four). The agents keep running when the window closes.

ply is **not** an LLM wrapper. It makes no network requests, calls no model API, holds no keys, rewrites no prompts, hands no transcripts between CLIs and never picks a model or effort level: those are changed inside the CLI session. ply only manages terminal panes and tracks and stores sessions.

How it works

Two processes cooperate over three local Unix-socket protocols:

  • Ply.app is a Bun process running React on GPUIX (@gpuix/react and the prebuilt @gpuix/native from npm, painted by Zed's GPUI with Metal). It draws the tabs, panes, overlays and the terminal view, owns the keymap and the UI state, and sends control requests. It never opens a pty, never spawns an agent and never sees raw pty bytes: it receives decoded screen rows and draws each row as a line of styled text runs in Geist Mono.
  • plyd is a per-user LaunchAgent, not a child of the app. It owns every pane's process and pty, runs one libghostty-vt terminal per pane, encodes keys, mouse, focus and paste against that terminal's live modes, derives each pane's status from the CLIs' own hooks and notifications, and stores sessions in SQLite. Quitting or crashing the app stops nothing; reopening it shows every pane's current screen at once.

The protocols are **C1** control (JSON lines on `run/plyd.sock`: panes, tabs, sessions, status events), **C2** screen data (binary frames on