RORK LABJP
iOS 27 — Two days out from the September 14 release. The days right after a new OS are when AI-generated apps wobble mostWAITING — Standard Rork waits on Expo and React Native to ship their updates, and that wait is not something you can shorten yourselfMAX — Rork Max writes native Swift, so it can follow along as soon as Xcode and the SDK are ready. One fewer queue to stand inNEW APIS — Whether a new API can actually be generated still depends on whether the model has seen the new SDK. Max does not solve that overnightFOLDABLE — A new screen shape like iPhone Duo is where generated layouts break first. Start with fixed widths and safe areasNUMBERS — Funding figures still disagree across secondary sources. The $15M seed and the Paperline acquisition were announced on April 9, 2026iOS 27 — Two days out from the September 14 release. The days right after a new OS are when AI-generated apps wobble mostWAITING — Standard Rork waits on Expo and React Native to ship their updates, and that wait is not something you can shorten yourselfMAX — Rork Max writes native Swift, so it can follow along as soon as Xcode and the SDK are ready. One fewer queue to stand inNEW APIS — Whether a new API can actually be generated still depends on whether the model has seen the new SDK. Max does not solve that overnightFOLDABLE — A new screen shape like iPhone Duo is where generated layouts break first. Start with fixed widths and safe areasNUMBERS — Funding figures still disagree across secondary sources. The $15M seed and the Paperline acquisition were announced on April 9, 2026
Articles/AI Models
AI Models/2026-09-12Beginner

Ask Rork for an iOS 27 feature and you may get last year's code back, with no error at all

iOS 27 ships on September 14. When a model is asked for an API it has never seen, there are two kinds of failure: the kind that stops your build, and the kind that does not. Here is why standard Rork and Rork Max differ, and the order I check generated code in.

Rork561iOS 273AI-generated code2Expo206Rork Max234

Last night I was talking through a feature with Rork for the next update. I named a capability I had read would arrive with the new OS, and asked for it by name.

What came back looked tidy. The types lined up, the editor showed no red squiggles, and the build went through.

The capability I had asked for was nowhere in it. In its place sat the same approach I have been using since last year.

Getting an answer back and getting what you asked for are two different things. iOS 27 and iPadOS 27 are announced for September 14, so settling on a way to check now will save you a fair amount of the weeks that follow.

There are two kinds of "doesn't know"

It helps to separate them, because they behave nothing alike.

The first is inventing a name that does not exist. A class or a method appears that the SDK has never heard of, and the build stops. Your work stops too, but the stop itself is the message. This is the kind of failure I am glad to get.

The second is falling back to something it does know. When the new name is absent from what the model learned, it fills the gap with the nearest familiar shape. That shape is real code, so it compiles, and it runs. It simply does not contain the thing you asked for. This is the quiet one.

I do not think of it as dishonesty. Called into territory it has not seen, the model drifts toward the closest thing it has — that is all it is. The trouble is that the drift leaves no mark on the side that receives it.

KindWhat happensWhere you noticeRisk
Invents a nameBuild failsBuild time, editor warningsLow — it stops you
Falls back to the old pathCompiles, runs, feature missingOften not until a deviceHigh
Substitutes a lookalikeBehaviour only resembles the requestOnly with old and new devices side by sideHigh

In the weeks around a new OS release, the second and third grow more common. The world the model learned from does not contain the feature yet.

With standard Rork, a new OS API never reaches the JS side

A quick line between the products first. Standard Rork generates React Native through Expo. Rork Max, a separate product released in February 2026, generates native Swift. Same promise on the surface, very different footing when a new OS lands.

Take standard Rork first. What JavaScript can call is limited to whatever has a bridge on the native side — an Expo module, or a community native module.

So a brand-new OS API becomes reachable only after Expo and React Native move up a version and the modules follow. Until that bridge exists, no amount of careful prompting gets you there. What the model returns instead is something writable in JavaScript that resembles the request.

You can count the bridges you actually have in a few seconds.

# List the config plugins declared in app.json
node -e "const c=require('./app.json');console.log((c.expo.plugins||[]).map(p=>Array.isArray(p)?p[0]:p).join('\n'))"
 
# To see what actually got applied
npx expo config --type introspect

Anything absent from that output is outside your reach today. It is not a prompting problem, and a higher plan does not change it. What cannot reach you will not reach you because you asked more politely.

Holding that line in advance is what keeps you from burning an afternoon after release asking why something will not work. If you know it cannot arrive yet, waiting becomes a decision rather than a default.

With Rork Max, a clean compile only proves the name exists

Rork Max generates native Swift and compiles it on a Mac in the cloud. It can follow a new OS as soon as Xcode and the SDK do, which makes its queue one step shorter.

A shorter queue is not the same as correct code. If the model has not seen the new SDK, it drifts to the older approach here too — and because that approach is real, it compiles.

A clean compile tells you that the name exists in the SDK. It tells you nothing about whether the new path you asked for is the one being taken. Mistake one for the other and you find out after shipping.

There is a useful tell. Code that uses an API exclusive to a new OS has to carry a branch for older ones.

if #available(iOS 27, *) {
    // Only devices on the new OS come through here
    startWithNewCapability()
} else {
    // Everything older lands here
    startWithExistingCapability()
}

When you want the whole function gated, the annotation goes on the declaration.

@available(iOS 27, *)
func startWithNewCapability() {
    // Implementation for the new OS only
}

Which gives you this: if the generated code contains no #available and no @available anywhere, yet the explanation claims a new API is in use, treat the explanation as suspect. Code that needs no branch is code that runs on older systems — the old path. You can apply that reading without knowing much Swift at all.

The order I check generated code in

Three steps, and the order matters.

One: confirm the name exists, in the body of the official documentation. Not a search summary, not a roundup post. Open Apple's Developer Documentation or the Expo documentation and look for it on the page. Secondhand write-ups are least reliable exactly when they are most abundant, which is the fortnight after a release.

Two: look for the branch. In Swift, that means #available. On the React Native side, it means asking whether the module is in your dependencies at all. If neither a branch nor a dependency is present while the text claims a new capability, stop there.

Three: put it on an older device. Checking only on a device running the new OS exercises one side of the branch. If you have no spare hardware, booting a simulator on the previous version still catches the missing half. I wrote up how I go through a published app on a beta build in Try your published Rork app on a spare iPhone before iOS 27 goes final.

Then one more thing after the three. Confirm with a single log line that the path you asked for was actually taken. A screen rendering correctly is not evidence that new code ran. I have skipped this more than once and learned it after shipping — the more correct the screen looks, the less inclined anyone is to check.

What I hold back for the two weeks from September 14

Shipping apps on my own has settled me into a rhythm for this season, and it comes down to a split.

I ship changes that stay inside paths that already exist: wording, layout adjustments, fixes I already understood. Those are largely untouched by a new OS.

I hold back anything that touches a new API, and wait for the bridge. Rushing it usually means rewriting in two weeks, and that rewrite goes through review all over again.

One exception: preparing for new screen shapes does not have to wait. When a folding form factor enters the lineup, the first thing to break is any view built on a fixed width — and you can fix that today, with the code you already have. Whether to pin the build environment itself is a separate call, and I went through it in Leave image out of eas.json and Xcode moves the day you bump your SDK.

If you do one thing tonight, run that node -e line and keep the list of bridges somewhere you can see it. When release week has you wondering whether a capability is even in reach, that list answers it in seconds.

Thank you for reading. The footing shifts for all of us in a new OS week. What I would rather keep in my own hands is the line between what I ship during the wobble and what I let wait.

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 →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

AI Models2026-06-19
Before You Pay $200/mo for Rork Max, Map How Far Expo Reaches in Three Tiers
Wanting widgets or Live Activities makes Rork Max tempting, but most of those features are reachable from the Expo setup that standard Rork generates. Here is how I sort each Apple-native feature into three tiers—reachable in Expo, reachable with a custom module, or where Max is the pragmatic answer—and verify which tier my app is in before paying.
AI Models2026-05-08
How I Stop Rork's AI From Generating Outdated Library Code — My Version-Pinned Prompt Template
A practical look at why Rork Max sometimes generates outdated API code, the version-pinned prompt template I rely on every day, and the device-level checks I use to catch the cases where mismatches still slip through.
AI Models2026-08-07
Cutting MCP Tools Didn't Make Anything Lighter — 2,377 Bytes of Definitions vs 110,298 Bytes of Response
I wrote a minimal MCP server for a wallpaper catalog and measured the byte cost of tool definitions against the byte cost of responses. Here is which side actually matters, and the real reason to merge tools.
📚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