A desktop pet for your Mac that actually does something
Most desktop pets are decoration: charming on Monday, closed by Friday, because they never tell you anything you didn't already know. The ones that stick have a job. Here's the honest range of options on macOS — several of them free and none of them ours — ending with the one we build.
Option 1 — a pet that's just nice to look at (free)
If what you want is a bit of life on the desktop, take the free route and stop there. Two that are genuinely good at this:
- RunCat Neo — a cat that runs in your menu bar, faster as your CPU gets busier. It's open source (Apache-2.0), free on the App Store, and accepts custom PNG runners and custom JSON metrics, so people have wired it to show things like Claude Code usage. It wants a recent macOS, so check the requirement before installing.
- Cat Gatekeeper — a cat that interrupts you for breaks. Free, local timer, no account, no tracking. It's a lovely pomodoro with a cat on top; it has no idea what your agents are doing.
Honest framing: these are decoration and timers. A menu-bar CPU graph can't distinguish "my agent finished" from "Xcode is indexing," and a fixed-interval break timer will nudge you at the exact moment your agent is waiting for a decision.
Option 2 — if you use Codex or ChatGPT desktop, you already have one (free, built in)
OpenAI ships Pets as an official Codex feature: a floating desktop pet and activity tray in ChatGPT desktop, a /pet command, a built-in terminal pet in Codex CLI (iTerm2/Kitty/Sixel), and pet states for Running / Needs input / Ready / Blocked. You can upload your own sprite sheet. Codex also has its own separate notification settings for turn completion, permissions, and questions.
There's a real community ecosystem around that format — free galleries like codexpet.top and Petdex install pets straight into ~/.codex/pets/.
If Codex is the only agent you use, this is the answer. It's first-party, free, and already installed. The limit is the obvious one: it watches Codex. Your Claude Code run in another terminal and your Cursor window don't exist to it.
Option 3 — DIY: make a sound or a banner, no pet at all (free)
Sometimes the pet is not the point and you just want to know when a long run ends. Every major agent can run a shell command on its own lifecycle events. For Claude Code, this goes in ~/.claude/settings.json and plays one sound when the agent needs you, another when it stops:
{
"hooks": {
"Notification": [{ "hooks": [{ "type": "command",
"command": "afplay /System/Library/Sounds/Glass.aiff" }] }],
"Stop": [{ "hooks": [{ "type": "command",
"command": "afplay /System/Library/Sounds/Funk.aiff" }] }]
}
}
Merge it into your existing hooks object rather than replacing the file; follow the official hooks docs for the current shape. Honest limits: every Notification sounds the same, nothing tells you which project, and you rebuild it per agent — Cursor uses ~/.cursor/hooks.json, Codex uses ~/.codex/hooks.json, OpenCode uses a TypeScript plugin, Gemini CLI uses ~/.gemini/settings.json. Each one is a different format. We wrote that up per agent: Claude Code, Cursor, OpenCode, Gemini CLI.
If you want an actual animated pet across several agents and you're not on macOS, the open-source clawd-on-desk is the one to look at — a pixel pet that reflects agent state, covers multiple agents, runs on Windows, macOS and Linux, and can import Codex pet animation packs. It's free. We're macOS-only, so for Windows and Linux it beats us by default.
Option 4 — a pet that watches every agent, and is your own animal
Sleepwing (free beta, macOS 14+, Apple Silicon) is the version of this we wanted and couldn't find: one pet on the desktop that represents every connected agent, with a specific job beyond looking cute.
- It knows which state it's in, per session. Working, waiting-for-you, finished, failed — through each provider's official local hooks: Claude Code, Cursor IDE and CLI, ChatGPT/Codex, OpenCode, Gemini CLI, TRAE, and the pi coding agent. One pet, not seven. Installation is reversible and never touches hooks it doesn't own.
- It gets you back in one click. "Open task" selects the exact terminal tab in Terminal.app or iTerm2, using only the session's controlling tty device name (for example
ttys012) — never terminal contents, paths, or window titles. - It turns waiting into actual breaks. Agent work time counts toward small health nudges — water, stretch, look away — and the timer pauses the moment a session needs you, which is the bug in every fixed-interval break app.
- It can be your cat. Pet Studio's "Start from a photo" lifts the subject out of a photo entirely on your Mac — background removed, centered on a transparent canvas — and saves it as reference art in
Downloads/Sleepwing Reference Art. You then pick a style (faithful to photo, pixel, plush, sticker, or 3D toy) and hand it to your own coding agent with the bundledperch-petskill, which produces a complete animated.perchpetpackage you import back. Two built-in characters ship with the app, three sizes, reduced-motion support; installed Codex-format pets under~/.codex/petsare discovered automatically and appear in the same library. - It makes zero outbound network requests. No account, no telemetry. Hooks reduce events locally before they cross loopback: only the provider, an opaque session ID, the phase, a timestamp, a bounded task label, and an allowlisted local resume route. Grep the source — it's source-available under FSL-1.1-MIT. Measured on the release build: ≈0.8% CPU and ≈100 MB while the pet idles at 30 fps.
Honest limits, because they matter here: macOS 14+ on Apple Silicon only — no Intel build, no Windows, no Linux. Hook delivery is best-effort and never blocks your agent, so if the app isn't running you lose a notification rather than a turn. And the photo flow is honest about the division of labour: the subject lift and the import validation are native and local, but the animated sprite production is done by your agent, which needs image generation and visual inspection — whatever that agent sends to its own model is between you and it. Sleepwing itself sends nothing.
⬇ Download the notarized beta (macOS 14+, Apple Silicon)
中文速览
大多数 Mac 桌宠是纯装饰,新鲜两天就关掉了——因为它们并不知道你的电脑在干什么。诚实的几种选择:只要可爱就用 RunCat Neo(菜单栏跑猫,开源 Apache-2.0,免费,支持自定义 PNG 角色与自定义 JSON 指标,注意它要求较新的 macOS)或 Cat Gatekeeper(猫咪休息提醒,本地计时、无账户、无追踪);只用 Codex 的话官方自带 Pets 最合适——ChatGPT 桌面端的浮动桌宠与活动托盘、/pet 命令、Codex CLI 终端宠物,四种状态(Running / Needs input / Ready / Blocked),还能上传自定义精灵图,社区画廊(codexpet.top、Petdex)可一键装到 ~/.codex/pets/,但它只看 Codex;只想要个提示音就自己写 hook(上面有可复制的 ~/.claude/settings.json 配置,注意合并而非覆盖;各家格式不同:Cursor 用 ~/.cursor/hooks.json、OpenCode 用 TS 插件、Gemini CLI 用 ~/.gemini/settings.json);不用 macOS 就看开源的 clawd-on-desk(Win/mac/Linux 全覆盖、免费、可导入 Codex 宠物动画包)。
Sleepwing 做的是另一件事:一只桌宠代表所有 Agent(Claude Code、Cursor、Codex、OpenCode、Gemini CLI、TRAE、pi),通过各家官方本地 hooks 区分「工作中/等你/完成/失败」,可逆安装、不碰你已有的 hooks;点一下跳回 Terminal.app / iTerm2 的确切标签页(仅依据 tty 设备名,不读终端内容与路径);把 Agent 工作时间换成真实的小休息,并在 Agent 等你时自动暂停提醒。Pet Studio 的「从照片开始」在本机抠出主体(去背、居中、透明),存到 Downloads/Sleepwing Reference Art,选风格(忠于照片/像素/毛绒/贴纸/3D 玩具)后交给你自己的 Agent 用自带 perch-pet 技能产出完整动画包再导入——照片不离开本机;~/.codex/pets 下已装的 Codex 格式宠物会自动出现在同一个库里。零外联、无账户、无遥测,源码可审计(FSL-1.1-MIT)。如实说明短板:仅支持 macOS 14+ Apple Silicon(无 Intel/Windows/Linux 版本);hook 为尽力而为投递,应用未运行时丢事件而不排队;动画产出依赖你的 Agent 具备出图与自检能力,Sleepwing 本身不联网。免费 Beta。