Game Center achievements are usually a click marathon in App Store Connect. I treated them like code instead, mostly because I knew I’d forget which checkbox I’d missed the second time around.
One list, three scripts
Achievement IDs, names, descriptions, and point values live in scripts next to the game. That same list drives icon generation, metadata sync, and image upload.
A Python script paints 1024×1024 patches in the neon HUD palette — HH, FE, I, II, III, and the rest. A Node script signs App Store Connect JWT requests and creates or updates the achievements (npm run asc:achievements). Another attaches the PNGs (npm run asc:achievement-images). Dry-run is the default. --apply makes it real.
On the phone
expo-game-center handles auth and unlocks. Triggers fire from actual moments: first rescue, full lander, S grades, crashes, hangar upgrades, act clears. The patches you earn in-game are the same circles on this site’s mission log.
Expo’s library kept the client side small enough that achievements shipped in the same week as adaptive quality. Not a follow-up quarter. Scripts remember. Portals don’t.
