JFFI
A cross-platform framework for building native applications with Rust business logic and platform-native UIs.
Philosophy
Write your business logic once in Rust. Build native UIs for each platform.
- Write business logic once in Rust
- Use native UI frameworks (SwiftUI, Jetpack Compose, WinUI, etc.)
- Get truly native performance and platform feel
- Maintain type safety end-to-end via UniFFI
Quick Start
Installation
# Install JFFI CLI
Create Your First App
# Create a new app with platform support
# Navigate and run
That's it! The app builds, compiles Rust, generates platform bindings, and launches automatically.
📱 Supported Platforms
| Platform | Status | UI Framework | Language |
|---|---|---|---|
| iOS | ✅ Ready | SwiftUI | Swift |
| macOS | ✅ Ready | SwiftUI | Swift |
| Android | ✅ Ready | Jetpack Compose | Kotlin |
| Linux | ✅ Ready | GTK 4 + Libadwaita | Python |
| Web | ✅ Ready | Vanilla JS + WASM | JavaScript |
| Windows | ✅ Ready | WinUI 3 | C# |
🏗️ Project Structure
my-app/
├── core/ # Rust business logic + UniFFI exports
│ ├── src/lib.rs
│ └── Cargo.toml
│
├── ffi-web/ # WASM FFI wrapper (present when web is enabled)
│ └── src/lib.rs
│
├── platforms/
│ ├── ios/ # iOS SwiftUI app (auto-generated Xcode project)
│ ├── android/ # Android Jetpack Compose app
│ ├── macos/ # macOS SwiftUI app
│ ├── linux/ # GTK 4 Python app
│ ├── windows/ # WinUI 3 C# app
│ └── web/ # Vanilla JS + Vite frontend
│
├── jffi.toml # Framework configuration
├── Cargo.toml # Workspace manifest
└── Makefile # Convenience commands
Development Workflow
1. Write Business Logic + Expose via UniFFI
core/src/lib.rs:
use uniffi;
setup_scaffolding!;
2. Build & Run
For iOS:
For Android:
For macOS:
For Linux:
For Web:
For Windows:
This automatically:
- iOS/macOS: Compiles Rust, generates Swift bindings, creates Xcode project, builds and launches
- Android: Compiles Rust for 3 architectures, generates Kotlin bindings, starts emulator, builds APK, installs and launches app
- Linux: Compiles Rust, generates Python bindings, installs dependencies (GTK 4, build tools), builds and launches GTK app
- Web: Compiles Rust to WASM, generates JavaScript bindings, installs npm dependencies, starts Vite dev server
- Windows: Compiles Rust, generates C# bindings with uniffi-bindgen-cs, builds with MSBuild/dotnet, launches WinUI 3 app
3. Use in Native UI
platforms/ios/ContentView.swift:
Button("Refresh") {
greeting = core.greeting()
}
The generated bindings make Rust functions available natively in Swift, Kotlin, C#, Python, and JavaScript.
⚡ Hot Reload
JFFI works seamlessly with native IDE hot reload plus automatic Rust rebuilding.
iOS/macOS Workflow
# Start Rust file watcher
# In Xcode:
# 1. Open platforms/ios/*.xcodeproj in Xcode
# 2. Run the app (Cmd+R)
# 3. Edit Swift files → Xcode hot reloads automatically ⚡
# 4. Edit Rust files → Watcher rebuilds dylib → Press Cmd+B in Xcode
Android Workflow
# Start Rust file watcher + Android Studio
# In Android Studio:
# 1. Press ▶️ to run the app
# 2. Edit Kotlin files → Compose hot reloads automatically ⚡
# 3. Edit Rust files → Watcher rebuilds .so → Rebuild in Android Studio
Linux Workflow
# Start Rust file watcher
# The app will auto-restart when Rust code changes
# 1. Edit Python/GTK files → Save and re-run
# 2. Edit Rust files → Watcher rebuilds .so → App auto-restarts ⚡
Web Workflow
# Start Rust file watcher + Vite dev server
# Vite provides hot reload for JS/CSS changes
# 1. Edit HTML/JS/CSS → Vite hot reloads instantly ⚡
# 2. Edit Rust files → Watcher rebuilds WASM → Refresh browser
How It Works
Native UI Changes:
- iOS/macOS: Edit
.swiftfiles → Xcode hot reloads instantly - Android: Edit
.ktfiles → Compose hot reloads automatically - Web: Edit
.js/.cssfiles → Vite hot reloads instantly - Use native IDE features (SwiftUI previews, Compose previews, etc.)
- Full debugging support
Rust Changes:
- Edit any
.rsfile incore/orffi/ - File watcher rebuilds Rust library automatically
- Rebuild in native IDE to use new Rust code
- App updates with new business logic
Best of Both Worlds
✅ Native IDE experience - Use all platform IDE features ✅ Native UI previews - SwiftUI/Compose previews work ✅ Native hot reload - Instant UI updates ✅ Rust auto-rebuild - No manual cargo commands ✅ Full debugging - Native debuggers work normally
CLI Commands
# Create new project
# Build for platform
# Run on platform (builds automatically)
# Development mode (auto-rebuild on changes)
# Add platform to existing project
# Remove platform from existing project
# List available platforms
How It Works
┌─────────────────────────────────────────┐
│ Your Rust Business Logic │
│ (core/src/lib.rs) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ UniFFI FFI Layer │
│ (ffi/src/lib.rs) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Auto-Generated Bindings │
│ (Swift, Kotlin, C#, etc.) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Native Platform UI │
│ (SwiftUI, Compose, WinUI, etc.) │
└─────────────────────────────────────────┘
Configuration
jffi.toml:
[]
= "my-app"
= "0.1.0"
[]
= ["ios"]
[]
= "16.0"
= "com.example.myapp"
Why JFFI?
| Feature | JFFI | Flutter | React Native |
|---|---|---|---|
| Business Logic | Rust | Dart | JavaScript |
| UI | Native | Cross-platform | Near-native |
| Performance | Native | Good | Good |
| Platform Feel | Native | Consistent | Near-native |
| Type Safety | End-to-end | Strong | Weak |
Use JFFI when:
- You want truly native UI and performance
- You have platform-specific design requirements
- You want to leverage native UI libraries
- You need Rust for business logic (performance, safety)
🛠️ Development
Prerequisites
- Rust toolchain
- iOS: Xcode, iOS Simulator
- Android: Android Studio, Android SDK, Android Emulator (auto-configured)
- macOS: Xcode
- Linux: GTK 4, Libadwaita, Python 3 (auto-installed by setup script)
- Web: Node.js, npm (for Vite dev server)
- Windows: .NET SDK 8.0+, Visual Studio Build Tools or MSBuild
Building the CLI
Roadmap
- CLI tool foundation
- iOS support with SwiftUI
- macOS support with SwiftUI
- Android support with Jetpack Compose
- Linux support with GTK 4 + Python
- Web support with Vanilla JS + WASM
- Windows support with WinUI 3 + C#
- Automatic Xcode project generation
- Automatic Android project generation
- One-command build and run (iOS, macOS, Android, Linux, Windows)
- Hot reload for iOS (Xcode-native workflow)
- Hot reload for Android (Android Studio-native workflow)
- Hot reload for Linux (auto-restart workflow)
- Hot reload for Web (Vite hot reload)
- Automatic emulator/simulator management
- Auto-install build dependencies (targets, NDK, GTK, WASM, wasm-bindgen, uniffi-bindgen-cs, etc.)
🤝 Contributing
Early-stage framework. Contributions welcome!
High priority:
- Additional platform features and improvements
- State persistence (SQLite/local storage)
- Advanced UI components and patterns
- Hot reload for Windows (file watcher workflow)
📄 License
MIT
Acknowledgments
- UniFFI - FFI bindings generator
- The Rust community
Built with and Rust