all work
In App Review· 2026-08Personal project
In Two Lights
A shadow-projection puzzle game built in Flutter: 247 levels and an in-app purchase.
- Proof
- ✓ 107 tests
- Proof
- ✓ 247 levels, all checked solvable
- Proof
- ✓ macOS CI on Codemagic
My role
Game design, level generation, the app and the store submission.
The problem
Puzzle games live or die on level quality. With hundreds of generated levels, every one of them has to be provably solvable, and none can start already solved.
What I built
- A Flutter game rendered with CustomPainter. Shadow matches are scored as overlap (IoU) on a 64×64 occupancy grid, which handles concave shapes without a polygon-clipping library.
- Generated level sets with automated solvability checks.
- An in-app purchase through RevenueCat and CI builds on macOS via Codemagic. Submitted to the App Store; the Google Play release is in preparation.
Hard parts
Testing generated content
The test suite checks that every generated level is solvable and that none opens pre-solved, so a generator change can't quietly ship a broken level.
Stack
- Flutter
- Dart
- CustomPainter
- RevenueCat
- Codemagic
Skills shown: Flutter / Dart, Automated testing, CI/CD (Jenkins, Codemagic), App Store / Play shipping