claude-office
A TUI companion for Claude Code — watch your AI coding sessions come alive as animated kaomoji characters in a virtual terminal office.
┌─ claude-office ─────────────────────────────────────────────┐
│ │
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░ ┌─────┐ ┌─────┐ ┌─────┐ ░░ │
│ ░░ │ ▒▒▒ │ │ ▒▒▒ │ │ ▒▒▒ │ ░░ │
│ ░░ └──┬──┘ └──┬──┘ └──┬──┘ ░░ │
│ ░░ (o.o)~ (o.O) (-.-)zzZ ░░ │
│ ░░ "Edit app.rb" "Reading tests" ░░ │
│ ░░ └─ (o_o) ░░ │
│ ░░ "Sub: search" ░░ │
│ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ │
├──────────────────────────────────────────────────────────────┤
│ Agent 1: typing (1 sub) │ Agent 2: reading │ q: quit │
└──────────────────────────────────────────────────────────────┘
What it does
claude-office reads Claude Code's JSONL transcript files in real-time and renders an animated office where each Claude session is a kaomoji character sitting at a desk. Characters change expressions based on what tools Claude is using:
| Expression | State | Meaning |
|---|---|---|
(o_o) |
idle | Waiting between actions |
(o.o)~ |
typing | Editing or writing files |
(o.O) |
reading | Reading files, searching code |
(>.<) |
running | Executing bash commands |
(-.-)zzZ |
waiting | Turn ended, needs your input |
Sub-agents spawned by the Task tool appear indented below their parent with a tree connector.
Installation
gem install claude-officeRequirements: Ruby 3.2+
Usage
# Watch Claude sessions in the current directory
claude-office
# Watch a specific project
claude-office ~/workspace/my-project
# Disable terminal bell notifications
claude-office --no-soundRun this in a separate terminal window alongside your Claude Code session. The office updates in real-time at 30fps as Claude works.
Press q to quit.
How it works
- Claude Code writes JSONL transcripts to
~/.claude/projects/<project-slug>/ - claude-office polls that directory for new
.jsonlfiles - Each file becomes an agent (kaomoji character) at a desk
- Tool use events (
Read,Edit,Bash, etc.) drive character animations - Sub-agents from
Tasktool calls appear as child characters - When a turn ends, the character enters a waiting state with a speech bubble
Architecture
Built with the Charm Ruby ecosystem:
- bubbletea — Elm Architecture TUI framework
- lipgloss — Terminal styling and layout
- harmonica — Spring-based animation physics
Components
| Component | Purpose |
|---|---|
Transcript::Watcher |
Background thread polling JSONL files |
Transcript::Parser |
Converts JSONL lines into typed events |
Agents::Agent |
State machine: idle / working / waiting |
Agents::SubAgent |
Child agent tracking for Task tool |
Office::Grid |
2D tile grid with auto-layout |
Office::Pathfinder |
BFS pathfinding for character movement |
Rendering::Renderer |
Composites grid + characters + status bar |
Animation::SpringMover |
Smooth position interpolation |
Development
git clone https://github.com/fruizg0302/claude-office.git
cd claude-office
bundle install
bundle exec rspec