{"id":46189974,"url":"https://github.com/ofershap/cursor-office","last_synced_at":"2026-03-08T05:01:27.981Z","repository":{"id":341367512,"uuid":"1169858895","full_name":"ofershap/cursor-office","owner":"ofershap","description":"A living pixel art office for your Cursor AI agent — watch it work, click things, discover easter eggs","archived":false,"fork":false,"pushed_at":"2026-03-04T08:52:53.000Z","size":3491,"stargazers_count":33,"open_issues_count":2,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-06T05:03:40.470Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://open-vsx.org/extension/ofershap/cursor-office","language":"TypeScript","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/ofershap.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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},"funding":{"github":["ofershap"]}},"created_at":"2026-03-01T10:33:00.000Z","updated_at":"2026-03-06T02:24:15.000Z","dependencies_parsed_at":"2026-03-05T02:01:02.693Z","dependency_job_id":null,"html_url":"https://github.com/ofershap/cursor-office","commit_stats":null,"previous_names":["ofershap/agent-arcade","ofershap/cursor-office"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ofershap/cursor-office","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-office","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-office/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-office/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-office/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ofershap","download_url":"https://codeload.github.com/ofershap/cursor-office/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ofershap%2Fcursor-office/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30207389,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T03:24:23.086Z","status":"ssl_error","status_checked_at":"2026-03-07T03:23:11.444Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":[],"created_at":"2026-03-03T00:11:58.573Z","updated_at":"2026-03-07T04:01:07.933Z","avatar_url":"https://github.com/ofershap.png","language":"TypeScript","funding_links":["https://github.com/sponsors/ofershap"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/idle.png\" alt=\"Cursor Office\" width=\"460\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eCursor Office\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Your AI agent writes your code, reads your files, runs your tests, and fixes your bugs.\u003cbr\u003e\n  The least you can do is give it an \u003cstrong\u003eoffice\u003c/strong\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eYou'll find yourself glancing at the bottom panel just to see what it's up to.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#install\"\u003e\u003cimg src=\"https://img.shields.io/badge/Install-Guide-blue?style=for-the-badge\" alt=\"Install\"\u003e\u003c/a\u003e\n  \u0026nbsp;\n  \u003ca href=\"#contributing\"\u003e\u003cimg src=\"https://img.shields.io/badge/Plugins-Add_Yours-orange?style=for-the-badge\" alt=\"Plugins\"\u003e\u003c/a\u003e\n  \u0026nbsp;\n  \u003ca href=\"CONTRIBUTING.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/Contributing-Guide-green?style=for-the-badge\" alt=\"Contributing\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://open-vsx.org/extension/ofershap/cursor-office\"\u003e\u003cimg src=\"https://img.shields.io/open-vsx/v/ofershap/cursor-office?label=Open%20VSX\" alt=\"Open VSX\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.typescriptlang.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/TypeScript-strict-blue.svg\" alt=\"TypeScript\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://cursor.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/Cursor-1.85+-007ACC.svg\" alt=\"Cursor\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ofershap/cursor-office\"\u003e\u003cimg src=\"https://img.shields.io/badge/Sprites-100%25_code-ff69b4.svg\" alt=\"Sprites\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/ofershap/cursor-office\"\u003e\u003cimg src=\"https://img.shields.io/badge/Bundle-27KB-brightgreen.svg\" alt=\"Bundle size\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n![Cursor Office - pixel art office for Cursor AI agents](assets/demo.gif)\n\n\u003cp align=\"center\"\u003e\u003cem\u003eEvery sprite is drawn from code. Zero image files. 27KB total.\u003c/em\u003e\u003c/p\u003e\n\n---\n\n## Your Agent Works in a Void\n\nYou outsourced your job to an AI agent. It writes code for hours while you get coffee, scroll Twitter, or pretend to be in a meeting. But does it get a desk? A window? A coffee mug?\n\nNo. It works in the shades. A terminal. A blinking cursor. That's not how you treat an employee.\n\n**Cursor Office** gives your agent a proper workspace. A desk with a monitor. A bookshelf. A cat. An arcade cabinet for breaks. A window with a real sky that matches your actual time of day. When it writes code, it sits at the desk and types. When it finishes a build, it stands up and celebrates. When it's idle, it gets coffee, pets the cat, waters the plant.\n\nGlance at the bottom panel. Character at the desk? Things are happening. Character wandering? The agent is done. It's ambient awareness, like background music you stop noticing after a day.\n\n---\n\n## Why\n\nTo watch someone work.\nTo bother the cat.\nTo stare at a guy who lives in your IDE tab.\nTo know your agent is doing something without reading a log.\n\n---\n\n## What You Actually See\n\n| Your agent is... | The office shows... |\n|---|---|\n| Writing / editing code | Character sits at desk, types away (back to you, like a real employee) |\n| Reading files | At desk, speech bubble shows 📖 |\n| Running commands | At desk with ⚡ status bubble |\n| Spawning subagents | Picks up the red desk phone — \"Delegating...\" |\n| Idle / between tasks | Wanders the office. Coffee, bookshelf, cat, arcade |\n| Done with real work | Jumps up and celebrates (only after actual edits, not just chatting) |\n| Hit an error | ⁉️ bubble, walks away from desk |\n\n---\n\n## Everything Is Clickable\n\nYour agent's office is better than yours.\n\n| Object | What happens |\n|---|---|\n| 💡 Lamp | Toggle room lights. The agent works late too |\n| 🪟 Window | Open/close curtains. Sky matches real time of day, stars at night |\n| 🕹️ Arcade cabinet | Cycles through Space Invaders, Tetris, and Pong on the tiny screen |\n| 📚 Bookshelf | Shows book titles: Clean Code, SICP, Design Patterns... |\n| 💧 Water cooler | Bubble animation. Hydration matters |\n| 🌱 Plant | Grows through 3 stages when you water it (click it!) |\n| 🐱 Cat | Nudge it. Purrs, wanders off, comes back |\n| ☕ Coffee mug | Steam rises. Always fresh |\n| 📞 Desk phone | Rings and vibrates when the agent delegates to a subagent |\n| 🤖 Roomba | Drifts in every few minutes to clean the floor |\n\nClick any object while idle and the character walks over to check it out.\n\n---\n\n## Idle Time Is Not Wasted Time\n\nWhen the agent isn't working, it has a life. It stands around, grabs coffee, browses the bookshelf, pets the cat, plays the arcade, waters the plant, gets water from the cooler. Each activity has randomness baked in so it never feels scripted. The character strolls between spots at a leisurely pace, but rushes to the desk when real work comes in. Just like a real employee.\n\n---\n\n| Idle | Working | Celebrating |\n|---|---|---|\n| ![idle](assets/idle.png) | ![working](assets/working.png) | ![celebrating](assets/celebrate.png) |\n\n| Lamp off |\n|---|\n| ![dark mode](assets/dark.png) |\n\n---\n\n## Install\n\n### From Extensions panel\n\nSearch **\"Cursor Office\"** in the Extensions panel (`Cmd+Shift+X`) and hit install.\n\n### From source\n\n```bash\ngit clone https://github.com/ofershap/cursor-office.git\ncd cursor-office\nnpm install \u0026\u0026 npm run build\nnpx vsce package --no-dependencies\n```\n\nThen in Cursor: `Cmd+Shift+P` → \"Install from VSIX\" → select `cursor-office-0.1.0.vsix`.\n\nThe office appears as a tab in the bottom panel bar (next to Terminal, Output, etc). Or hit **`Cmd+Shift+.`** to jump straight there.\n\n---\n\n## How It Knows What Your Agent Is Doing\n\nWorks out of the box — no API keys, no patches, no config. The extension uses Cursor's [hooks API](https://docs.cursor.com/context/hooks) to react to every tool call, subagent spawn, and completion event in real time. Falls back to transcript file watching if hooks aren't available.\n\n---\n\n## FAQ\n\n**Does it use tokens / cost anything?**\nNo. It doesn't talk to any AI model. It reacts to events Cursor already emits.\n\n**Does it slow down my agent?**\nNo. The extension runs in a separate process. The agent doesn't know it exists.\n\n---\n\n## Built Different\n\n| | |\n|---|---|\n| **Extension host** | VS Code / Cursor Extension API |\n| **Rendering** | Canvas 2D, requestAnimationFrame, 60fps |\n| **Sprites** | Procedural pixel art. Every pixel drawn from code, zero image files |\n| **Build** | esbuild, single-file bundle, 27KB |\n| **Language** | TypeScript (strict) |\n| **Plugin system** | Drop a `.ts` file in `plugins/`. [See the Roomba](plugins/roomba.ts) |\n\n---\n\n## Development\n\n```bash\ngit clone https://github.com/ofershap/cursor-office.git\ncd cursor-office\nnpm install\nnpm run build          # one-shot build\nnpm run watch          # rebuild on save\n```\n\nPress F5 in Cursor/VS Code to launch the Extension Development Host.\n\n### Playground\n\nOpen `dev/playground.html` in your browser after building. It renders the full office with buttons to simulate every agent state — idle, working, phone call, celebrate, error. No extension host needed. Great for iterating on sprites, objects, and animations.\n\n```bash\nnpm run build \u0026\u0026 open dev/playground.html\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eProject structure\u003c/summary\u003e\n\n```\nsrc/\n├── extension.ts          # Extension entry, registers panel + commands\n├── panelProvider.ts       # WebviewViewProvider, HTML injection\n├── cursorWatcher.ts       # Watches transcripts or hooks state file\n├── transcriptParser.ts    # Parses JSONL, infers agent activity\n└── hooksInstaller.ts      # Installs/removes Cursor hooks\n\nhooks/\n└── cursor-office-hook.sh  # Shell script that hooks call, writes state file\n\nwebview/\n├── index.ts              # Canvas setup, event handlers, message bridge\n├── office.ts             # Renders walls, floor, lighting, z-sorting\n├── character.ts          # Movement, idle waypoints, speech bubbles\n├── objects.ts            # Built-in interactive objects\n├── sprites.ts            # Programmatic pixel art sprite generation\n├── hitTest.ts            # Click and hover detection\n├── gameLoop.ts           # requestAnimationFrame loop\n├── canvas.ts             # Shared drawing utils\n└── types.ts              # TypeScript interfaces\n\nplugins/\n└── roomba.ts             # Reference plugin, robot vacuum cleaner\n\ndev/\n└── playground.html       # Visual sandbox for testing without Cursor\n```\n\n\u003c/details\u003e\n\n---\n\n## Contributing\n\nDrop a `.ts` file in the [`plugins/`](plugins/) folder. The built-in Roomba ([`plugins/roomba.ts`](plugins/roomba.ts)) is the reference — self-contained robot vacuum with its own sprite, state machine, and animations. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide.\n\n```typescript\nimport { createMyThing } from '../plugins/my-thing';\n\nwindow.cursorOffice.registerObject(myObject);\n```\n\nBuild, then open `dev/playground.html` in your browser to test your object without installing the extension. Click around, trigger state changes with the buttons at the bottom, and iterate until it looks right.\n\n---\n\n## Sponsor\n\nWant your brand in the office? A mug with your logo, a poster on the wall, a gadget on the desk. Pixel art, fully interactive, seen by every user every session. [Reach out](https://linkedin.com/in/ofershap) or open an issue.\n\n---\n\n## Author\n\n[![Made by ofershap](https://gitshow.dev/api/card/ofershap)](https://gitshow.dev/ofershap)\n\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-0A66C2?style=flat\u0026logo=linkedin\u0026logoColor=white)](https://linkedin.com/in/ofershap)\n[![GitHub](https://img.shields.io/badge/GitHub-Follow-181717?style=flat\u0026logo=github\u0026logoColor=white)](https://github.com/ofershap)\n\n## License\n\n[MIT](LICENSE) \u0026copy; [Ofer Shapira](https://github.com/ofershap)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fofershap%2Fcursor-office","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fofershap%2Fcursor-office","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fofershap%2Fcursor-office/lists"}