Inspiration

I wanted a puzzle you could finish in the time it takes a kettle to boil, that still made you feel clever. Star Battle (one star per row, column and region; no touching) is one of the most elegant logic puzzles around, but every version I tried was gray grids and tiny stars. I swapped the stars for a Shiba Inu that barks when you place it, painted the regions in candy colors, and gave it a cozy marimba soundtrack. The name says the whole rulebook: find every Shiba.

What it does

FindShiba! is a relaxing deduction game for iPhone and iPad. Place one Shiba in every row, column and colored region, and never let two touch, not even diagonally. Tap to mark a safe cell with ×, double-tap to place a Shiba, and use hearts, undo and hints when you get stuck.

• A Journey campaign that starts on 5×5 and climbs to 9×9, where every level is strictly harder than the last and never requires guessing. • A Home Screen widget with a Daily puzzle and endless Practice boards, playable entirely from the Home Screen in 5×5 through 9×9. • Game Center achievements (30 badges) and a Total Score leaderboard. • Six Shiba coats, six lo-fi BGM tracks, a shareable player profile card. • FindShiba! Pro via RevenueCat: monthly, annual with a 7-day trial, or lifetime. Pro unlocks extra coats, 100 hints a month, unlimited random puzzles, extra music and auto-mark ×. • Fully offline, localized in 11 languages, no tracking.

How I built it

Native SwiftUI on iOS 17 with a WidgetKit extension driven by App Intents, so every tap on the widget is a real interactive move rather than a deep link. Game Center handles achievements and the leaderboard, queuing reports when offline.

The puzzle engine is the heart of the app. Each board runs through a validator that checks region connectivity, confirms exactly one solution, and then solves it using only human techniques (naked singles, region confinement, one-step look-ahead). If the solver needs to guess, the board is rejected. Campaign boards are generated and scored offline, then baked into the binary so the ladder is deterministic. Daily widget puzzles are generated on device from a per-day seed; random Pro puzzles are campaign boards re-symmetrized and recolored so they always feel fresh but keep their difficulty rating.

Monetization is RevenueCat's purchases-ios SDK with a single pro entitlement, a custom SwiftUI paywall, and StableID for a stable app user ID that also doubles as a support ID users can copy from Settings.

Art and audio were pipelined too: bark animation frames were harvested from short generated clips and chroma-keyed, badge art was batch-generated from a prompt sheet, and App Store screenshots, localized metadata and the launch video are all rendered by Python scripts from the same assets, so a design tweak regenerates everything.

Challenges I ran into

• Difficulty that actually climbs. My first generator produced boards that were technically valid but wildly uneven, with level 12 harder than level 40. I ended up writing a technique-based solver and scoring every board by the hardest deduction it needs, then baking a strictly increasing ladder instead of trusting randomness. • A widget that is a real game. Interactive widgets have tight budgets: no long-running state, timeline reloads on every intent, and a shared store between app and extension. Getting hearts, undo and daily/practice switching to survive that model took several rewrites. • Swift 6 strict concurrency across the game session, Game Center, RevenueCat callbacks and the widget store. • App Review. I got flagged on trial eligibility messaging in the paywall and had to make the intro offer text conditional on what RevenueCat reports for the user, plus tighten privacy manifests for both targets. • Not letting Pro feel like a paywall on fun. Everything needed to finish the campaign is free; Pro is more Shibas, more music and convenience.

Accomplishments that I'm proud of

• Shipping a complete, localized, App Store-ready game solo in about five weeks of evenings and weekends. • Every campaign level is provably solvable by logic alone, with no guessing, and the difficulty curve is monotonic. • The widget is a full game, not a shortcut. People can play a whole 9×9 without opening the app. • A cohesive look: one palette, one mascot, one font, carried from the app icon to the paywall to the launch video. • A paywall that passed review with a trial, an annual plan and a lifetime option, all driven by a single entitlement check.

What I learned

• Constraint-satisfaction puzzles live or die by their solver. Building the human-technique solver first made generation, hints and difficulty rating all fall out of the same code. • Interactive widgets are worth the pain. Session length is short, but daily retention from the Home Screen is very different from an app icon. • Bake, don't generate, anything that has to feel curated. • RevenueCat's entitlement model let me design Pro as a set of small perks instead of a hard gate, and swap pricing without shipping a build. • Automating store assets early pays off every single time copy changes.

What's next for FindShiba!

• Daily puzzle streaks and a weekly leaderboard to reward coming back. • A Campaign 2 with new region shapes and larger boards on iPad. • RevenueCat Paywalls and Customer Center so I can A/B test offers and handle subscription support without shipping updates. • Apple Watch complication for the daily puzzle status, and Live Activities for streaks. • More coats and more music, chosen with the community.

Built With

  • swiftui
Share this project:

Updates

Submission history