DESKTOP PET RESCUE

Porting Windows-only desktop pets to native macOS • two Chiikawa pets so far • fixes sent upstream

← Back to Case Studies

Why I rescue desktop pets

There is a small, sincere genre of software where a tiny character wanders your screen, squeaks when you pick it up, and occasionally reminds you to drink water. Two of my favorites are Chiikawa desktop pets, and both were Windows-only. I use a Mac. This was, for a while, simply a sad fact about my life.

Then one evening in July 2026 I sat down with a coding agent riding shotgun and fixed the sad fact. By the end of the night both pets ran natively on macOS, both ports were public on GitHub, and one set of fixes was already on its way back to the original developer. This page is the story of how, because the two rescues needed completely different techniques, and the difference is the interesting part.

Neither of these apps is mine in any sense that matters. The art, the animation, the character work, the whole reason the pets are worth wanting: that is the original developers' hard, lovely work. A rescue is just carpentry. Someone built a beautiful thing for one house, and I built it a door into mine.

The rules of a rescue

Porting someone else's labor of love comes with obligations, so every rescue follows the same rules:

Rescue one: Yaha-Pet, the easy(ish) way

Yaha-Pet by gitChara-dot is a PyQt6 app, MIT licensed, where Usagi, Hachiware, and Chiikawa roam your desktop. Open source with a permissive license is the friendly case: fork it, run it on a Mac, and fix what breaks.

What broke was instructive. Grabbing a pet crashed the whole app: a double-free in the sound playback path that Qt 6.10 turned from latent bug into reliable SIGABRT. And the pets only ever jumped, never walked, because the random behavior roll was checked with roll <= 100, which is always true when your roll is out of 100. Both bugs affect Windows too. Both fixes went into the port, and then upstream.

The Mac-specific work was the fun part: a real Dock menu, staying visible when the app loses focus, click-through everywhere except the actual sprite, and a "gather everyone!" command. Then the additions nobody asked for: throw physics (velocity sampled from the last ~120 ms of your drag, then gravity, wall bounces, and a crash-landing sprite) and a together-moment where Chiikawa and Hachiware stroll off holding hands if they happen to touch.

The part I care about most is PR #2, "Add native macOS support", opened July 9, 2026 and offered upstream so Mac support can live in the original project instead of a fork. Until it resolves, the fork politely waits.

Rescue two: Desktop Chiikawa, the hard way

Desktop Chiikawa by CookieElmo is a wellness-reminder pet from itch.io: it wanders, chats, and tells you to hydrate. No source code, no license, just a Windows executable. You cannot fork what was never published, so this rescue needed a different route.

Godot games carry their assets and scripts in a .pck data file, and the engine's export runtime is the same official binary for every platform. So: extract the .pck from the Windows executable, wrap it in the official Godot 4.4.1 macOS runtime, and the pet runs natively on Apple Silicon and Intel. No Wine, no emulation, no translation layer. The same game data, in an engine binary that was always meant to run on a Mac.

From there the port grew some quality-of-life the original never needed: settings that persist between launches (position, skin, language, reminders), autonomous wandering, petting and snack reactions with real character catchphrases (ura! yaha! yampapa~), kaomoji speech bubbles, and click-through everywhere except the sprite itself. One bug shipped and got fixed after launch: dragging the pet never synced the wander position, so it would teleport back to where you picked it up. One line in main.gd.

The repack tooling (tools/repack_pck.py) is committed to the repo, so the whole rebuild is reproducible rather than a one-off miracle. And because there is no license granting me anything, the repo leads with gratitude and stands ready to vanish the moment CookieElmo prefers it gone.

How a rescue works

Two pets, two very different situations, one shape:

PATH 1 · SOURCE AVAILABLE (MIT) fork the repo yaha-pet · pyqt6 fix what breaks crash + jump bug add mac support dock · throw physics PATH 2 · NO SOURCE (ALL RIGHTS RESERVED) extract game data .pck from the .exe native runtime official godot 4.4.1 extend the scripts wander · snacks · kaomoji ship, credit first github release PR upstream fixes go home

The second path deserves one more sentence, because "extract the game data" can sound shadier than it is. Godot separates engine from game: the engine is MIT-licensed and publicly downloadable for every platform, and the game is a data file the engine loads. The rescue never touches or redistributes a modified engine, never breaks protection (there was none), and never hides what it did: the README explains the whole method and the repack script is right there in the repo.

Where they are now

Both pets are public, with prebuilt releases so nobody has to compile anything to adopt one:

Ongoing threads: watching the upstream PR, and collecting real voice clips for the characters that shipped silent, because a Chiikawa that cannot squeak is only most of a Chiikawa.

If you have a beloved Windows-only desktop pet and a Mac, the whole method is documented in both repos. The little guys deserve to live everywhere.

More projects