RORK LABJP
FOUNDATION — The model layer underneath every AI app builder moved this week. Gemini 3.8 Flash reached general availability on September 2, and Claude Fable 5.1 arrived on September 1IMPACT — Updates like these land without you choosing them. The quality of generated code can shift quietly from one day to the next, which is why it helps to keep your own record of when things changedMAX — Rork Max generates native Swift across iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessage. It compiles on a cloud Mac fleet, so you can build for Apple platforms without owning a MacDEPTH — Its reach into native capabilities is the real draw: AR and LiDAR scanning, Dynamic Island, Live Activities, HealthKit, NFC, and on-device machine learning through Core MLPRICING — The Max plan runs $200 a month, with a free tier of roughly five prompts a week. For solo developers, working out how far the free tier gets you is a sensible first stepSTACK — Standard Rork is built on React Native and Expo, aiming for a genuinely native experience rather than a web wrapper. Choosing between it and Max is a decision worth making deliberatelyFOUNDATION — The model layer underneath every AI app builder moved this week. Gemini 3.8 Flash reached general availability on September 2, and Claude Fable 5.1 arrived on September 1IMPACT — Updates like these land without you choosing them. The quality of generated code can shift quietly from one day to the next, which is why it helps to keep your own record of when things changedMAX — Rork Max generates native Swift across iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessage. It compiles on a cloud Mac fleet, so you can build for Apple platforms without owning a MacDEPTH — Its reach into native capabilities is the real draw: AR and LiDAR scanning, Dynamic Island, Live Activities, HealthKit, NFC, and on-device machine learning through Core MLPRICING — The Max plan runs $200 a month, with a free tier of roughly five prompts a week. For solo developers, working out how far the free tier gets you is a sensible first stepSTACK — Standard Rork is built on React Native and Expo, aiming for a genuinely native experience rather than a web wrapper. Choosing between it and Max is a decision worth making deliberately
Articles/Dev Tools
Dev Tools/2026-09-04Advanced

EAS secret visibility does not keep a value out of your app — deciding prefix and visibility separately

The EXPO_PUBLIC_ prefix decides what ships inside your app; EAS visibility decides who can read it. Why stacking them blanks a value on OTA updates, and how to check your build.

Expo198EAS7environment variables3React Native235Rork551

Premium Article

I was running grep over a freshly exported JavaScript bundle during a pre-release check. What I was looking for was an analytics key I had prefixed with EXPO_PUBLIC_ myself.

It was there. That was expected, and still slightly unsettling, because I had set that variable's visibility on EAS to the most restricted level and had spent a while assuming that restricting it there also restricted what ended up inside the artifact.

The two settings decide entirely different things. The prefix decides whether a value is embedded in the shipped artifact. Visibility decides who is allowed to read it. Prefix governs the artifact, visibility governs the path. Since I started holding those apart, deciding where a key belongs stopped taking any real time.

The prefix and the visibility answer different questions

The first thing that stops adding up in Expo environment variables is treating these as one sliding "security level". Side by side, the mismatch is obvious.

AxisWhat it decidesHow it takes effect
The EXPO_PUBLIC_ prefixWhether the value is embedded in client codeAt bundle time, process.env.EXPO_PUBLIC_* is replaced inline with the value
EAS visibility (plaintext / sensitive / secret)Who can read the value, and whereChanges what appears in the dashboard, in EAS CLI, and in job logs

So a variable set to secret still lands in the artifact if its name begins with EXPO_PUBLIC_ and client code reads it. Expo's own documentation says as much: on Environment variables in EAS, secrets "do not provide any additional security for values that you end up embedding in your application itself".

I had read that line before. I did not miss the words so much as get pulled along by the feel of the word "secret".

What secret actually stops is everything outside EAS

Secret visibility works on the paths that carry a value off EAS servers. It helps to name what closes and what stays open.

What closes: display in the dashboard, reads from EAS CLI, values printed into job logs, and eas env:pull writing the value down into a local .env file.

What stays open: the build job itself. Builds run on EAS servers, so a secret value is available there, and the bundler embeds it into client code exactly as it would any other value. Once embedded, it is part of what you ship.

"I don't want anyone reading this" and "I don't want this inside the app" sound alike and are different requirements. The first is answered by visibility. The second is answered by the prefix and by your architecture.

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 will be able to separate the two axes — prefix and visibility — and decide where each key in your own app belongs without second-guessing
You will be able to catch, before release, the failure where a store build works fine but an OTA update ships with a blank value, which is painful to diagnose afterwards
You will be able to drop a bundle-search step and an EAS variable audit script straight into your own pre-ship checklist
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-22
Every bulk replace exited zero. The damage was in the lines I did not delete
Run a bulk replace over generated code and the breakage lands on the neighbouring lines, not the matched ones. Here is what broke in a live project, and a dependency-free guard that checks the invariants a replace must preserve.
Dev Tools2026-07-30
What Renovate may bump in an Expo app, and what it must never touch
Turning on automated dependency updates in a Rork-generated app also hands Renovate the 123 packages Expo SDK 57 pins. Measured on 2026-07-30, six of them sit a full major version behind npm latest. Here is how to generate the ignore list from the SDK instead of maintaining it by hand.
Dev Tools2026-07-28
Counting what prebuild --clean will erase before you upgrade to Expo SDK 57
A raw diff between two generated ios/ trees showed 649 changed lines; only 3 were real edits. How to count what prebuild --clean erases, and move it into a config plugin.
📚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 →