Introduction
xcross runs, hot-reloads and debugs Flutter iOS apps on a real iPhone, natively from Windows or Linux, with no Mac required.
xcross reimplements the Flutter iOS run pipeline and the iOS 17+ CoreDevice launch protocol in pure Dart. It prepares your Flutter app with the official Swift and LLVM toolchains, puts it on a physical iPhone with your Apple ID or an App Store Connect API key, launches it, and gives you full hot reload and breakpoints - all from a Windows or Linux machine. No Mac, no Xcode, no macOS anywhere.
Capabilities
| Feature | Details |
|---|---|
| Native Windows & Linux | Runs directly on the host with official Swift and LLVM toolchains - no macOS VM, no remote Mac. WSL works too, with usbipd-win for the device |
| Hot reload & hot restart | Full r / R workflow on a real iPhone over an iOS 17+ RSD tunnel |
| Real devices, your Apple ID | Apple ID (free account works) or App Store Connect API key; provisioning runs in-process |
| SwiftPM plugins | Swift Package Manager iOS plugins work on both Windows and Linux |
| IDE debugging | One command sets up VS Code (F5, breakpoints, DevTools) or JetBrains IDEs via DAP |
| No Xcode in the loop | Flutter’s own engine artifacts are used unmodified; Xcode’s toolchain is never installed or executed |
Typical workflow
A full session with xcross looks like this:
- One-time machine setup:
xcross setup,xcross sdk install, andxcross auth. - Once per device reconnect:
xcross tunnelto mount the Developer Disk Image and start the RSD tunnel. - From your Flutter project:
xcross flutter runto launch on the device and hot-reload as you edit. - Optionally,
xcross ide vscodeorxcross ide ideato wire up debugging in your editor.
With multiple iPhones connected, an interactive terminal shows a numbered device picker; pass -u <UDID> for CI or piped runs.
While your app is running
| Key | Action |
|---|---|
r | Hot reload |
R | Hot restart |
q / Ctrl-C / Ctrl-D | Quit |
What xcross is not
Importantxcross targets debug (JIT) runs on a device only. Launching with xcross requires iOS 17 or later on the device.
- Not a release/AOT path. Flutter’s
gen_snapshotfor iOS AOT only runs on macOS hosts, so release output still requires Flutter’s macOS tooling. - Not a Compose Multiplatform tool. xcross currently supports Flutter applications only.
- Not a full plugin replacement. Plugins that provide only a CocoaPods podspec are skipped with a warning - plugins need
ios/<package_name>/Package.swift. - Not for older devices. Launching requires iOS 17 or later, since xcross relies on the CoreDevice launch protocol and RSD tunnel introduced in iOS 17.
About the project
xcross is MIT-licensed and developed at github.com/arxdeus/xcross; the current version is shown in the header. It draws on ideas from xtool, which pioneered deploying iOS apps with SwiftPM from Linux and Windows, and from Provision and anisette-v3-server for Apple ID authentication without Apple hardware.
xcross is free and open source. Contributions and bug reports are welcome on GitHub, and the project accepts donations to support ongoing development.
TipNew to xcross? Start with Requirements, then follow Quick start end to end.
Where to go next
- Requirements - the five host ingredients you need before installing.
- Installation - install xcross on Windows or Linux.
- Quick start - set up your machine and run your first app.
- How it works - a conceptual tour of what happens on every run.