Arrow Out
A calm arrow puzzle with 800 solver-checked picture boards


Scale
800 solver-checked levels
Performance
Fully offline play
The Problem
An arrow puzzle needs hundreds of dense boards that look like pictures, stay fair, and draw smoothly on a cheap phone. One board with a circular dependency between arrows can never be cleared, and a level like that is impossible to spot by eye.
The Solution
Levels come from a generator that shares one pure Dart rule engine with the app. CI validates every shipped board, including a dependency graph check that proves it has no cycles and can be cleared. Resting arrows are recorded into a single picture and replayed each frame, so zooming and panning a dense board never rebuilds it. Game state commits before any animation runs, so closing the app mid-move loses nothing.
What it looks like.
What it does.
800 Levels Across 39 Shapes
Picture Reveal On Every Clear
Three Hearts Per Attempt
Hints And Star Ratings
Colour Themes
Fully Offline Play
How it's built.
Frontend
Flutter & Dart — pure engine, Riverpod state, canvas renderer
Backend
None — levels and progress stored on-device
Infrastructure
Google Play · Firebase Analytics & Crashlytics · AdMob
Tech Stack
What changed.
Built a level pipeline of generator, difficulty scoring and CI validation on the same rule engine the app runs, so a board that cannot be cleared never reaches a release.
Designed the rendering around replaying one recorded picture of the resting arrows, keeping dense boards sharp at any zoom without re-baking images during a gesture.




