Native clients
Generate thin OS shells that load your deployed Soli app and speak the native bridge — not a second UI rewrite.
For a local offline product with an embedded database, use
soli desktop build instead.
End-to-end recipe
soli generate devices
soli generate app_links \
--android-package net.example.myapp \
--apple-app-id TEAMID.net.example.myapp
soli db:migrate up
soli generate client android --url https://app.example.com \
--package net.example.myapp --scheme myapp
soli generate client android --fcm --url https://app.example.com \
--package net.example.myapp --scheme myapp
soli generate client ios --url https://app.example.com \
--bundle-id net.example.myapp --team-id TEAMID --scheme myapp
<%- csrf_meta_tag() %>
<% user_id = session_get("user_id") %>
<%- native_channel("user:#{str(user_id)}") rescue "" unless user_id.nil? %>
deliver_to_user(user.id, {
"title": "New ping", "body": "Ana replied", "url": "/pings/3"
}, { "apns": apns_options, "fcm": fcm_options })
Generate
soli generate client <platform> [options] [folder]
| Flag | Meaning |
--url | Deployment the WebView loads |
--package / --bundle-id | Android package or iOS bundle id |
--scheme | Custom URL scheme |
--team-id | Apple team (iOS) |
--fcm | Android Gradle + Firebase template |
| Platform | Output | Build |
android | No-Gradle WebView | ./build.sh |
android --fcm | Gradle + Firebase | closed-app FCM tokens → /devices |
ios | XcodeGen + UIKit | APNs token POST to /devices |
linux | GTK + WebKitGTK | cargo build --release |
windows | WebView2 (.NET 8) | build on Windows |
Free vs paid (Apple)
| Capability | Free | Paid |
| Custom scheme, camera, geo, haptics, share, biometrics | ✅ | ✅ |
| APNs, Universal Links, Core NFC | | ✅ entitlements |