The Code Took Days. The Forms Took Weeks.
Notes from shipping ten iOS apps at once, in which the programming turns out to be the easy part.
It is 11:40 on a Tuesday night and I am deep in App Store Connect, filling out privacy questionnaire number six of ten. This one is for CoopLog, an app for people who keep backyard chickens. Apple wants to know whether CoopLog collects Health & Fitness data. It does not. It collects egg counts. There is no checkbox for egg counts. So I mark "Data Not Collected" for the fourteenth category in a row, and the form asks me to confirm, and I confirm, and a small voice in my head observes that I will perform this exact ritual four more times tonight, for four more apps, and that the voice itself is the only part of this process without a form.
Nothing was going wrong, to be clear. This is the system working exactly as designed. The design just never pictured me.
Let me back up.
The rest is the good part.
The production line, the questionnaires, and the night Apple asked for my home address. Drop your email and read on. I send new build logs when they ship, and nothing else. No spam, unsubscribe anytime.
no thanks, just let me read →ten small apps, on purpose
This spring I built ten iOS apps with Claude as my pair programmer. Not one big app with ten features. Ten separate apps, each one solving a single narrow problem for a single specific kind of person:
- FlipLedger, for resellers who currently track profit, cost of goods, and mileage across three spreadsheets and a glovebox.
- CraftPrice, for handmade sellers who price their work at materials plus guilt.
- WashQuote, for pressure washing quotes that don't get scribbled on the back of an old invoice.
- ReefCadence, for reef tank dosing schedules, because coral does not forgive.
- TipSplit, for splitting the tip pool at 2 a.m. without a fight.
- CrumbKeeper, for sourdough starter feedings and baker's percentages.
- CoopLog, the chicken one: eggs in, feed out, and the slow dawning that each egg costs about four dollars.
- BoardFoot, for lumber math at the hardwood dealer.
- DiscCaddie, for disc golf scorecards and the stats nobody asked for.
- PourCalc, for concrete and hardscape estimates: slabs, footings, how many 80-pound bags before your Saturday is gone.
Each one is small on purpose. That's the entire thesis. One person, one problem, one app that does the math and gets out of the way. No accounts, no feeds. A person with a reef tank does not want a lifestyle brand; they want to know how many milliliters of alkalinity solution on Tuesday.
Writing the code was the fast part, and I want to be honest about that, because it's the reason this story exists at all. Building with Claude goes like this now: I describe the person and the problem, we argue about the data model, and SwiftUI screens show up about as fast as I can test them. Each app took a handful of evenings, nights and weekends around the day job. What used to be months per app became days. A small, focused utility is a solved problem in 2026.
Then I turned around holding ten finished binaries and faced the App Store, and the App Store looked back at me like a DMV.
the production line
Before anything ships, Apple collects $99 a year for the Developer Program. Fine. It turns out to be the cheapest line in the whole ledger, and the only one denominated in dollars instead of evenings.
Then every app needs a bundle ID (com.jcreates.flipledger and nine siblings). Then an app record in App Store Connect. Then a name (30 characters), a subtitle (also 30), a keyword field (100 characters, comma-separated, and it rewards you for deleting the spaces after your commas), a description, a support URL, a category, plus a secondary category you'll agonize over and nobody will ever see. None of it is hard. All of it is work. One app's worth is an afternoon with coffee. Ten is a production line, and nobody sells you the production line. You invent it yourself, at night, out of spreadsheets and spite.
I ended up with a metadata folder in every repo: description.txt, keywords.txt, subtitle.txt. The store listing became a build artifact, versioned like code, because at ten apps, "I'll just type it into the web form" is how you ship the CraftPrice description on the CoopLog page.
Then screenshots. Apple wants them at exact pixel sizes for specific iPhone display classes; the headline size right now is the 6.9-inch class, 1320 by 2868, portrait, and if an image is off by a pixel the uploader rejects it with the enthusiasm of a nightclub bouncer. Ten apps, three or four money screens each, call it fifty images that all have to look like a human arranged them. So I wrote a script: it boots the right simulator, pins the status bar clock to 9:41 like Apple's own marketing shots (once you notice the 9:41 you cannot stop noticing it), walks each app through its own little demo, and drops correctly sized PNGs into folders by device class. Building automation to satisfy the paperwork for apps I built with automation. Somewhere in there is a lesson, or at least a snake eating its tail. The script ate a full Saturday, paid for itself around app number four, and by app number ten I was genuinely fond of it.
questionnaires, times ten
The parts I couldn't automate, Apple made sure I felt.
Every app gets a privacy "nutrition label," which is the ritual you caught me performing at the top of the page. My apps collect nothing. Everything stays on the device and phones home to nobody. But there is no single "we collect nothing" button. You walk through every category (contact info? health and fitness? financial info? browsing history?) and answer no, one at a time, like filling out a customs form for cargo you don't have.
Every build upload asks the export compliance question: does your app use encryption? Everything that makes an HTTPS request technically does, so the answer is yes, the boring exempt kind. Same dialog every upload, and it never once remembers you. Until you learn you can set ITSAppUsesNonExemptEncryption to false in the Info.plist and the question stops appearing. Write that one down. It's worth ten small sighs per release cycle.
Age ratings: another questionnaire, per app. I have now formally attested to Apple that CrumbKeeper, an app about feeding a jar of flour and water, contains no frequent or intense horror themes. The starter does smell horrifying around day four. There was no field for that. BoardFoot, I certified, does not simulate gambling; the most mature content in BoardFoot is a waste percentage.
None of this is scandalous on its own. Each form takes ten minutes and exists for a reason I mostly respect. The problem is arithmetic. Ten minutes times four questionnaires times ten apps is a part-time job with no code in it. The code took days. The forms took weeks. I keep saying that sentence to people and watching them decide whether I'm joking.
the part where Apple asks for my home address
Here's the one I didn't see coming.
Under the EU's Digital Services Act, anyone selling digital goods in the European Union is a "trader," and traders have to be reachable. In practice: distribute paid apps, or apps with in-app purchases, in the EU, and your physical address and contact information get displayed publicly on your App Store product pages there. Not filed with a regulator somewhere. Displayed. On the page. Next to the screenshots.
I don't have an office. I don't have a PO box set up for this, or any qualifying address that isn't also where I sleep. So the choice, as it actually appeared in front of me in a form, was this: publish my home address to every App Store storefront in the EU, or don't sell there.
That's the whole menu. Two items.
I sat with it for a couple of days. I read forum threads from other one-person developers doing the same math. Some published their home address and reported nothing bad happening. Some rented virtual offices that cost more per month than their EU revenue. One had a PO box rejected because it wasn't a "geographic address." And the official fix, once you go looking, from Apple's guidance on down through every thread, amounts to: get a business address. An office, for the crime of selling a $2.99 tip splitter to a bartender in Portugal. Reader, my couch does not have a suite number.
I understand why the rule exists. It's aimed at scam storefronts hiding from the consumers they burn, and that's a problem worth solving. It just lands on a guy shipping $3 utilities from a laptop with the same weight it lands on a company with a legal department.
Here's where I landed: my home address is not for sale at any price the EU App Store is going to pay me. The free apps declare non-trader status and travel everywhere (no trade, no trader). The paid ones skip the EU until I sort out an address with a front door that isn't mine. In App Store Connect, the decision looks like nothing at all: an availability screen, 27 checkboxes, uncheck, save. I want it on the record that in 2026, the hardest engineering problem in shipping ten apps was an address field.
Every other obstacle in this process cost time. This one asked for something I wasn't willing to spend. So if you're in Lisbon and you wanted to pay for FlipLedger: I'm sorry. It isn't you. It's my mailbox.
guideline 4.3, and other ambient dread
Somewhere in Apple's review guidelines is section 4.3, titled "Spam." The short version: don't ship many similar apps. It exists for good reasons; the store was once one flashlight app wearing five hundred different icons.
Now look at me from the reviewer's chair. One account. Ten apps, submitted within weeks of each other, all small utilities with a number pad in them, all clearly built fast. Every one of them really is different. Nobody confuses a sourdough starter log with a concrete estimator, and the reef tank people and the disc golf people do not overlap, I checked. But at 1 a.m., 4.3 stops reading like a rule about apps and starts reading like a rule about me. And the account is the single point of failure. A rejected app is fine; you fix it and resubmit. The fear is a flag on the whole account: ten apps, plus anything I ever ship again, riding on a stranger with a long queue agreeing that CoopLog and BoardFoot are different ideas.
So I staggered the submissions, and each app's Review Notes now carry a paragraph explaining who it's for and why it exists on its own. I made sure no two could be mistaken for reskins. It's probably unnecessary. Reviewers are people and the apps are honest. But shipping alone means nobody's around to tell you you're being paranoid, so you get to be exactly as paranoid as you want. I want.
Meanwhile, everything stages through TestFlight. You upload a build and it enters a state called Processing, which is less a status than a location, somewhere between your laptop and Cupertino, where builds go to think about what they've done. Ten minutes, sometimes an hour, occasionally long enough that you refresh the page like it owes you money. Multiply by ten apps, then again by every fix. Nothing has been flagged. Everything that's cleared so far has cleared clean, and the fear was probably always just fear. I'm writing it down anyway, because nobody warned me that the scariest part of shipping ten honest apps would be feeling like a smuggler with nothing to declare.
what I'd tell you
If you're about to try something like this, and the math of 2026 says more of you will, here's what I have.
Budget for the paperwork like it's a feature, because it costs more than the code now. That's the headline of the whole year: AI collapsed the build cost, and the bottleneck did what bottlenecks do. It didn't disappear. It moved. It is currently sitting in a web form asking whether your chicken app collects health data.
Work in batches, not in apps. All ten bundle IDs in one sitting, all ten privacy labels in another. Context-switching between "write Swift" and "answer questionnaires" is how an afternoon becomes a week. Keep the store metadata in the repo. Automate the screenshots as soon as you have two apps to screenshot. Set the encryption key in the Info.plist on day one and never see that dialog again. Build the checklist before app three. I built mine after app seven. And decide your EU answer before you touch the forms, because the trader screen will ambush you mid-submission, and it is not a decision to make at midnight.
And the $99? The $99 is the cheapest thing Apple will ever charge you. The real currency is evenings, and there's no receipt.
Where things stand: all ten are code-complete and tested, moving through TestFlight and review in waves. Rolling out gradually. Partly strategy, mostly stamina. I'll keep writing up what ships and what breaks, right here.
— Josh