Ship Android and iOS apps from one Rust codebase—without maintaining Gradle or Xcode projects.
RustFerry is a Rust-first mobile toolchain for shipping Android and iOS apps from an ordinary Cargo project. Application code and assets stay in Rust; disposable platform hosts are generated under target/ferry/ while cargo ferry handles builds, devices, deployment, logs, CI, signing, and remote macOS builds.
RustFerry 0.1.0 is available as a public pre-release from crates.io, GitHub Releases, and the Visual Studio Marketplace.
Important
RustFerry 0.1.0 is the first public pre-release. CI and retained evidence validate host tests, generated projects, a signed/aligned arm64 Android APK, iOS Simulator .app/.appex artifacts, and an unsigned physical-iPhone XCArchive built on a remote macOS worker. One Calculator APK built on Windows was launched and exercised on a physical Android device. Emulator, iOS Simulator, physical-iPhone runtime, generalized device install/run/log workflows, and a development-signed remote IPA remain unvalidated. An API or generated bridge is not, by itself, runtime evidence.
Install the published CLI from crates.io. Rust 1.92 or newer is required.
cargo install cargo-ferry --version 0.1.0 --locked
cargo ferry new weather --id com.example.weather
cd weather
cargo ferry doctor --all
cargo ferry checkThe generated project contains only application-owned Rust source, configuration, and assets:
weather/
├── Cargo.toml
├── ferry.toml
├── assets/
└── src/
weather/target/ferry/ # generated Android and Apple hosts
Generation defaults to the exact registry version of the rustferry runtime. Normal installations do not need --runtime-source path, --runtime-path, or CARGO_FERRY_RUNTIME_PATH.
Build a signed Android APK directly with Cargo, the Android SDK/NDK tools, and no Gradle project:
cargo ferry build androidOn macOS with full Xcode, build an arm64 iOS Simulator application:
cargo ferry build ios --simulatorBuild does not contact a device. Deployment is a separate operation:
cargo ferry devices
cargo ferry install android --device SERIAL
cargo ferry run ios --simulator SIMULATOR_UDID
cargo ferry logs android --device SERIALThese deployment backends have deterministic test coverage, and one Calculator APK has been launched and exercised on a physical Android device. The generic install/run/log workflow, other application and capability paths, Android emulators, iOS Simulators, and iOS devices remain runtime-unvalidated. See the support matrix and implementation evidence for the exact validation level.
cargo ferry add notifications
cargo ferry add widget
cargo ferry capabilities
cargo ferry config validateRustFerry exposes typed APIs for lifecycle events, network state, storage, permissions, haptics, clipboard, sharing, deep links, local notifications, widgets, and Live Activities. Capability availability and validation depth differ by platform.
Linux and Windows clients can send an exact source revision to a configured GitHub-hosted macOS worker:
cargo ferry remote setup github \
--source-remote-name public \
--execution-remote-name signing \
--execution-repository OWNER/private-signing \
--worker-revision <exact-commit>
cargo ferry build iphone --remote github --unsignedAn explicit dirty-source build is consent-bound and public:
cargo ferry --dry-run build iphone --remote github --snapshot --unsigned
cargo ferry build iphone --remote github --snapshot --unsignedReview the interactive plan before continuing. Snapshot bytes enter the public Git object database; deleting a temporary ref does not erase them. Named SSH Mac endpoints are also available for deterministic unsigned snapshot builds. The live GitHub evidence covers an unsigned XCArchive, not signing, IPA export, installation, launch, or device runtime.
Durable remote-job and artifact commands include:
cargo ferry jobs list
cargo ferry jobs show <local-job-id>
cargo ferry jobs logs <local-job-id> --follow
cargo ferry jobs cancel <local-job-id>
cargo ferry jobs retry <local-job-id>
cargo ferry jobs artifacts <local-job-id>
cargo ferry artifact verify <downloaded-path> --job <local-job-id>RustFerry for VS Code 0.1.0 is available from the Visual Studio Marketplace. The extension discovers trusted ferry.toml workspaces and delegates validation, builds, devices, deployment, remote jobs, artifacts, and logs to the versioned cargo-ferry protocol.
To package the extension from source:
cd editors/vscode
npm ci
npm run package
code --install-extension dist/rustferry-vscode.vsixAll nine publishable workspace crates are available on crates.io as version 0.1.0.
| Crate | Purpose |
|---|---|
cargo-ferry |
User-facing Cargo subcommand |
rustferry |
Application runtime API |
rustferry-core |
Configuration, validation, naming, assets, and shared primitives |
rustferry-codegen |
Project, capability, host, and asset generation |
rustferry-android |
Direct no-Gradle Android packaging backend |
rustferry-apple |
Generated Apple host and artifact backend |
rustferry-remote |
Versioned remote-build contracts |
rustferry-github |
GitHub Actions provider |
rustferry-ssh |
Pinned OpenSSH transport |
rustferry-worker-macos |
Non-publishable trusted macOS worker |
rustferry-worker-macos is intentionally workspace-only and is not published to crates.io.
Contributor builds select the checkout runtime explicitly:
git clone https://github.com/ShiroKSH/rustferry.git
cd rustferry
cargo install --locked --path crates/cargo-ferry
cargo ferry new weather \
--id com.example.weather \
--runtime-source path \
--runtime-path "$PWD/crates/rustferry"--runtime-source workspace supports monorepo development. CARGO_FERRY_RUNTIME_PATH is a contributor-only override; it is not part of the registry installation flow.
- Quickstart
- Installation
- CLI reference
- Architecture
- Android setup
- iOS Simulator setup
- Devices, install, run, and logs
- GitHub provider security
- Threat model
- Calculator, Counter, Network Guard, Notifications, Widget Counter, Live Score, and Kitchen Sink
The initial UI backend is Slint. Slint is not an MIT/Apache runtime dependency: application distributors must satisfy GPL-3.0, Slint's royalty-free application license and attribution condition, or a commercial license. Generated templates retain an accessible AboutSlint component. Read ADR-001 before distributing an application; it is technical context, not legal advice.
Read the contribution guide, Code of Conduct, and maintainer policy. Report vulnerabilities through SECURITY.md, not a public issue.
RustFerry is available under either the MIT License or the Apache License 2.0, at your option. Applications using Slint must make a separate Slint license choice.