RORK LABJP
APPLE-AI — Apple opens Foundation Models free to developers under 2M first-time downloads, slashing the cost of adding AI to indie appsSWIFT-API — Foundation Models server-side integration lets you call Claude and Gemini through the same Swift API, now with image inputKOTLIN-MIGRATION — Android Studio's migration agent converts React Native apps into native Kotlin automatically — a future path for Rork-built appsRORK-MAX — Rork Max generates native Swift code ($200/mo), covering iPhone, iPad, Watch, TV, Vision Pro, and iMessageSIMULATOR — A browser-based streaming iOS simulator lets you test on a real Apple environment without Xcode or Mac hardwareSWIFTUI — SwiftUI evolves at WWDC 2026 with reorderable containers, swipe actions for any container, and layouts up to 2x fasterAPPLE-AI — Apple opens Foundation Models free to developers under 2M first-time downloads, slashing the cost of adding AI to indie appsSWIFT-API — Foundation Models server-side integration lets you call Claude and Gemini through the same Swift API, now with image inputKOTLIN-MIGRATION — Android Studio's migration agent converts React Native apps into native Kotlin automatically — a future path for Rork-built appsRORK-MAX — Rork Max generates native Swift code ($200/mo), covering iPhone, iPad, Watch, TV, Vision Pro, and iMessageSIMULATOR — A browser-based streaming iOS simulator lets you test on a real Apple environment without Xcode or Mac hardwareSWIFTUI — SwiftUI evolves at WWDC 2026 with reorderable containers, swipe actions for any container, and layouts up to 2x faster
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.

Rork380React Native152Expo60Debug MenuAdMob60Remote Config5

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 $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-05-30
Managing Native Settings Across Rork-Exported Apps with a Custom Expo Config Plugin
Tired of re-typing your AdMob ID and ATT string every time prebuild wipes your Info.plist? Here is how I made native settings reproducible with a custom Expo config plugin and shared it across six wallpaper apps.
Dev Tools2026-05-28
Tracking Down BGTaskScheduler.submit Error Code=1 (Unavailable) in Rork iOS Apps
A field-tested checklist for diagnosing BGTaskScheduler.submit failing with Error Code=1 (Unavailable) in iOS apps built with Rork, walking through the six causes that account for nearly every case.
Dev Tools2026-05-26
Two Weeks Tightening Up iPad Support for a Rork-Generated Wallpaper App
Notes from spending two weeks tightening up iPad support for a wallpaper app I scaffolded with Rork. Coming from an iPhone-centric indie practice since 2014, I cover where Rork's defaults stopped, how the AdMob adaptive banner misbehaved on iPad, and what changed in retention afterwards.
📚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
See all →