Coaster
Logic
All entries
October 31, 20263 min read

October: Chalky Shipped, Then Learned to Look

#MobileApp#LearningInPublic

The short version

Chalky 1.0 got onto the App Store after a rejection for a widget I never built. Then I taught it to notice when a dartboard photo is not a dartboard.

October was a Chalky month. The darts app made it onto the App Store, and then I spent the back half of the month on a small feature that taught me more than the launch did.

text
WHAT I SUBMITTED                 WHAT APPLE'S SCANNER SAW

  Chalky.app                       Chalky.app
  +-- Keep Score                   +-- Keep Score
  +-- Find Boards                  +-- Find Boards
  +-- no widgets anywhere          +-- WidgetKit (linked)
                                           |
                                           v
                                  "remove widget features
                                   or explain where they are"

Rejected for a widget I never built

Build 9 was rejected because Apple's scanner found the widget framework linked inside the app. Chalky has no widget. It never did.

The framework came in through a side door. Chalky is built with Expo and React Native, and the part that moves you between screens pulls in a helper package. That helper's iPhone code mentions the widget framework in three files. My app never uses the helper on iPhone, but the build compiled everything in the folder anyway, and the link ended up in the finished app. The fix was one setting that tells the iPhone build to leave that helper out.

The second trap was in Apple's website. On a rejected version, saving the review notes locks which build is attached. I saved my notes first, so I had to cancel the whole submission, attach build 10, then write the notes again.

On a rejected version, swap the build before you touch the review notes.

Build 10 passed and 1.0 went live.

Teaching it to look

When someone updates a bar in Chalky, they can add a photo of the board. I wanted the app to notice when the photo is not a dartboard.

iPhones come with a free, built-in image check that works with no signal, which matters for an app that lives in bars. It even has a dartboard label. Close-ups scored well. Wide shots did not. A board filling about a tenth of the frame often scored close to zero, even when a person could spot it right away.

The fix was to stop asking about the whole photo. If the full photo scores low, Chalky cuts it into nine overlapping squares and checks each one. A small board in a wide shot is a big board in one of those squares. The check did not get any smarter. I stopped making it squint.

I tested it on 122 photos. 56 of the 65 real boards were caught, and none of the 57 look-alikes got through: archery targets, clocks, roulette wheels and mirrors. For the nine it missed, Chalky asks Claude for a second opinion. I have not yet counted whether Claude catches those nine, so the honest score is still 56 of 65.

It is soft on purpose. If Chalky does not see a board, it offers Remove photo or Use it anyway. A wrong guess costs one tap.

The rest of October

The 1.0.2 builds went from 13 to 19 in two days, with iPhone Duo layouts, a one-phone tournament bracket and bots at four skill levels.

Crawler Manager kept moving in the background. On 8 October I played the whole thing end to end, and at the end of the month I threw out its look and rebuilt it as a TV network's broadcast, then started putting the enemy animations I picked into the game.

Chalky now lists nearly 400 dart bars. I had been rounding that up to 1,000 in my notes, and the real number is the one worth printing.