- MVP
Working features first
2026.09.30 – 10.01 · v1 – v42
What I tried
An Expo project with phone verification, profiles and one-to-one matching came first. In two days the users tab, anonymous feed, stories with a story editor, notes, voice recording, blocking, notifications, account deletion, settings and terms followed. The design was redone four times before the current dark look and typeface were settled.
What went wrong
- Sign-in started as anonymous login and identity checks started with a carrier verification service (PASS). Both were dropped for phone number SMS verification.
- Admin tools were built into the app at first, then moved out to a separate admin website.
- Free notes started at 30 a day and came down to 3.
What still fell short
Everything worked, but nothing needed to actually ship and run an app was there yet: payments, ads, moderation, Android.
So the next rounds aimed at an app that could ship.
- v50+
An app that can ship
2026.10.02 – 10.03 · v50 – v99

The feed card, settled after four redesigns 
Chat with reactions, replies and typing indicators What I tried
Android support, security and abuse checks, one account per device, RevenueCat payments, message reactions, replies and typing indicators, and stories that turn like a 3D cube. Admin moved to its own website with roles, an audit log and time-limited, per-feature sanctions. AdMob ads went in.
What went wrong
- The feed card design was thrown out four times: a list (v88) → the mockup card (v89) → small cards (v90) → wider, less rounded cards (v92).
- A delivered update overwrote a payment setting I had filled in by hand with an empty value, and purchases stopped. → Restored in v75, with a new rule: never overwrite a file that holds values the user entered.
- There was no way to see why ads did not show or products did not load. → Diagnostic logs for both, plus an operator-only payment check button.
- Product IDs were renamed to match what was registered in App Store Connect (v79).
What still fell short
Whether it met the store's review rules could only be learned by submitting.
So on October 3, version 1.0.0 went in for review.
- Build 6
First review, first rejection
2026.10.03 – 10.04

The original Instant Chat screen: "profiles are not shown", and you were connected straight away. This is exactly what review flagged. (Store screenshot, sample data.) What I tried
Build 5 was the first submission. Apple asked the new developer account for more information, so build 6 went back with a screen recording on a real phone and English answers to six questions.
What went wrong
- Rejected on October 4, for three reasons.
- Guideline 2.1(b): the in-app products were not submitted together with the app.
- Guideline 1.2: a chat that connects strangers must show who the other person is before the chat, let you accept, decline or skip, handle reports within 24 hours, and keep phrases like "random chat" out of the store listing.
- Guideline 2.5.4: a background audio permission was on but never used.
What still fell short
Instant Chat, the heart of the app, connected you to a stranger straight away with nothing to go on.
So instead of hiding Instant Chat (plan A), I chose plan B: keep it and redesign it.
- Build 7
Instant Chat, redesigned
2026.10.04 – 10.20
Live example: the redesigned Instant Chat. Both profile cards for 20 seconds, both accept, then a three-minute chat. What I tried
A match now shows both profile cards (nickname, gender, age, region, bio, photos) for 20 seconds, and the room opens only if both accept. Chats went from one minute to three. When someone tries to move the chat to a phone number or another app, the server spots it, warns only the sender and files a report automatically. The terms now promise reports are handled within 24 hours, and every "random" phrase left the store listing. The nine products went into the same submission as the app, with a demo video and an English reply.
What went wrong
- Contact detection first warned before sending; that was dropped for a note under the message after sending, and it learned initials-only spellings and workarounds.
- The two people's timers disagreed. "Start when both are ready" was replaced by syncing to the server clock.
- On resubmitting I accidentally sent only the app, so I pulled it from review and resubmitted the app and all nine products in one draft.
- Meanwhile: Galaxy fixes (vibration, keyboard, back gesture), five rounds of screen performance work, and lower server costs (no always-on auth server, temporary records that delete themselves).
- The Google Play account was approved on October 6. Internal testing found a missing back gesture on the received-notes screen, which was fixed, and the closed test passed review on October 8.
- The single chat had reached 1,041 turns, so on October 7 the work moved to Claude Code. The whole conversation was re-read section by section into a handoff document of what was decided and why, and all 197 changes delivered in chat were checked against the code one by one.
What still fell short
October 20, the second rejection. The app uses App Tracking Transparency, but the reviewer never saw its prompt. It was asked 2.5 seconds after login, the notification prompt came up first, and iOS skipped the tracking prompt.
So build 9 asks the moment the app opens, before login.
- Build 9
Ask before login
2026.10.21 – nowNow
Live example: the build 9 order. When the app opens, tracking permission is asked first, over the login screen; notifications come after. What I tried
When the app opens, before the login screen, it waits until it is active, then one more second, and asks for tracking permission. If no prompt appeared, it asks once more; the notification prompt and ads come after. The same build fixed other review risks ahead of time: if you deny location you can pick your region by hand, photos are chosen through the system picker without access to the whole library, and screenshot blocking starts only after login so the review recording could be made.
What went wrong
- An 8-second recording on a real phone (fresh install → tracking prompt over the login screen → deny → login screen) went into the reply to review.
- While a submission sits rejected, the in-app products section disappears and resubmitting is blocked, so the rejected submission was cancelled and the app and products went into a new draft, resubmitted on October 21.
- On Android, the request for Google Play production access was received on October 23.
Accidents along the way, and what they taught
- Several commands ran together as one line and deleted the server code folder. Git brought it back; since then, delete commands run alone, one per line.
- Appending a line to a settings file glued two lines together and the admin site could no longer reach the server. Since then, settings files are edited by hand.
- A missed server deploy made the review account's login fail. Since then, every change says whether it needs a server deploy.
- Installing from TestFlight replaced the development app, which made it look as if fixes were not reaching the iPhone.
- With sales limited to South Korea, a US account saw no products at all.
- "The code is in" and "the values are right" are different checks. Even after all 197 changes were confirmed, the ad unit values turned out to be wrong, so earlier builds may never have shown real ads.