Inspiration

Habit trackers ask you to read your progress: a grid of squares, a streak counter, a bar that fills. It works — until the day you break the streak, and the same design that motivated you starts to accuse you.

We wanted the opposite: progress you look after rather than progress you report to. So we made the progress bar a creature.

What it does

Small daily acts of self-care — a glass of water, a ten-minute walk, one step of a routine — feed a pixel pet. It hatches from an egg and grows through six stages. Around it: step-by-step routines, a focus timer, breathing, goals, a home-screen widget and an Android Quick Settings tile.

Pixbu is live on both stores, in 9 languages (EN, TR, ES, PT, DE, FR, IT, JA, KO — with separate Brazilian and European Portuguese).

The design idea (please look at this part)

The creature is not a mascot. It is the readout.

Every visual property maps to something real:

What you see What it actually encodes
Stage — Egg → Baby → Teen → Adult → Elder → Mythic active days, never coins
Body size a measured ladder: the body fills 57 · 66 · 77 · 78 · 81% of the frame, Baby to Mythic
Reaction after a tap which action you just took
Colours and signature animations your choices, layered on the same creature — never a different one

Because the creature is the data, its animation is not decoration — it is the interface. That single idea is what the whole app is built around.

Screens worth pausing on

  1. Today — completing a task doesn't just tick a box. The pet plays a reaction, the XP bar fills, the streak ticks, and a speech bubble answers what you did. One tap, four coordinated responses.
  2. Buddy — six species (the starter species also comes in six colourways) and two signature animations per species; species, scenes and signature animations can be tried on your own pet before you own them.
  3. Breathe — a calm 4-2-4 breathing timer (1, 3 or 5 minutes) where the pet breathes with you.
  4. Today, on a hard day — "Tough day? Let's do just one thing." Take it and the screen collapses to a single task: "Just this today — that's enough."

Animation. The shipped build carries 137 animation groups per species, identical across all six — 822 groups and 5,242 frames in total, plus 4,140 recoloured frames for the colourways. Idle, breathe, sleep, curious, dance, peek, yawn, stretch, head-shake, startle and more. Every number here comes from one command in our repo (tools/animasyon_say.py), so it can be re-run and checked rather than taken on trust. They are hand-made pixel art, not tweened sprites — zero static loops.

Design decisions that are mechanics, not copy

  • No death, no decay, no punishment. Neglect never kills or sickens the pet. There is no guilt state to escape from.
  • Streak recovery is not for sale. The entire catalogue is three items — Buddy+ monthly, yearly, lifetime. There is no "restore your streak" product at any price. A missed day is bridged by one of two free monthly freezes, or simply forgiven.
  • No banner ads, no interstitials, no ad SDK at all. The shipped binary links no advertising library.
  • No real-money loot boxes. Buddy+ sells looks, never power — and species, scenes and signature animations can be tried on your own pet before you buy.
  • Local-first, no account. Your data stays on the device. There is no sign-up wall.

How we built it

Flutter (Android and iOS from one codebase), Drift/SQLite, Riverpod. Home-screen widget through a Kotlin bridge on Android and WidgetKit on iOS. RevenueCat for the subscriptions and the one-time unlock. Sentry for crash monitoring, PostHog for funnels. No backend — server cost is $0.

Pixel art is produced with PixelLab and finished through a repo-local pipeline that measures every sprite — head anchors, the stage size ladder, cosmetic overflow — so an art change cannot silently break layout.

Challenges we ran into

The hardest problem was making cosmetics fit a creature that changes shape five times. A hat anchored to the head of a Baby lands on the ear of an Elder.

Our first fix measured the sprite's bounding box — and found nothing, because the bounding box includes the ears, and the ears are the tallest thing on the creature. The measurement that worked was counting filled pixels per row: at ear height the count is small (8 px), at the skull it jumps (73 px). That distinction let us find the true top of the head on all 514 frames of the starter species and re-anchor every one.

Then we removed the feature it was for. When the second generation of species art landed, the head anchors had moved again and most items overflowed the canvas — 59 of 80 combinations on one species, and every one of 22 on another. So we stopped producing cosmetics and moved the Buddy+ look promise to two hand-made signature animations per species. Keeping a feature we could not keep correct would have been the easier choice.

The second one: we had the animations, and users were not seeing them.

Using his own build, our founder reported two things: "the penguin's sleep is just a penguin squashed from top and bottom" and "we made all those special animations and I never see a single one."

We reproduced both rather than taking them on faith. For the first, we re-ran our own procedural transform against the base sprite — and the installed frames came back. The "sleep pose" was the standing sprite stretched 26% wide and squashed 29% flat. The residue that separates the two classes: 977 px (penguin) and 1,621 px (dragon) against a lowest-of-4,285 px among genuinely hand-drawn species. Two species slept standing, with their eyes open.

For the second, our analytics had the answer: signature_move_played had fired once in the app's entire history. The cause was arithmetic, not art — a pool weight of 8 in 108 with a 7-second selector meant a ~90 s expected wait, while our median session is 59.5 s. We had built twelve animations that a typical session could not reach.

We regenerated the two squashed sleeps as real lying-down poses, flattened the mood pools so that eleven rarely-seen modes now surface, and raised the signature weight from 8 to 32. Four code defects surfaced on the way: signature moves were playing in reverse, the pose snapped back to the first pool entry on every tab return, the random seed was discarded on the loading frame so the pet was almost always idle, and an animation controller was being built lazily inside a widget that could already be dead.

The result is measured, not asserted: the chance of seeing a signature animation in a typical session went from 26% to 86%. All six species were then walked on a device at all five stages, in both the day and night pools.

We want to be honest about the method too, because it cut both ways. Our own detectors produced ten false alarms during this work — a contact sheet that rescaled five different canvas sizes into one tile and made three healthy stages look broken; a motion threshold that called sleep and breathe "weak", when being still is exactly what those animations are for; a yawn flagged as 12x too small because a silhouette cannot see a beak opening. Each would have cost real production. The rule we ended up writing down: a detector's output is not a finding until the detector has been run against a known-good sample.

Accomplishments we're proud of

Shipped on both stores inside the Shipaton window, with the widget, Quick Settings tile, focus mode, routines, goals and step counting all live — and a forgiving design we can defend line by line, because every promise above is a product mechanic you can check in the app, not a sentence in a store listing.

And we kept shipping through the window: eight production releases since the first public launch on 21 Aug, the latest being 1.0.9, live on both Google Play and the App Store since 25 Sep. Release 1.0.7 is the one we would point a judge at — it exists because the app was used, the complaint was reproduced, and the fix was measured: 1,320 new hand-made frames and a rebalance that took a signature animation from 26% to 86% likely in a typical session.

What we learned

That a claim you haven't measured is not a fact. Several things we "knew" about our own app turned out to be wrong the first time we actually measured them — and the app is better for every one of those corrections.

What's next

More signature animations, and a family plan.

Deliberately not on this list any more: rewarded video and seasonal cosmetic sets. Both were written on this page until we measured what they stood on — the shop and chest economy they assumed had never been built (zero matches in the codebase), and daily usage was single digits. We deleted the promise rather than keep it as decoration. Same rule as the rest of this page: a claim you haven't measured is not a fact.

Built With

Share this project:

Updates

Submission history