A desktop-app look for Claude Code's terminal transcript, as a mod.
glass-demo.mp4
Claude Code draws replies in one markdown style: inline code in a fixed lavender, no color for commands, tables in boxes, tool rows in gray. glass replaces the drawing of assistant replies, tool-row headers and the turn footer with its own, inside the same TUI. Hooks, skills, MCP, permissions and Remote Control are untouched: it changes what is drawn, never what is stored or what the model reads.
- Commands in color. Inside backticks and in plain prose: command,
subcommand, flag, string, path, operator, number, variable, each in its
own color. In prose a command paints only with evidence (
git push --follow-tagspaints,make sure the build passesdoes not). - Paths and links anywhere.
src/main.rs:42:7with its line number in the number color,README.md,.gitignore,~/.config/app.toml. URLs underlined;httpslinks are real OSC 8 links. - A Bottom line card. A reply opening with
**Bottom line**andVerified:/Issue:/Fix:rows becomes a tinted card with a thin bar and colored labels. Forms while streaming, never flickers. - Gutter marks. A
▎beside any paragraph that asks something of you: a question, an instruction, a risk, or a thing Claude did not do. Off for turns whose prompt asked for writing. - Private notes. A paragraph opening with
PrivateorPrivatelydraws italic and quiet. - Code cards. Fences on a tinted card sized to the code, a dim language header, a line count and gutter past eight lines. glass's own highlighter does the coloring, in the palette's code keys.
- Diff cards. An Edit, Write or file-changing Bash result as a rounded
card with the file in its top border,
╭─ SPEC.md +1 -1 ───╮: one number column,+and-rows on a quiet tint, one context line each side, the code painted the same way, the frame on the tree trunk. - Headings, lists, quotes, tables. Bold colored headings with no rules,
•◦☐☑markers, a quote bar, borderless tables with aligned columns and right-aligned numbers. - Turn headers.
◆ You · 1:11 PM ────as one titled rule over your prompt, then◉ Claude · 1:14 PMonce the turn starts, with a dots line under it: one dot per tool call, grouped by tool, green, a red✗for a failure, hollow while running, thenBash ×3 · Read ×2. Once done the line reads5 actions · 2 edits · 1 failed./foldtucks finished trees away and/unfoldopens them. - A tool tree. While a turn runs, every call is one row:
├─ ✓ Bash git status · 3 lineswith its wall time at the right,○while it runs,✗in red when it fails. Done commands step down to a quiet color, and paths draw relative to the project. Rows light under the pointer. The engine's folded runs name what they read:├─ ▸ Read ×2 SPEC.md · render.ts. Bash output is painted, three lines then a count. A finished agent is one row. - Background band. While subagents run, a rounded frame above the prompt lists them with a face, model and effort, current tool, tokens and the file they last touched, five at a time. The chevron folds it to one strip of faces.
- Event rows. A background task's notification draws as one tree row with its duration; a message from another agent draws as one muted row.
Every width is measured the way the engine measures cells, so emoji and CJK in tables stay aligned.
claude plugin marketplace add rashedInt32/glass
claude plugin install glass@glass
Restart Claude Code. Pick a palette with /config under Glass: tidepool
(default), water (Empryo's own proxysoul-water tokens), undertow (sampled from
Empryo's desktop video), codex or rose.
The palettes assume a dark terminal.
To try it from a clone without installing:
claude --plugin-dir /path/to/glass
SPEC.md is the contract: every element, its exact tree and colors, and
the directions that were tried and rejected, with reasons. Settled through
a design panel and an investigation against how Claude Desktop, the Codex
app and T3 Code render chat.
The tidepool palette maps a neovim theme of the same name by role:
strings olive, numbers and inline code pine, commands iris, builtins foam,
paths gold, links mint.
claude plugin validate .
npx tsc -p . # after the engine has laid .claude-plugin/types
claude plugin test . # tests/*.test.ts, run in the engine's own sandbox
grep -rnP "[^\x00-\x7F]" hooks/ # must print nothing
Every non-ASCII glyph is built from a code point in hooks/glyphs.ts.
Literals outside ASCII are forbidden in hooks/: the tool path that
writes files has dropped private-use glyphs before.
The shell tokenizer, the prose rules, the gutter-mark phrase tables and the output painter are ported from claude-hl, a PTY wrapper that did the same job by reading rendered ANSI. glass reads the markdown instead, which is why it can know a fence's language and never guesses where a code span ends.
MIT