Building offline ipa/app locally without publish or eject


Basically I want to build an offline app (no hosted OTA updates) locally (using turtle-cli) without publishing (instead using expo export) or ejecting. Hopefully that’s clear enough. I’ve followed so many docs and forum posts, but I’ve hit a wall when I open the app on a device or simulator and it says "Could not connect to development server. [...] URL:". But I don’t want it to try to connect to any Node server at all. How do I package it as an offline app where it uses the manifest that’s in the app? Is there something obvious I’m missing about building a standalone app?


I’ve basically been following these instructions.

  1. Export locally: expo export --dev --public-url
  2. Host locally: npx http-server -p 8000 dist
  3. Build locally:
    turtle build:ios \
    --team-id "bbbb" \
    --dist-p12-path "cccc" \
    --provisioning-profile-path "dddd" \
    --public-url "" \
    --allow-non-https-public-url \
    --output "eeee" \
    --type simulator
  4. Stop hosting before running the app.


Of course I set "updates": { "enabled": false } in my app.json, and I can see the resulting .app’s EXShell.plist has areRemoteUpdatesEnabled and updatesCheckAutomatically set to boolean 0. However I also see the manifestUrl is

I saw some posts mentioning publishManifestPath and publishBundlePath, so I tried setting those, but I’m not even sure if those have much effect without ejecting. I couldn’t identify any difference.

I tried setting various EXUpdates__ values in app.json’s infoPlist, but I guess these only affect Info.plist, not Expo.plist where those keys are expected.

This post seems similar, where they want to load the manifest and bundle offline. They solve this by manually replacing shell-app-manifest.json and shell-app.bundle, but I don’t know how to do this without ejecting. I can manually edit these files within a .app, but that won’t work for a .ipa, right?

Any pointers would be super appreciated!

I found an identical issue here, so I opened a GitHub issue.

This topic was automatically closed 20 days after the last reply. New replies are no longer allowed.