RORK LABJP
DEADLINE — Two days remain until Google Play requires Android 16 (API level 36). From August 31 it applies to new apps and to updates of existing ones alikeEXTENSION — The extension that keeps you shipping to all users until November 1 cannot be filed after the deadline passes, so the decision point is effectively todayCHECK — What matters is not the targetSdkVersion number itself but whether a build at that level still compiles and reaches submission. Run it end to end onceEXPO — expo@57.0.17 shipped on August 27, moving React Native to 0.86.3 and clearing both the Hermes V1 memory regression and the startup time regressionPREBUILD — expo prebuild clears and regenerates the native android and ios directories by default, so move hand-edited native changes into a config plugin firstRORK MAX — Rork Max generates native Swift, reaching AR and LiDAR, Dynamic Island, Live Activities, HealthKit, and Core ML — layers React Native struggles to touchDEADLINE — Two days remain until Google Play requires Android 16 (API level 36). From August 31 it applies to new apps and to updates of existing ones alikeEXTENSION — The extension that keeps you shipping to all users until November 1 cannot be filed after the deadline passes, so the decision point is effectively todayCHECK — What matters is not the targetSdkVersion number itself but whether a build at that level still compiles and reaches submission. Run it end to end onceEXPO — expo@57.0.17 shipped on August 27, moving React Native to 0.86.3 and clearing both the Hermes V1 memory regression and the startup time regressionPREBUILD — expo prebuild clears and regenerates the native android and ios directories by default, so move hand-edited native changes into a config plugin firstRORK MAX — Rork Max generates native Swift, reaching AR and LiDAR, Dynamic Island, Live Activities, HealthKit, and Core ML — layers React Native struggles to touch
Articles/Dev Tools
Dev Tools/2026-08-29Advanced

The Remote Config keys you add after your release path closes are invisible to the build already on devices

A record of recounting what I can still change remotely before my release path closes. A key you add in the console does nothing unless a build that reads it is already on devices. Which switches to ship in the last build, and a shared-defaults bug I measured.

Remote Config10Expo188Release Operations3Indie Development24Feature Flags4

Premium Article

With August 31 approaching, I lined up my apps and went through them one at a time, asking whether each one could realistically get a new build out before the deadline. When you have been shipping as an indie developer for long enough, a few apps always end up with a slow update cadence. They still work, but you have not touched them recently — and those are exactly the ones where a build attempt turns into a dependency archaeology session.

So I changed the question. Suppose I miss the deadline on one of them and end up unable to ship a new build for a while. How much of that app can I still change from the outside?

Counting it up, the answer was narrower than I had assumed. The reason is simple: the only things you can move remotely are the branches the shipped build was already written to read. Obvious in hindsight, but when you always have a release path available, you never have to think about where that boundary sits.

Recounting what I can still reach from outside

The deadline itself splits differently depending on your situation, which I covered in August 31 Means Something Different Depending on Whether You Plan to Ship an Update. What I want to look at here is what comes after that: once you are in a period where you cannot ship, what levers are left in your hands?

In my case, adding wallpapers never required an app update. I wrote up that decision in Keeping a wallpaper app's binary small: moving images out of the bundle. Because of that structure, content keeps flowing even when releases stop.

Operational actions are a different story. Disabling a feature, showing a notice, raising the minimum supported version — all of those route through remote configuration. That is the part this article is about.

A key in the console does not exist unless a build that reads it is out there

Once you have remote config wired up, you start to feel like anything can be changed later. In practice, the only things you can change are the names a shipped binary calls getString("...") on. Add a new parameter in the console and nobody reads it, because no build on any device references it.

Normally this constraint never surfaces. When you want a new key, you ship the code that reads it in the same release. As long as key and code travel together, there is no gap.

The gap only bites when the release path closes. If you decide mid-freeze that a feature needs to be turned off, and the shipped build has no branch for turning it off, there is nothing the console can do for you.

Which means the last release before a freeze is not only about the features you are shipping. It is also the release where you plant the controls you might need for the months that follow. Adding switches you have no immediate use for is normally a habit worth resisting. When a freeze is on the table, the opposite judgment is the correct one.

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
You'll be able to ship the switches you might need during a freeze in the last build that goes out before it starts
You'll be able to drop in a single script that audits Remote Config keys against the shipped tag rather than your working tree
You'll be able to estimate the real delay between saving a value and it taking effect, given the 12-hour default fetch interval
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-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.
Dev Tools2026-07-06
Cloud-Synced Folders Break App Builds — Excluding Build Artifacts From Sync to Fix It for Good
A project living in Dropbox or iCloud Drive stopped building one morning. The cause was sync creating conflicted copies inside build artifacts. Here is how I excluded node_modules and Pods from sync to stop the recurrence, told as an indie developer's field notes.
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 →