朋友给我看了他的 Codex 桌宠,我回家复刻了一个
起因很朴素:朋友给我秀了他的 Codex 桌宠------一只小东西蹲在屏幕角落,Codex 思考它就托腮,跑工具它就工作,任务完成它就比个耶。我当时就一句:"这个我也要。"
我为什么敢动手
先说我的底子:有一点 AI 编程基础,但绝对算不上大佬。能做出这个桌宠,靠的不是什么高深武功,而是"拆步骤 + 让 AI 干重活"。
如果你也心动过、但觉得自己不行,这篇文章就是写给你的------因为它真的没那么难。整个流程我拆成了四步,每一步都能独立验收:
- 找一张图 → 用 AI 生成一段动态视频
- 从视频里抽帧 → 变成透明背景的"精灵表"
- 用一个桌面框架把精灵表"装"起来 → 桌宠诞生
- 接上 Cursor / Claude Code 的"事件" → 它会随你干活而变化
下面一步步说。
第一步:让一张静态图"动"起来
桌宠最核心的是"它得有动作"。我没有逐帧手画的能力,所以走了捷径:AI 视频生成。
我拿的是朋友的图,丢进 AI 视频生成工具,让它生成角色"托腮思考""举手比耶""敲键盘"这类动作视频。
我用的工具是豆包和即梦,选它的原因是免费额度多+动作自然+出图稳定。
这一步有几个真实的坑,我先替你排掉:
- 白底图:AI 生成的视频往往是白底,而且可能带水印。白底图不能直接拿来当精灵,后面抠图要处理。
- 镜头漂移:AI 视频偶尔会有缓慢的"推近 / 拉远",角色忽大忽小。抽帧前最好把镜头不稳定的片段裁掉。
- 水印是半透明的:这点最阴险------白底上它几乎隐形,抠完背景后反而变成一块白斑。
第二步:抽帧 + 抠图,把它变成"精灵表"
这一步是把视频变成程序能播放的素材。几个词我尽量用大白话解释:
- 抽帧:视频是一秒几十张连续图片(每张叫一帧)。我们不用全要,隔一点距离抽一张,动作就够连贯了。
- 抠图 / 去背景:把白底去掉,只留下角色,背景变透明(有条件的可以用ps或者wps的抠图,效果还不错)。
- 精灵表(sprite sheet):把一长串透明图片拼到一张大图里,程序按顺序"切"着播放,就是动画。
- 循环段:找出动作里能首尾衔接的一段,让桌宠能无限循环"托腮",而不是播完就停。
这步我写了个小脚本(Python,OpenCV 抽帧 + Pillow 抠图),流程是:抽帧 → 逐帧去白底 → 只保留最大的那个"连通区域"(防止水印和杂点混进来)→ 统一裁剪到同一个框 → 缩放 → 自动找循环段 → 拼成精灵表。
小经验:把调色板量化一下(比如压到 256 色),对这种平涂卡通风格几乎无损,但体积能小约 85%。一个 14MB 的序列帧,压完才 1.6MB。
到这一步,你已经有一堆能播的"素材"了,离桌宠只差一个"壳"。
第三步:装个"壳",让它蹲在桌面角落
壳我用的是 Tauri 2 + Svelte 5,两个词解释下:
- Tauri:一个做桌面应用(就是 Windows 上那种 .exe)的框架。它比老牌的 Electron 轻得多------我的桌宠常驻内存才约 37MB,Electron 动辄 150MB 起步。
- Svelte :一个写界面的框架,配合 Canvas(HTML 里画图的那块"画布")来播放精灵表、做呼吸 / 摇晃 / 弹跳这些动画。
这个壳要干几件事:一个透明、无边框、置顶、不占任务栏的小窗口;能拖拽、记住位置;右键有个菜单能换皮肤;有个系统托盘能显示 / 隐藏 / 退出。
这些 Tauri 基本都有现成能力,AI 帮我搭起来后,桌宠第一次"蹲"在了我的屏幕右下角。 
第四步:让它"活"过来------接上 Agent 的事件
静态的桌宠没意思,真正让它"看心情"的是事件驱动。
原理是这样:Cursor / Claude Code / Codex 这些编程 Agent 都支持一种叫 hooks 的东西,你可以理解成"钩子"------Agent 在某个时刻(开始思考、开始执行工具、任务完成)会触发一下这个钩子,去调用你指定的命令。
我的做法:写一个极小的桥接脚本挂在 hooks 上。Agent 一有动作,脚本就把一条统一格式的消息 POST 到本机的 127.0.0.1:4271 端口,桌宠里的服务收到后转发给前端,前端再根据状态决定播哪段动画、显示哪句气泡。
于是就有了这套联动:
- Agent 在思考 → 桌宠托腮
- Agent 在跑工具 → 桌宠转齿轮
- Agent 在等你点确认 → 桌宠等待
- 任务完成 → 桌宠比个耶,还提示"点击消散"
- 出错了 → 桌宠冒感叹号和汗滴
这里我死守一条原则:桥接脚本永远快速退出、绝不阻塞 Agent。桌宠只是旁观者,不能反过来卡住你干活。
现在的状态 & 我踩过的坑
现在桌宠已经稳定跑起来了,支持 Claude Code / Codex / Cursor 三种,能换肤、能缩放、能锁定监听某一个会话、还能开机自启和自动更新。
踩过的几个坑:
- 别的桌宠会"抢"你的 hooks :我本机之前装过另一款桌宠,它会重写
~/.claude/settings.json,把我挂的钩子顶掉,表现就是"桌宠突然收不到事件了"。 - 透明窗有阴影边框:Windows 下透明窗口要关掉阴影,否则有一圈细细的边框,很丑。一行配置的事。
- 别被"没反应"骗了:有段时间我以为完成态没显示,排查半天,其实是"完成"动画只播了零点几秒就回闲置,肉眼根本看不清。状态保持时间得调长。
我卡住的地方,求大佬指点
写到这里,桌宠已经是个合格的"心情显示器"了。但我更想要的下一步是:让它从"看"变成"能聊"------用语音或文本跟它对话,让它帮我控制电脑。
理想形态是:我说"帮我打开浏览器搜个东西或者说打开某个程序",它能听懂、能执行、还能用桌宠的表情和气泡给我反馈。
我卡在哪?卡在"怎么让桌宠成为一个真正的执行入口"------是直接在桌宠里内置一个对话 / 语音回路,还是复用现有 Agent(让它去调 Claude Code / Codex 的能力)?语音这块用哪套(本地 ASR 还是云端接口)?桌面控制的权限边界和安全怎么做?
这块我现在是"有一点想法、但拿不准技术路线"的状态。如果你做过类似的"桌宠 + 语音助手 / 桌面控制",或者有推荐的方案,评论区指个路,感激不尽。
最后
整个过程我最大的感受是:"看起来很难"和"真的很难"是两回事。 拆开之后,每一步都有现成的工具和 AI 帮你扛,你只需要当好那个"把步骤串起来"的人。
你有没有也心动过做桌宠?或者做过什么"别人觉得没用、但自己做得特开心"的小项目?来评论区聊聊------说不定我们下一篇文章就是你的故事。