← Sleepwing

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:

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.

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)

Pick by situation: you want decoration or a CPU cat → RunCat Neo, free, stop here. Breaks but no agents → Cat Gatekeeper. Codex is your only agent → use OpenAI's built-in Pets, it's first-party and already there. Windows or Linux → clawd-on-desk. Just want a sound at the end of one agent's run → the DIY hook above, no app needed. Several agents a day on a Mac, you want waiting-for-you to look different from done, and you'd like the pet to be your own animal → that's what Sleepwing is for.

中文速览

大多数 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。