RORK LABJP
MAX — Rork Max is built on Claude Code and Claude Opus 4.6, generating native Swift apps directly instead of React NativeAPPLE — Rork Max targets the whole Apple ecosystem: iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageWORKFLOW — In practice, users settle into letting the AI scaffold while they rewrite the state management and data layer themselvesSEED — Rork raised a $15M seed led by Left Lane Capital in April, with Peak XV, True Ventures, and a16z Speedrun joiningPAPERLINE — Rork acquired app builder Paperline and says it will stay acquisitive to bring in engineering talentREVIEW — Three-month revisit reviews are growing, clarifying where the tool shines and where it doesn'tMAX — Rork Max is built on Claude Code and Claude Opus 4.6, generating native Swift apps directly instead of React NativeAPPLE — Rork Max targets the whole Apple ecosystem: iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageWORKFLOW — In practice, users settle into letting the AI scaffold while they rewrite the state management and data layer themselvesSEED — Rork raised a $15M seed led by Left Lane Capital in April, with Peak XV, True Ventures, and a16z Speedrun joiningPAPERLINE — Rork acquired app builder Paperline and says it will stay acquisitive to bring in engineering talentREVIEW — Three-month revisit reviews are growing, clarifying where the tool shines and where it doesn't
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.

Rork502React Native202Expo139Debug MenuAdMob69Remote Config6

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-07-10
Adding React Compiler to Expo Let Me Delete 41 Hand-Written memo Calls
I enabled React Compiler on Rork-generated React Native screens and measured the rerender counts with Profiler. Here is how I decided which memo and useCallback calls were safe to delete, how to find the components the compiler bailed out on, and how to catch regressions in CI.
Dev Tools2026-07-07
The App Icon Badge Still Says 3 — Rebuilding Expo Badge Counts Around a Single Source of Truth
Why an Expo app's icon badge drifts out of sync with real unread counts and refuses to clear — and how to rebuild it around a single source of truth, with working recompute-and-sync code and the production pitfalls that bite you.
Dev Tools2026-07-04
Should You Show a Read More Link? Let the Rendered Text Decide in Rork (Expo)
Clamping a product description to three lines and adding a Read more toggle sounds simple, until the toggle also appears under single-line text. This walks through measuring the real line count with onTextLayout so the toggle only shows when text actually overflows, covering iOS vs Android quirks, expand animation, and font scaling.
📚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 →