> ## Content Index
> Fetch the complete content index at: https://www.thedaringcreatives.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Desktop Pets for Mac That Report What Actually Broke
- URL: https://www.thedaringcreatives.com/mascots-live-on-my-dock/
- Published: 2026-07-29T00:08:05.000Z
- Updated: 2026-07-31T16:16:43.000Z
- Description: Two brand mascots that live on my Dock and became the notification layer for everything I send from my phone. What they do, and the bugs that taught me the most.
- Author: William Smith
- Tags: william-writing, ai, pixel art, build log, mascots, desktop apps, #issue-2026-07, opinion

I have two brands and two mascots. Daring Strategy has a boxy little robot with a filing cabinet for a torso. The Daring Creatives has Sherman, who is a real dog, a Rottweiler mix who wears red goggles and runs Central Dispatch.

Both of them existed as artwork. Illustrations in guides, faces on a page, characters in the fiction.

Now they live on my Dock, and somewhere along the way they stopped being decoration. They are the thing that tells me when work I sent from my phone actually landed, and when it didn't.

![Sherman the pixel dog pacing on the macOS Dock with a small thought bubble beside him reading the subject of the note he is working on](https://storage.ghost.io/c/4b/dc/4bdc4be6-5abc-4e80-986d-59016a3f1831/content/images/2026/07/shot-desktop-1.jpg)

Mid-dispatch. He paces, and the bubble says what he is on and for how long.

That is not a mockup. Sherman is pacing because a note I sent from my phone is being worked on right now, and the little bubble says what it is.

## Two characters, two completely different ways to draw them

The robot I drew in code. Not by hand in a drawing app, in actual code: a script that says put a rectangle here, put a circle there, shade this side with a checkerboard pattern. It sounds insane, and it took a few rounds of "that looks nothing like him" before it did. But once it works you get something worth having, which is a character you can pose.

Want him to blink? Change one value. Want his arm up? Change another. I ended up with 26 different frames of that robot out of one script — walking, sitting, yawning, reading a file out of his own belly drawer.

![Twelve frames of the Daring Strategy pixel robot laid out in two rows: idle, blinking, looking around, walking, sitting, hopping, alert and dancing](https://storage.ghost.io/c/4b/dc/4bdc4be6-5abc-4e80-986d-59016a3f1831/content/images/2026/07/sprites-robot-1.jpg)

Twelve poses, one script. Every frame is the same code with different numbers.

Sherman I could not do that way. He is a real dog with a real face, and a script that draws rectangles is never going to get there. So I used an image model instead, feeding it actual photos of him as reference and asking for pixel art.

I asked for four different looks first and put them side by side. I picked one and immediately caught something that had been missed: Sherman has a docked nub tail, and every generated version had given him a full one.

That is the whole reason to show options before building anything. One glance from the person who knows the subject beat any amount of being careful.

## A walk is four pictures

This is the most reusable thing here.

A walk cycle is four drawings. Front leg forward, legs gathered underneath, other leg forward, gathered again. Play those four on a loop while sliding the whole character sideways, and your brain does the rest. It reads as walking.

![Sherman's seven sprite frames in two rows: standing, sitting, lying down, and four walking poses](https://storage.ghost.io/c/4b/dc/4bdc4be6-5abc-4e80-986d-59016a3f1831/content/images/2026/07/sprites-sherman-1.jpg)

Seven pictures is a whole personality.

Seven frames total for Sherman: standing, sitting, lying down, and four walking. Walking left is the same four frames flipped horizontally, which is free and means he can never accidentally look like a different dog facing the other way.

## They became the notification system

Here is the part I did not plan.

I send work to these businesses from my phone. I hit a button, talk into it, and a pipeline on my Mac picks the note up, works it, and files the result. When I built that, it announced itself through a push service. Which I never once opened.

That turned out to matter more than it sounds. Every dispatch I sent for a week failed within about five seconds of starting, and I found out seven notes later. The push notifications had all fired perfectly into an app I do not look at.

So the pets became the channel instead, because the Dock is the thing I actually see.

## What a dispatch looks like now

The moment a note lands, the pet belonging to that business turns and says *Got it*, with my own words read back to me. That answers the only question I have in the first ten seconds, which is whether the thing heard me at all.

Then he starts pacing. Not the usual amble — a busier walk, no sitting, no lying down, and a small thought bubble next to him with the subject of the note and how long he has been at it. `AGRIS red profile 4m…`

That number matters more than it looks. A pet that just says "working" for twenty minutes is indistinguishable from a pet that is stuck.

When it finishes he stops, settles, and tells me what happened — with a button that opens whatever got made. If it failed, he says that instead, in those words, because a failure that looks like a success is the whole problem I was trying to solve.

## Only the right dog answers

Both pets read the same file, which meant early on that every note lit up both of them. A note about Daring Strategy had Sherman pacing about it too.

Now the pipeline reads the note for which business I named and tags it, and each pet only answers for its own. If I name neither, or name both, they both still react — a missed receipt is worse than a duplicated one, and I would rather two pets tell me than watch the wrong one.

## The bugs, which were the useful part

**The app froze and there was no error.** macOS had put up a permission box asking if the app could read my Documents folder, and I had never clicked it. The app was politely waiting for an answer that was never coming. Nothing crashed, nothing logged. The fix was to read files in the background so a pending question can never freeze the character.

**A test that could not fail.** After a click bug I added an automatic check that the buttons were where they were drawn. It passed. Then I deliberately broke the layout to make sure the check would catch it, and it passed again. It was comparing the code to itself. A test that cannot fail is worse than no test, because it tells you everything is fine while you sleep.

**The error message thrown on the floor.** This is the one that cost a week. When a dispatch failed, the script logged `FAILED (rc=1)` and discarded what the agent actually said, because that text went to a different output stream than the one being recorded. Seven failures, no evidence. I added one line to log it, re-ran, and the answer was sitting there immediately: an API key had run out of credit. Five minutes of diagnosis, hidden behind a week of silence.

**Two supervisors for one thing.** The Command Center server would not stay dead. Killing it brought it back in 34 milliseconds. It turned out a system-level launch daemon had been keeping it alive since April, and months later I had added a second watchdog on a timer to solve a restart problem that was already solved. Neither knew about the other.

**Forget did not forget.** The pets can be told to drop an observation. It never stuck, and the reason is that each observation was identified by a string with its own numbers baked in — `list-conversion:8:45:21`. Dismiss it, the analytics refresh, the numbers move, and it comes back as a new item wearing the same face. It now keys on the part that says what it is rather than what it currently measures.

**A label that said nothing.** The thought bubble picks the subject out of the note. My first version took the first few meaningful words, which works until you notice how people actually talk. My notes open with "This is for the daring creatives, I want…" — so the bubble read `This item is`. Word position cannot tell you what something is about. It takes an actual summary, so now it gets one.

## What I actually took from this

Most of these bugs share a shape. Something failed, something aged, something got dropped — and the part that was supposed to tell me was either pointed at a surface I do not look at, or had quietly thrown the evidence away.

The mascots did not fix that by being clever. They fixed it by being somewhere I cannot avoid looking, and by being specific when they speak.

A number in a dashboard is easy to ignore. A dog you recognise, pacing, with your own words in a bubble over his back, is harder to walk past.