← qminlab

FILE QL-001 / APP / TRIAL AND ERROR

Weming: trial and error

Weming is a friend-finding app for talking to new people without the pressure: an anonymous feed, stories, notes, and Instant Chat, three minutes with someone you have just met.

I started on September 30, 2026. Until October 8 it was a single conversation with Claude, 1,041 turns long, with changes numbered up to v152. The App Store rejected it twice. Here is that story in big steps.

1,041
turns in one chat (9.30 – 10.8)
v152
last change number in that chat
2
App Store rejections
9th
build, now in review

Record as of

  1. 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.

  2. v50+

    An app that can ship

    2026.10.02 – 10.03 · v50 – v99

    Weming feed screen
    The feed card, settled after four redesigns
    Weming chat screen
    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.

  3. Build 6

    First review, first rejection

    2026.10.03 – 10.04

    Instant Chat start screen saying profiles are not shown
    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.

  4. 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.

  5. 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.

More trial and error