01
Arguing with Apple instead of paying them
Apple rejected Poppycal twice. The second one cited Guideline 3.1.1 and
wanted In-App Purchase for subscriptions, which is 15 to 30 percent off
the top, forever.
The rejection notice itself suggested a fix: use the US link-out
allowance and point people at an external purchase page. I came close to
doing that.
Then I read 3.1.3(f), which exempts free standalone apps from IAP but only
if the app carries no purchase calls to action anywhere in it. The link
Apple was suggesting would have blown that exemption and still left me
failing 3.1.3(b), which is the rule that got me rejected in the first
place.
I went back and argued for the 3.1.3(f) exemption directly, without adding
in-app purchase or the link.
Apple approved it two days later. Poppycal takes subscriptions on the web
and keeps all of it, on an app that would otherwise be handing over 15 to
30 percent of every one for as long as it exists.
02
A bug that was actually an architecture problem
Kid Mode is a PIN-locked kiosk. It shipped with a hole in it: a kid could
drag the chore board around and reorder it. Small thing to look at, but it
breaks the whole promise of the feature.
The rule for "is this session locked" had been hand-written into three
separate iOS files rather than imported from the one shared definition,
and over time the copies drifted apart. iOS quietly lost a gate that the
web app still had.
I deleted the duplicate concept, which collapsed Kid Mode from two flows
into one, then wrote a CI check that fails the build if web and mobile
ever sprout another copy of the same logic.
That check has a hole of its own, though. Three of the four parity breaks
here were iOS missing something web had, and a missing thing
doesn't leave a duplicate behind for a duplication check to find. So "does
iOS really do everything web does here" is still a question I have to sit
down and work through by hand.
03
Two weeks of shipping nothing
In May the web app was live and working and I wanted iOS.
The fast thing to do is start building iOS. I spent about two weeks moving
the whole codebase into a monorepo with a shared logic package first, and
shipped nothing at all while I did it.
I scaffolded iOS on May 13, and it caught up to a big, mature web app in
a few weeks. The two share zero rendering code and one hundred percent of
the rules.
It still didn't save me from decision 02.
04
Saying no to the most requested feature
Family group chat is the loudest request in this whole category. It's on
competitor roadmaps, it's all over the review threads, parents ask for it
by name.
But when I read what people were actually complaining about, none of it
was a shortage of places to send messages. Every family's already got
three. The complaint was that the text explaining Saturday's soccer pickup
sits in a group chat while the pickup itself sits on the calendar, and by
Thursday nobody can find the text.
I shipped comments on events instead. It's one of the smallest features in
the app and a fraction of the work chat would have been. A chat tab would
only have given everyone a fourth place to lose things.