◉RORK LABJP
●EXPO — EAS Observe now records native crashes (Oct 7). On SDK 57, update to 57.0.21 or later●SDK 58 — SDK 58 Beta has been out since Sep 15. The stable date is still unconfirmed●RN 0.88 — React Native 0.88.x is scheduled for Oct 12, 3 days left●Q&A — People are asking why expo-widgets render blank only in production builds●RORK — GPT-6.1 Sol was added on Sep 29, available on Pro and Max plans●NEW — Building an app for a client? Decide who owns the publishing account first●EXPO — EAS Observe now records native crashes (Oct 7). On SDK 57, update to 57.0.21 or later●SDK 58 — SDK 58 Beta has been out since Sep 15. The stable date is still unconfirmed●RN 0.88 — React Native 0.88.x is scheduled for Oct 12, 3 days left●Q&A — People are asking why expo-widgets render blank only in production builds●RORK — GPT-6.1 Sol was added on Sep 29, available on Pro and Max plans●NEW — Building an app for a client? Decide who owns the publishing account first
Articles/Business
⟐ Business/2026-08-25Intermediate

I Split Rork and Claude Code by Who Owns the Build Environment

How to decide between Rork and a terminal coding agent using data from your own repository instead of impressions of generated code. Includes a script that counts which layer your maintenance work lands in, and a check that catches native settings silently disappearing on regeneration.

Rork577Claude Code6Expo213config plugin6indie development42

✦ Premium Article

For a week I kept switching between the Rork interface and my own terminal. On one side, a generated screen appeared on a physical device within seconds. On the other, an agent wrote diffs into my local repository. Side by side, both moved at about the same speed. I spent most of a day trying to decide which one was better, and got nowhere.

The problem was that no evidence showed up. I read the generated screen code and I read the agent's diffs, and both sat comfortably inside "good enough." I ended the day without picking either.

The answer arrived only when I stopped comparing and started counting my own commit history instead. The places where I had actually been losing time turned out to sit in a different layer from the one generative AI is good at.

I Was Comparing the Wrong Thing

Ask "Rork or a terminal coding agent?" and the comparison naturally lands on code quality. Which one writes more readable JSX. Which one names things more sensibly. Which one puts state in the right place.

But even where a difference exists on that axis, it closes quickly in practice. If the code is hard to read, you fix it, and fixing it costs about the same in either environment.

The difference that does not close sits somewhere else entirely: whether you own the environment that builds your app and puts it on a device, or hand that off to someone else.

Hand it to Rork and you need no Mac, no Xcode, no Android Studio. Through Companion you can check on a real iPhone without a paid Apple Developer account. In exchange, on the day you need to reach one specific line inside ios/ or android/, you cannot reach it.

Keep it in-house and that line is yours. In exchange, SDK updates, certificate expiry, the compatibility matrix between Gradle and AGP — you maintain all of it, forever.

Neither is superior. The answer flips depending on how often your project actually touches the native layer. Having got that far, the next question was obvious: how often do I touch it?

Counting Which Layer the Work Lands In

Impressions were not producing an answer, so I counted from git history. The script below does nothing more than classify changed files by layer.

#!/usr/bin/env bash
# Count files changed across the last N commits, grouped by layer.
# Usage: ./native-landing.sh [commit count, default 200]
set -euo pipefail
LIMIT="${1:-200}"
 
js=0; native=0; asset=0; plugin=0; other=0
 
while IFS= read -r f; do
  case "$f" in
    ios/*|android/*|*.pbxproj|*Info.plist|*.entitlements|*build.gradle*|*.podspec|Podfile*|gradle.properties)
      native=$((native+1)) ;;
    plugins/*|app.json|app.config.*|eas.json|expo-module.config.json)
      plugin=$((plugin+1)) ;;
    assets/*|*.png|*.jpg|*.webp|*.mp3|*.m4a|*.caf)
      asset=$((asset+1)) ;;
    *.ts|*.tsx|*.js|*.jsx)
      js=$((js+1)) ;;
    *) other=$((other+1)) ;;
  esac
done < <(git log -n "$LIMIT" --name-only --pretty=format: | grep -v '^$' | sort -u)
 
total=$((js+native+asset+plugin+other))
[ "$total" -eq 0 ] && { echo "No files matched"; exit 0; }
 
pct() { awk -v a="$1" -v b="$total" 'BEGIN{printf "%.1f", (a*100)/b}'; }
 
printf 'Files touched in the last %s commits: %s\n\n' "$LIMIT" "$total"
printf '  JS/TS layer        %4s (%s%%)\n' "$js"     "$(pct "$js")"
printf '  Native config      %4s (%s%%)\n' "$native" "$(pct "$native")"
printf '  Config / plugins   %4s (%s%%)\n' "$plugin" "$(pct "$plugin")"
printf '  Assets             %4s (%s%%)\n' "$asset"  "$(pct "$asset")"
printf '  Other              %4s (%s%%)\n' "$other"  "$(pct "$other")"
printf '\nNative-side landing rate: %s%%\n' "$(pct $((native+plugin)))"

Here is what it prints, run against a small Expo project I set up to verify the script:

Files touched in the last 50 commits: 6

  JS/TS layer           1 (16.7%)
  Native config         2 (33.3%)
  Config / plugins      2 (33.3%)
  Assets                1 (16.7%)
  Other                 0 (0.0%)

Native-side landing rate: 66.7%

git log --name-only repeats the same file for every commit that touched it, so sort -u collapses them. The question is not "how many times did I touch this" but "how many distinct files did I have to touch." Counting occurrences lets the screen file you edit daily dominate the tally, and buries the build.gradle you open three times a year and lose half a day to each time.

When I pointed this at the apps I maintain as an indie developer, the result went against my own self-image. I think of myself as someone who writes JS/TS. The history says the config and native layers carry more of the work: new screen resolutions, build-tool version combinations, signing, App Store and Google Play declarations. None of that lives in screen code.

And screen code is exactly where generative AI is fastest. The layer where I lose time and the layer where generation helps are not the same layer. That mismatch is why the comparison had felt so slippery.

Here is how I read the resulting number:

Native-side landing rateWhat it meansSuggested stance
Under 20%Defaults are carrying youLeave the build environment with the tool
20–50%Settings change, but stay expressible as pluginsGeneration primary, local secondary
Over 50%Native work is the center of maintenanceOwning the build environment is worth considering

These thresholds are not universal. I use "reconsider above 50%" as my own marker, but the right number moves with the app. Anything carrying ads or in-app purchases is structurally heavier on the config side, while a read-only content app can sit comfortably in the teens.

✦

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 decide whether to switch tools using real data from your own repository, not your impression of the generated code
✦You will be able to catch native settings silently vanishing on regeneration before it reaches a submission
✦You will be able to draw the line feature by feature, rather than app by app, between what stays on the generated side and what you pull in-house
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

⟐ Business2026-08-31
After the Google Play deadline: which dormant Android apps to raise, and which to leave at 35
Apps you have stopped updating are governed by a different bar than apps you still ship. Here is how to inventory effective targetSdk across your builds and decide which apps to raise, hold, or retire.
⟐ Business2026-05-10
What I Learned Letting Rork Prototype an Art App: Where to Delegate, Where to Hold the Line
A hands-on review of prototyping an art gallery app with Rork: how far it honors color temperature and negative space, seen from artist and developer perspectives.
⟐ Business2026-04-26
Rork's Free Plan and Free Trial — What You Actually Keep When the Credits Run Out
What ends a Rork free trial is messages, not days. Export while it is still free, verify it builds outside Rork with a small script, then decide about paying.
📚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