Inspiration

Every step counter I have ever installed told me the same thing: a number, and then how far that number was from a goal I had already missed. On the day you walked 2,000 steps, the app is at its loudest — a red ring, a broken streak, a "you did not reach your goal" summary. That is the day people delete the app.

I wanted the opposite reaction on a bad day: something you actually want to open, because what is waiting for you is cute.

So Potemaru turns your step count into a body shape. Walk, and your pet stays trim and sparkles. Skip a few days, and it slowly gets rounder. The round form is not a punishment — it is deliberately drawn to be the most adorable state in the game. The final shape of the ladder is a pet that has melted into a cushion. Nobody is scolded, and no word for "failure", "slacking off" or "bad" appears anywhere in the app.

What it does

One screen. Your pet in the middle, a step ring around it, one line of dialogue, and your coin balance.

  • Pick one of three creatures at the start — a mochi, a bird, or a cat — and it hatches from an egg.
  • Three time scales are visible at once: today's ring (immediate), the body shape (rolling 7-day average of goal attainment), and total steps (evolution).
  • Growth is bought only with steps. Hatch, patterning, child, adult, and two "hall of fame" milestones that each grant a new egg. Milestones require both a step total and a minimum number of days, so you cannot sprint through the game in a weekend.
  • Coins are earned by walking (1,000 steps = 5 coins, +20 on a day you hit your goal) and spent on cosmetics — ribbon, hat, glasses, headphones, crown, and six special outfits added in September — or on the egg of a species you don't have yet.
  • No competition, no leaderboards, no streak counter, no ads, no account, no GPS.

Steps are read from Apple HealthKit and everything — steps, save data, growth, coins — stays on the device. There is no sign-up. Apart from purchases (Apple and RevenueCat), the only things sent off the device are an optional one-question survey answer and anonymous usage events such as which screen was opened, never step counts.

How I built it

  • Next.js 15 + React 19, wrapped as a native iOS app with Capacitor 7. The whole bundle ships inside the app; nothing is loaded from a remote server.
  • HealthKit step reading through @capgo/capacitor-health, queried when the app opens. Nothing runs in the background.
  • RevenueCat (@revenuecat/purchases-capacitor) handles all five products: three consumable coin packs and a monthly/yearly Pro subscription sharing one subscription group. The pro entitlement gates the weekly report; coins are deliberately not an entitlement, because a coin balance is a quantity, not a right.
  • Codemagic builds and uploads to App Store Connect, so the entire iOS pipeline runs without owning a Mac. HealthKit plist keys and entitlements are injected at build time because the ios/ folder is regenerated on every build.
  • The pixel art is not image files. Every frame is drawn by code from a small set of parameters — species colours, growth stage, a single "roundness" number, and which cosmetic is worn. There are 3 species × 4 growth stages × 5 body shapes × 2 idle frames ≈ 120 frames; drawing them by hand would have made them inconsistent and made every balance tweak a full redraw.

Challenges I ran into

The reward was pointing the wrong way. My first body ladder ran from "skinny" to "round", so the person who walked the most got the least cute pet. That is backwards as a reward. I cut the thin end off entirely: the ladder now runs from the standard, cutest drawing to round, and the reward for walking is sparkle, not a change of silhouette.

A body with no neck rejects most accessories. A scarf reads as a belt, and wings read as quotation marks. After drawing and discarding both, every cosmetic is now something worn on the head.

Coin rate and prices are one design, not two. The first rate emptied the cosmetics shop by day 63. Rate and prices had to be solved against each other and are now pinned by unit tests, so a future tweak to one cannot silently break the other.

Three bugs only ever appeared on a real device and never in a browser: iOS painting a black rounded rectangle over the pet on tap, the step ring sliding under the Dynamic Island because viewport-fit=cover was missing, and the layout drifting to the top of the screen.

Accomplishments that I'm proud of

The pet is genuinely cuter when you have been doing badly, and that turned out to be a real design constraint rather than a joke — it decided the art, the copy, and even the vocabulary list for the dialogue lines.

The step count matched the iOS Health app on the first device build, but only because I tested with an iPhone alone. A user who walks with both an iPhone and an Apple Watch then reported inflated counts; my first fix passed its tests and changed nothing on their phone, because the tests fed it a data shape I had invented. The fix that worked reads HealthKit's own aggregated daily statistics instead of adding up raw samples, and the same user confirmed it on 9/3.

What I learned

Tone is a feature you can spend engineering time on. Deciding which words the app is never allowed to say ("slacking", "failure", "bad") did more for the design than any feature I could have added.

What's next for Potemaru

  • Done since this was written: a share button that turns today's pet into one image, an egg shop for the species you don't have yet, and six special outfits.
  • Next: limited-edition eggs and seasonal outfits, Android via the same Capacitor codebase, and a home screen widget.

Built With

Share this project:

Updates

Submission history