01Releasing on the right frame
Seeing the meter is the easy part. The shot has to fire on the correct frame despite capture latency, touch latency and frame jitter. The scheduler maps the phone encoder's timestamps onto the PC's clock, predicts where the cursor will be, and fires early by the measured latency so the cursor coasts onto the green.
02Moving the hot loop off the phone
It started as an on-phone Android app in Kotlin. Capture, analysis and timing on the device thermally throttled it and corrupted its own timing, so the loop moved to the PC. The phone now only encodes its screen and receives touches.
03Testable by design
The original app's core logic sits behind functional interfaces, so it runs as plain JVM unit tests with no emulator. The Python shooter ships device-free self-checks that exercise the timing logic with no phone attached.