RORK LABJP
TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the roundTOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Articles/Dev Tools
Dev Tools/2026-05-30Advanced

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.

Rork515Expo149config pluginAdMob70prebuild

Premium Article

The week after I wired AdMob into an app exported from Rork, I added another library and ran npx expo prebuild. The GADApplicationIdentifier I had hand-written into Info.plist the previous week was simply gone. Of course it was — the whole ios/ folder gets regenerated. But I didn't know that at the time, so I wrote it back, watched it vanish, and repeated that a few times.

I have been building apps solo since 2014, and the wallpaper apps that grew to 50 million cumulative downloads now run as six parallel titles. Typing the same AdMob bootstrap by hand six times is nothing but a breeding ground for mistakes. I once pasted the wrong App ID into a single app and shipped a release where no ads showed at all. A custom Expo config plugin is what finally removed this "hand-edits that linger in the native layer" problem at the root.

Why your native settings vanish on every prebuild

The whole appeal of Rork and Expo is that you rarely think about ios/ and android/. Those native folders are output, not source. From the declarations in app.config.ts and package.json, npx expo prebuild regenerates the native projects from scratch every time.

Miss this and you will struggle endlessly. Editing the generated ios/MyApp/Info.plist by hand is like writing in sand — the next prebuild washes it away. If you keep ios/ and android/ in .gitignore for a more managed workflow, this is doubly true.

The right mental model is that native settings should also be generated from declarations. A config plugin is the bridge between that declaration and the generated output. Both of my grandfathers were temple carpenters, and growing up watching them cut wood exactly to the drawing left me with a deep preference for state that can be reproduced from the same procedure. A config plugin gives native settings exactly that reproducibility.

How a config plugin works inside prebuild

A config plugin is a function that rewrites native files midway through prebuild, using a set of "mods" provided by @expo/config-plugins. The common ones are:

  • withInfoPlist — receives the iOS Info.plist as a JS object and lets you mutate it
  • withEntitlementsPlist — handles iOS entitlements such as Associated Domains
  • withAndroidManifest — exposes AndroidManifest.xml as a parsed object
  • withAppBuildGradle — edits the app/build.gradle string directly
  • withDangerousMod — a last resort for touching any file directly

Prebuild applies these mods in order, then writes out the native project. So instead of editing Info.plist by hand, you write a JS instruction that says "always put this value in, every time you prebuild."

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
A complete config plugin that injects your AdMob App ID, ATT string, and SKAdNetwork list during prebuild
A shared-module setup so one edit propagates native settings to all six apps at once
Real production gotchas: withDangerousMod idempotency, mod ordering, and why plugins never run on EAS Update
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-06-16
I Initialized Ads Before Restoring Purchases, and Paying Users Saw a Banner Flash — Cold-Start Ordering for Rork (Expo) Apps
Consent, ATT, ad SDK init, purchase restore, and remote config all try to run in the same few hundred milliseconds at launch. Get the order wrong and a paying user sees a banner flash, or measurement fires before consent in the EEA. Here is how I fold a Rork-generated Expo app's startup into a single orchestrator and kill the races by design.
Dev Tools2026-06-15
The Day a Third Reason to Hide Ads Appeared — Folding Rork App Ad-Free Logic Into One Place
Ads show only on one screen for paying users, or ads never show for free users. The usual cause is that the condition for hiding ads is scattered across the code. Here is how I fold three reasons — subscription, lifetime purchase, and a timed reward unlock — into a single state and route every ad through one hook, written as an implementation note from running six apps as an indie developer.
Dev Tools2026-06-12
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.
📚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 →