RORK LABJP
IOS27 — iOS 27 and iPadOS 27 land on September 14. For apps assembled with no-code or AI tooling, the week a new OS ships is when the ground moves mostDUO — Apple's first foldable, the iPhone Duo, starts at $1,999. A new screen shape is also the first place a generated layout tends to breakSPLIT — Standard Rork produces React Native through Expo. Rork Max generates native Swift. Neither will adapt to a folding screen at the same pace, or fail in the same waySUBMIT — Automated submission absorbs every change Apple makes to the process. An article praising the convenience owes its readers that caveatRATING — Answering the age rating questionnaire became mandatory in September. Apps built without code are no exceptionSILICON — The A20 Pro in the iPhone 18 Pro is reported to be the first high-volume smartphone processor built on TSMC's 2nm nodeIOS27 — iOS 27 and iPadOS 27 land on September 14. For apps assembled with no-code or AI tooling, the week a new OS ships is when the ground moves mostDUO — Apple's first foldable, the iPhone Duo, starts at $1,999. A new screen shape is also the first place a generated layout tends to breakSPLIT — Standard Rork produces React Native through Expo. Rork Max generates native Swift. Neither will adapt to a folding screen at the same pace, or fail in the same waySUBMIT — Automated submission absorbs every change Apple makes to the process. An article praising the convenience owes its readers that caveatRATING — Answering the age rating questionnaire became mandatory in September. Apps built without code are no exceptionSILICON — The A20 Pro in the iPhone 18 Pro is reported to be the first high-volume smartphone processor built on TSMC's 2nm node
Articles/Dev Tools
Dev Tools/2026-06-12Intermediate

Building a Developer Debug Menu Into Your Rork App — Verify Ads, Purchases, and Remote Config Before Release

A production-safe developer debug menu for Rork apps — switch environments, force test ads, simulate entitlements, and override Remote Config, with working TypeScript code and the pitfalls I hit running six apps.

Rork559React Native237Expo205Debug MenuAdMob71Remote Config10

Premium Article

In May 2026, while one of my wallpaper apps was partway through a staged rollout of v2.1.0 on Android, a review came in that said, roughly: I watched the rewarded ad to remove ads, and the paywall still showed up. On my debug build I could not reproduce it no matter what I tried. The root cause turned out to be a gap in how two entitlement flags were combined — more on that below — but the painful part was something else. At that moment, that app had no way to reproduce production conditions on my desk: the real Remote Config values, the real ad inventory, the real purchase state.

Bugs that only surface in release builds cluster around three things: ads, purchases, and remote configuration. Which means that if you build one screen that can safely flip those three from a device, most of this class of verification moves to before release, where it belongs. What follows is the design I have settled on as an indie developer running six wallpaper apps in parallel — a developer menu that is genuinely absent from store builds, not merely hidden.

Why Hiding Switches in the Settings Screen Falls Apart

The first thing most of us build — I did it for years — is a handful of __DEV__-guarded rows at the bottom of the settings screen. It falls apart for three reasons.

  • It scatters. The test-ad toggle lives in the ad module, the endpoint switch lives in the API client, and conditional branches creep across the whole codebase. Six months later you will not remember where anything is.
  • You forget to turn things off. A structure that makes you ask, the night before submission, did I flip that flag back? is itself the hazard. I once came one checklist item away from shipping a staging URL in a production build. The checklist caught it; the architecture had not.
  • Repro steps become folklore. Turn that on, open that screen three times, then it happens. Even when you work alone, your future self is a stranger who deserves better documentation.

So invert the approach. Concentrate every debug operation into one screen, and make both the entrance and the implementation disappear by build type. Instead of chasing scattered if statements, you design exactly one override layer.

The Shape of the Menu — Four Sections and Two Hard Rules

Across my six apps the menu has converged on four sections.

  • Environment: switching the API and content endpoints (dev / staging / production) and showing the current build variant
  • Ads: a test-ad mode toggle, the last five ad load results, and which mediation network filled each request
  • Purchases: forcing entitlements (ad-free, premium) and launching the sandbox purchase flow
  • Remote Config: overriding arbitrary keys and force-triggering modal campaigns

And two rules I have never relaxed, on any app.

  1. Store builds must not contain the code at all — not just the entrance. A menu that is merely invisible is half a solution, both for review risk and for accident prevention.
  2. While any override is active, a badge stays on screen. I once spent an embarrassing stretch of time reacting to numbers that were coming from a test state. The badge ended that era.

The reason I push the second rule so hard: the worst enemy of a debug menu is forgetting what you overrode. The more convenient overrides become, the more you forget them. Visibility of state is not decoration; it is part of the feature.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
If you have been burning evenings on bugs that only appear in release builds, you can ship a developer menu that reproduces ad, purchase, and config states on demand
You will learn a four-section design (environment, ads, entitlements, Remote Config) backed by working TypeScript code you can drop into a Rork project today
You will be able to strip every debug pathway out of store builds, with an operational checklist that keeps review risk and stale-override accidents near zero
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

Dev Tools2026-09-04
EAS secret visibility does not keep a value out of your app — deciding prefix and visibility separately
The EXPO_PUBLIC_ prefix decides what ships inside your app; EAS visibility decides who can read it. Why stacking them blanks a value on OTA updates, and how to check your build.
Dev Tools2026-08-22
Every bulk replace exited zero. The damage was in the lines I did not delete
Run a bulk replace over generated code and the breakage lands on the neighbouring lines, not the matched ones. Here is what broke in a live project, and a dependency-free guard that checks the invariants a replace must preserve.
Dev Tools2026-08-16
Find the Code That Trips App Store 2.5.2 Before You Submit
If a remote value can change what your app does, Guideline 2.5.2 may apply. Here is where the line actually sits, plus a script that surfaces the risky paths in your repo before submission.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links