How it works
What happens when you run xcross flutter run or xcross compose run, from source to a running app on an iPhone.
xcross does not wrap Apple’s tools. It reimplements the iOS build, signing and launch pipeline in pure Dart, on top of the official Swift and LLVM compilers.
Shared pipeline
Both frameworks end in the same place: a signed .app launched over the iOS 17+ CoreDevice tunnel.
Compileframework-specific
Link Runner
clang + ld64.lldSignin-process, no
codesignInstall
pymobiledevice3LaunchCoreDevice RSD tunnel
Per framework
Engine artifactsthe exact engine your Flutter SDK pins
Kernel compile
frontend_server → app.dill (JIT)SwiftPM pluginsbuilt into one
libFlutterPluginsGenerated.dylibHot reloadDevFS upload +
reloadSources over the VM ServiceKotlin sourcesGradle compiles the klib
Kotlin/Native
konanc links the iOS framework (cached)RunnerObjC or SwiftUI host app
Watch loop
r rebuilds, reinstalls and relaunchesWhy no Mac is needed
Darwin SDKExtracted once from
Xcode.xip by pure-Dart readers.Upstream compilersSwift + LLVM target iOS from any host.
Native signingApple Developer Services, spoken directly.
Open device protocols
pymobiledevice3 over USB or Wi-Fi.The only thing that truly needs macOS is Flutter’s AOT gen_snapshot, which is why Flutter runs are debug (JIT) only.
Deep dive: Architecture.