{"id":46649772,"url":"https://github.com/fruizg0302/claude-office","last_synced_at":"2026-03-08T06:03:17.832Z","repository":{"id":340070132,"uuid":"1164401897","full_name":"fruizg0302/claude-office","owner":"fruizg0302","description":"A TUI companion for Claude Code — animated kaomoji agents in a virtual office","archived":false,"fork":false,"pushed_at":"2026-02-23T03:33:05.000Z","size":38,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-23T11:33:02.770Z","etag":null,"topics":["charm","claude","cli","kaomoji","ruby","terminal","tui"],"latest_commit_sha":null,"homepage":"https://rubygems.org/gems/claude-office","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fruizg0302.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-23T03:20:46.000Z","updated_at":"2026-02-23T03:32:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fruizg0302/claude-office","commit_stats":null,"previous_names":["fruizg0302/claude-office"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/fruizg0302/claude-office","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fruizg0302%2Fclaude-office","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fruizg0302%2Fclaude-office/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fruizg0302%2Fclaude-office/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fruizg0302%2Fclaude-office/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fruizg0302","download_url":"https://codeload.github.com/fruizg0302/claude-office/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fruizg0302%2Fclaude-office/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30246874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T05:41:50.788Z","status":"ssl_error","status_checked_at":"2026-03-08T05:41:39.075Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["charm","claude","cli","kaomoji","ruby","terminal","tui"],"created_at":"2026-03-08T06:03:07.154Z","updated_at":"2026-03-08T06:03:17.820Z","avatar_url":"https://github.com/fruizg0302.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# claude-office\n\nA TUI companion for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) — watch your AI coding sessions come alive as animated kaomoji characters in a virtual terminal office.\n\n```\n┌─ claude-office ─────────────────────────────────────────────┐\n│                                                              │\n│  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  │\n│  ░░ ┌─────┐           ┌─────┐           ┌─────┐        ░░  │\n│  ░░ │ ▒▒▒ │           │ ▒▒▒ │           │ ▒▒▒ │        ░░  │\n│  ░░ └──┬──┘           └──┬──┘           └──┬──┘        ░░  │\n│  ░░  (o.o)~            (o.O)             (-.-)zzZ      ░░  │\n│  ░░  \"Edit app.rb\"     \"Reading tests\"                  ░░  │\n│  ░░  └─ (o_o)                                           ░░  │\n│  ░░     \"Sub: search\"                                   ░░  │\n│  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  │\n│                                                              │\n├──────────────────────────────────────────────────────────────┤\n│ Agent 1: typing (1 sub) │ Agent 2: reading │ q: quit        │\n└──────────────────────────────────────────────────────────────┘\n```\n\n## What it does\n\nclaude-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:\n\n| Expression | State | Meaning |\n|-----------|-------|---------|\n| `(o_o)` | idle | Waiting between actions |\n| `(o.o)~` | typing | Editing or writing files |\n| `(o.O)` | reading | Reading files, searching code |\n| `(\u003e.\u003c)` | running | Executing bash commands |\n| `(-.-)zzZ` | waiting | Turn ended, needs your input |\n\nSub-agents spawned by the `Task` tool appear indented below their parent with a tree connector.\n\n## Installation\n\n```bash\ngem install claude-office\n```\n\n**Requirements:** Ruby 3.2+\n\n## Usage\n\n```bash\n# Watch Claude sessions in the current directory\nclaude-office\n\n# Watch a specific project\nclaude-office ~/workspace/my-project\n\n# Disable terminal bell notifications\nclaude-office --no-sound\n```\n\nRun this in a **separate terminal window** alongside your Claude Code session. The office updates in real-time at 30fps as Claude works.\n\nPress `q` to quit.\n\n## How it works\n\n1. Claude Code writes JSONL transcripts to `~/.claude/projects/\u003cproject-slug\u003e/`\n2. claude-office polls that directory for new `.jsonl` files\n3. Each file becomes an agent (kaomoji character) at a desk\n4. Tool use events (`Read`, `Edit`, `Bash`, etc.) drive character animations\n5. Sub-agents from `Task` tool calls appear as child characters\n6. When a turn ends, the character enters a waiting state with a speech bubble\n\n## Architecture\n\nBuilt with the [Charm Ruby](https://github.com/nicholaides/charm-ruby) ecosystem:\n\n- **[bubbletea](https://rubygems.org/gems/bubbletea)** — Elm Architecture TUI framework\n- **[lipgloss](https://rubygems.org/gems/lipgloss)** — Terminal styling and layout\n- **[harmonica](https://rubygems.org/gems/harmonica)** — Spring-based animation physics\n\n### Components\n\n| Component | Purpose |\n|-----------|---------|\n| `Transcript::Watcher` | Background thread polling JSONL files |\n| `Transcript::Parser` | Converts JSONL lines into typed events |\n| `Agents::Agent` | State machine: idle / working / waiting |\n| `Agents::SubAgent` | Child agent tracking for Task tool |\n| `Office::Grid` | 2D tile grid with auto-layout |\n| `Office::Pathfinder` | BFS pathfinding for character movement |\n| `Rendering::Renderer` | Composites grid + characters + status bar |\n| `Animation::SpringMover` | Smooth position interpolation |\n\n## Development\n\n```bash\ngit clone https://github.com/fruizg0302/claude-office.git\ncd claude-office\nbundle install\nbundle exec rspec\n```\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffruizg0302%2Fclaude-office","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffruizg0302%2Fclaude-office","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffruizg0302%2Fclaude-office/lists"}