Skip to content
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