RORK LABJP
ENGINE — Rork Max generates code on top of Claude Code and Claude Opus 4.6, which is worth knowing when you tune how specific your prompts areSPLIT — Rork Max is Apple-only. If you also need Android, the original Rork is the one that generates cross-platform apps with React NativeDEVICE — Rork Max targets iPhone, iPad, Apple Watch, and Vision Pro, reaching territory React Native struggles to coverCREDIT — Billing runs on credits: one credit per AI interaction, reset on the 1st of each month with nothing carried overPLAN — Free gives 35 credits a month (5 per day); Junior is $25/mo, Senior $100/mo, and Rork Max $200/mo, with Senior the usual pick for MVP workFUND — Rork raised $2.8M from a16z and now draws over 743,000 monthly visitsENGINE — Rork Max generates code on top of Claude Code and Claude Opus 4.6, which is worth knowing when you tune how specific your prompts areSPLIT — Rork Max is Apple-only. If you also need Android, the original Rork is the one that generates cross-platform apps with React NativeDEVICE — Rork Max targets iPhone, iPad, Apple Watch, and Vision Pro, reaching territory React Native struggles to coverCREDIT — Billing runs on credits: one credit per AI interaction, reset on the 1st of each month with nothing carried overPLAN — Free gives 35 credits a month (5 per day); Junior is $25/mo, Senior $100/mo, and Rork Max $200/mo, with Senior the usual pick for MVP workFUND — Rork raised $2.8M from a16z and now draws over 743,000 monthly visits
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.

Rork521React Native213Expo151Debug MenuAdMob70Remote Config7

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-27
When to Raise Your Minimum iOS Version — Count Leftover Branches, Not User Percentages
Judging a minimum OS bump by usage share produces the same answer every year, so the decision never happens. Here is the annotation convention, the sweep script that counts how many branches each candidate floor would retire, and what to watch for 30 days after.
Dev Tools2026-07-26
What Filtering Out Prerelease OS Devices Cost Me — Separating Telemetry Tracks Instead of Dropping Them
Filtering prerelease OS devices out of telemetry left me with no warning signs on GA day. Here is the rebuild: an os_track dimension, a remote GA baseline, split alert thresholds, and a release gate that separates blockers from fixes.
Dev Tools2026-07-24
Resolving App Config in Three Layers: Merging Defaults, User, and Remote With Bounded Overrides
A single type-safe layer that merges compiled defaults, user preferences, and remote config. So a broken remote value never takes your app down, each key gets its own override strength, plus schema validation and range clamping, built from a real production incident.
📚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 →