Plugin support matrix#
Each runtime plugin is its own crate, named leptoskit_plugin_<name>. The tables below say which part of each capability is implemented today and on which platforms. Every plugin is a partial port: it covers the subset named in its row, not every method of the Expo or Tauri module it is modelled on. A cell describes an implemented code path, not a promise that every device, OS version, or permission policy has been verified. Each crate's README and its Cargo runtime metadata define the exact operations.
To use a plugin in an app, see runtime plugins and automatic plugin registration.
The platform cells use four words:
- Auto: add the crate as a dependency of the platform's host package and list its name in
native.plugins. The generated host registers it for you. - Direct: the host or the browser calls the plugin's Rust API itself. The Wasm guest cannot reach it through the bridge.
- Manual: the host has to construct the handler with explicit configuration and register it.
- Unavailable: the platform has no implementation, even if a stub handler compiles.
Identity, system state and interaction#
| Crate | Implemented subset | iOS / Android | macOS | Windows / Linux | Browser | Remaining scope |
|---|---|---|---|---|---|---|
os | Host compilation platform and architecture | Auto Rust | Auto Rust | Direct/manual Rust | Direct reports web/wasm32 | OS release/version and broader OS information |
crypto | SHA-256/SHA-512, up to 64 KiB of cryptographic random bytes and UUID v4 | Auto Rust worker | Auto Rust worker | Direct/manual Rust | Direct hashes; randomness/UUIDs require web feature | Encryption, key storage and other digest algorithms |
application | App ID, display name, release version and build number | Auto native package metadata | Auto bundle metadata | Explicit host-provided snapshot | Explicit app-provided snapshot only | Install identifiers/dates, referrer and store environment |
device | OS/version, architecture, memory and platform-dependent manufacturer/model/kind/simulator hints | Auto; unavailable fields remain unknown | Auto Swift; direct Rust subset | Direct/manual Rust OS/architecture/RAM subset | Low-entropy platform hint only | Root/sideload/heap/CPU feature APIs; no stable device ID |
localization | Preferred locales, calendar/timezone, weekday and clock preference where exposed | Auto | Auto Foundation; direct Rust subset | Direct/manual locales/timezone only | Direct Navigator/Intl subset | Change events, direction, separators, currencies and measurement preferences |
clipboard | Read/write/clear text | Auto | Auto Swift; direct Rust | Direct/manual Rust | Direct Clipboard API; clear writes empty text | Images, rich content and listeners |
haptics | Selection, impact and notification feedback; Android-specific constants | Auto | Auto trackpad patterns | Unavailable | Direct vibration adaptation | Physical feedback depends on hardware/policy; no equivalence between effects |
battery | Charge/state/power-saving snapshot, wait for change, Android optimization-policy query | Auto; one change waiter | Auto IOKit notifications | Direct enumeration/polling; manual bridge snapshot only | Direct Battery Status API snapshot/wait when available | Desktop/browser power-saving policy unknown; desktop polling is not native notifications |
network | Connectivity hints and demand-driven latest-state changes | Auto; Android additionally exposes OS validation | Auto NWPathMonitor | Direct interfaces; manual bridge snapshot only | Direct online/NetworkInformation hints and waits | Airplane mode, SSID/MAC, local-IP RPC; connectivity does not prove server reachability |
posture | Fold state, hinge regions and angles, demand-driven latest-state changes | Auto; iOS 27.1 hinge interaction, Android WindowManager and hinge sensor | Unavailable | Unavailable | Direct Device Posture and Viewport Segments, no angles | Per-hinge Android angles on multi-hinge devices; HarmonyOS (ArkTS) not yet checked on a device |
linking | Validated outbound HTTP(S), mail, telephone and SMS links | Auto open/can-open/app settings | Auto open/can-open; direct opener | Direct/manual open only | Direct user-gesture window.open | Inbound cold/warm links, associations, arbitrary custom schemes and opening/revealing files |
passkeys | WebAuthn passkey creation and sign-in with WebAuthn's JSON, user verification required; Sign in with Apple ID tokens | Auto; iOS ASAuthorization, Android Credential Manager; Sign in with Apple on iOS only | Auto ASAuthorization | Unavailable | Unavailable; the sign-in client uses navigator.credentials | Passkey autofill in native text fields, security keys, attestation, Windows Hello and Linux |
web_auth | System-browser sign-in sessions that come back to a private-use scheme or a loopback address | Auto; iOS ASWebAuthenticationSession, Android Auth Tab (Chrome 137 or later) | Auto ASWebAuthenticationSession | Direct/manual loopback in the default browser | Unavailable; the page navigates itself | Claimed https callbacks, a Custom Tabs fallback for browsers without Auth Tab, ephemeral sessions |
permissions | Camera/microphone status and request | Auto; Activity broker on Android | Auto AVFoundation; purpose strings/entitlements required | Unavailable | Direct Permissions API and temporary getUserMedia with cleanup | Other permission families, media capture and uniform permanent-denial detection |
brightness | Get/set temporary brightness and restore original setting | Auto; iOS screen, Android activity window | Unavailable | Unavailable | Unavailable | Persistent settings, adaptive mode and brightness change events |
keep_awake | Owned display-idle inhibition until cancellation/drop | Auto pending lease; background cleanup | Auto Swift; direct Rust lease | Direct Rust lease | Direct Screen Wake Lock holding future | Background execution is not granted; OS/browser policy may revoke a lease |
speech | Voice discovery, speak-until-finished, stop and owned-active status | Auto | Auto AVSpeechSynthesizer | Unavailable | Direct speechSynthesis | Pause/resume, word boundaries, audio-session configuration; engine completion is not audible-output proof |
screen_orientation | Presented-interface snapshot and cancellable orientation policy lease | Auto owning scene / Activity | Unavailable | Unavailable | Direct Screen Orientation API where supported | Change events; policy acceptance and physical rotation are not guaranteed |
Foreground services#
| Crate | Implemented subset | iOS / Android | macOS | Windows / Linux | Browser | Remaining scope |
|---|---|---|---|---|---|---|
local_authentication | Capability query and one cancellable local authentication prompt; explicit biometric or device-credential policy | Auto LocalAuthentication / Android API 30+ strong biometrics | Auto LocalAuthentication | Unavailable | Unavailable | Biometric-gated key operations, enrollment monitoring and physical-device success verification; not account/server authentication |
location | Permission query/request, bounded current fix and demand-driven wait for a strictly newer fix | Auto CoreLocation / LocationManager | Auto CoreLocation | Unavailable | Direct Geolocation | Background tracking, geofencing, heading and lossless route recording |
notifications | Immediate local post, permission query/request and owned cancellation; Android channel configuration | Auto UserNotifications / Android API 26+ | Auto UserNotifications | Windows unavailable; Linux direct session D-Bus client | Direct Notification API where supported | Scheduling, actions/click callbacks, badges, attachments, push registration and Windows backend |
Authentication and location require app-owned Apple purpose strings where applicable. Android location and notification permission requests use the host's Activity permission broker; declaring manifest permissions alone does not grant access. Location stops pending acquisition on cancellation, close or native backgrounding. A browser read checks permission first, but revocation between that check and acquisition can still cause a prompt.
Notification acceptance does not prove that a visible banner appeared. Apple foreground presentation belongs to the host's notification delegate. Browser notifications require the browser's secure-context and user-gesture policy; service-worker-only delivery is outside this port.
Sharing and platform consent#
| Crate | Implemented subset | iOS / Android | macOS | Windows / Linux | Browser | Remaining scope |
|---|---|---|---|---|---|---|
sharing | Share one bounded text value or HTTP(S) URL through a user-selected destination | Auto activity UI / system chooser | Auto sharing picker | Unavailable | Direct Web Share with secure context and user activation | File sharing, incoming extensions and delivery confirmation; Android dismissal is indistinguishable from selection |
store_review | Owned-context readiness and explicit in-app review request acceptance | Auto StoreKit / Google Play | Auto StoreKit | Unavailable | Unavailable | Store eligibility, actual prompt presentation and review outcome are intentionally not reported; store URL opening is separate |
tracking_transparency | Current ATT status and explicit authorization request | Auto iOS ATT; Android unavailable | Unavailable | Unavailable | Unavailable | Advertising-ID access, tracking collection and platform-specific consent flows outside iOS ATT |
Runtime names are sharing, store-review and tracking-transparency. Review and sharing completion acknowledge only what the platform exposes. Caller cancellation cannot dismiss every OS flow or retract shared content; adapters retain exclusive ownership until terminal callbacks where necessary. ATT retains one process-wide request until Apple's completion, even after caller cancellation or scene backgrounding.
Tracking requires an app-owned NSUserTrackingUsageDescription; the CLI checks declared required keys before preparing iOS hosts. Google Play review contributes a validated, pinned Maven dependency to generated Android builds. Automated tests use injected Apple providers, controlled Google Play tasks and synthetic sharing content; they do not show real consent, review or sharing prompts.
Storage and networking#
| Crate | Implemented subset | iOS / Android | macOS | Windows / Linux | Browser | Remaining scope |
|---|---|---|---|---|---|---|
secure_store | Get/set/delete binary secrets up to 2 KiB | Auto Keychain / Keystore AES-GCM files | Auto Swift Keychain; manual Rust Keychain | Manual Credential Manager / Secret Service | Unavailable | Biometrics, access groups, configurable accessibility, enumeration; not Stronghold |
filesystem | Private read/write/list/mkdir/remove/stat/rename; bounded files and directory capabilities | Auto Rust worker | Auto Rust worker | Direct/manual Rust | Direct OPFS; file rename requires browser support | User-selected/external files, watchers, downloads, recursive deletion and large-file streaming |
document_picker | Import one ordinary file, bounded to 4 MiB with transient access and cancellation | Auto owning controller / Activity result broker | Auto owning window; direct parent API | Direct parent-window API | Direct trusted-action file input | Directories, export, multiple files, MIME filters, persistent grants and desktop guest adapters |
store | JSON settings, staged edits, explicit save/load, atomic ordered batches | Auto Rust worker | Auto Rust worker | Direct/manual Rust | Direct localStorage | Cross-process isolation, autosave/change streams; not encrypted |
sqlite | Parameterized writes, bounded read-only queries and atomic transaction batches | Auto bundled SQLite worker | Auto bundled SQLite worker | Direct/manual bundled SQLite | Types/codecs only; no backend | Browser SQLite/OPFS worker, FTS/virtual tables, encryption, import/export and subscriptions |
logging | Structured records, severity filtering, bounded JSONL rotation, explicit flush/close and exclusive writer ownership | Auto Rust worker | Auto Rust worker | Direct/manual Rust | Direct structured console | OSLog/Logcat integration, remote sinks, automatic redaction and browser persistence |
http | Allowed-origin async requests, bounded binary bodies/headers, deadlines and cancellation | Auto async factory; explicit origins | Auto async factory; explicit origins | Direct/manual Rust async handler | Direct fetch; CORS still applies | Streaming-to-caller API, redirects and upload/progress APIs |
websocket | Scoped guest connection handles, bounded send/receive/close, backpressure and provisional reply ownership | Auto async factory; explicit origins | Auto async factory; explicit origins | Direct/manual Rust async handler | Direct WebSocket | Reconnect policy, browser custom headers and TLS/client-certificate customization |
Settings, SQLite and logging defer disk I/O until worker dispatch. Filesystem registration establishes its directory capability synchronously; subsequent file operations run on its worker. Cancellation discards their reply but cannot promise rollback of an already-started operation. Native private files default to a 64 MiB aggregate payload quota and 4096 file/directory entries, alongside a 1 MiB operation limit. Native SQLite defaults to a 64 MiB page quota and 1 MiB requests/results, and stops a statement whose working memory grows by more than 64 MiB. Temporary tables, views, indexes and triggers are refused because they would live in memory outside the page quota. Secure storage shares a 2560-byte encrypted record across at most 64 secrets, including names and framing; old per-key credentials remain readable and move into that budget when rewritten. Trusted hosts can configure these budgets. Quota exhaustion returns TooLarge; deletion frees capacity. Leave disk headroom for atomic file replacement and SQLite rollback journals. Settings documents remain bounded to 512 KiB. Logging defaults to four files of 1 MiB each, including the current file. Its files are guarded by exclusive advisory locks. Secure storage never substitutes plaintext files or browser storage for an unavailable credential service.
HTTP/WebSocket host factories require exact origins in native.plugin-options; no wildcard or implicit scope is granted. Origin policy covers every path and is not an IP firewall. Guest dependencies disable default browser features and enable guest; the CLI adds async-host only to native builds. HTTP returns ordinary error status codes as responses. WebSocket cancellation, unread open replies, revocation and shutdown retain ownership until resources are released. Browser policy and transport allocations still impose limits beyond the binary bridge.
Sensors and desktop host services#
| Crate | Implemented subset | iOS / Android | macOS | Windows / Linux | Browser | Remaining scope |
|---|---|---|---|---|---|---|
accelerometer | Availability and one fresh timestamped sample including gravity, in m/s² | Auto CoreMotion/SensorManager | Unavailable | Unavailable | Direct Generic Sensor/DeviceMotion | Lossless recording, batching and physical-device coverage |
gyroscope | Availability and one fresh angular-velocity sample, in rad/s | Auto CoreMotion/SensorManager | Unavailable | Unavailable | Direct Generic Sensor/DeviceMotion | Fusion/orientation and lossless recording |
magnetometer | Availability and one fresh field sample, in µT | Auto CoreMotion/SensorManager | Unavailable | Unavailable | Direct Generic Sensor when available | Explicit calibrated/uncalibrated modes and compass heading |
barometer | Availability and one fresh pressure sample, in hPa | Auto CoreMotion/SensorManager | Unavailable | Unavailable | Unavailable | Relative altitude and continuous recording |
light_sensor | Availability and one fresh ambient-illuminance sample, in lux | iOS unavailable; Android auto SensorManager | Unavailable | Unavailable | Direct AmbientLightSensor where supported | Physical-device accuracy and broader browser availability; brightness is not illumination |
pedometer | Permission query/request and one bounded step observation; iOS history within past seven days | Auto CoreMotion / Android step counter | Unavailable | Unavailable | Unavailable | Android history, lossless daily totals and physical-device validation |
dialog | Async file/directory/save/message dialogs | Unavailable | Direct parent-window API | Direct parent-window API; Linux portal/Zenity requirements | Direct bounded open-file selection only | Guest adapter; mobile document providers; browser save/directory/message dialogs |
autostart | Enable/disable/query exact host-owned startup entry | Unavailable | Manual LaunchAgent configuration | Manual Windows Run / XDG configuration | Unavailable | Packaged login verification, OS startup-policy state; no automatic constructor |
single_instance | Process-lifetime OS lock with retained guard | Unavailable | Direct host startup guard | Direct host startup guard | Unavailable | Second-launch arguments, activation/focus handoff; no guest methods |
menu | Bounded command/check/submenu definitions, accelerators, enabled/checked/label updates and bounded activation events | Unavailable; definition validation only | Direct application-menu lease on the UI thread | Direct Windows HWND menu lease and accelerators; Linux snapshot menus for the tray only | Unavailable; definition validation only | Standard roles, radio groups, icons, context-menu presentation and Linux menu bars; no guest methods |
tray | Owned tray icons with validated RGBA images, tooltips/titles, optional menus and bounded coalesced events | Unavailable | Direct host-installed owner, up to 16 icons | Direct Windows owner, up to 16 icons; Linux KSNI, one icon | Unavailable | Running Windows/Linux StatusNotifier verification, balloon/notification APIs; no guest methods |
arguments | Native argument snapshot, typed clap parsing and explicitly disclosed UTF-8 guest snapshot | OS capture unavailable | Direct capture/parse; manual guest handler | Direct capture/parse; manual guest handler | Explicit snapshots/parsing only | Activation delivery; native non-UTF-8 values cannot cross the guest string contract |
shell | Scoped asynchronous execution, bounded binary output, deadlines, cancellation and process-container cleanup | Unavailable | Direct host API; Unix process groups | Direct host API; Unix process groups / Windows Job Objects | Unavailable | Automatic guest integration, interactive stdin, streaming output and containment of Unix commands that leave their group |
global_shortcut | Owned shortcut registration, conflict errors, unregister/drop cleanup and bounded event polling | Unavailable | Manual main-thread/event-loop host | Manual Windows message loop / Linux X11; Wayland unavailable | Unavailable | Generated event-loop integration and Wayland backend |
window_state | Validated portable placement; exact owned-window capture/restore on macOS | Portable geometry only | Direct AppKit window adapter | Portable geometry only | Portable geometry only | Native adapters beyond macOS, fullscreen lifecycle, host persistence and guest API |
The six sensor crates share leptoskit_sensor acquisition/codecs without merging their capability boundaries. Live sample requests stop acquisition on completion, cancellation, close or native backgrounding; one request per sensor may wait at a time. Browser permissions and iOS purpose strings remain necessary. Simulators and API availability checks do not establish physical sensor accuracy.
Pedometer keeps iOS interval counts distinct from Android cumulative boot counters; neither repeated observations nor a hardware availability check imply a complete daily total. Its iOS historical query cannot be cancelled at the OS level, so a timed-out caller releases its result but the plugin retains its Busy slot until the native callback returns. The application must explicitly supply NSMotionUsageDescription and Android ACTIVITY_RECOGNITION; automated fixtures do not request real activity access or read history.
Document import uses transient file access, bounded off-UI-thread reads and shared Rust reply storage. Native picker UI and user documents are outside automated synthetic tests. Orientation operates on the owning scene/activity, releases its policy on lifecycle changes and reports the presented interface separately from the requested policy. A pending lease is not proof of rotation; Android large-screen and Apple multitasking policy may override it.
Desktop services keep application ownership explicit. Arguments require the host to select disclosed values; shortcuts require a live platform event loop; window state requires an owned window and application persistence. Shell construction starts no process and fixes executable, argument policy, working directory, environment and limits. On macOS and Linux, each invocation owns a process group; on Windows, it owns a Job Object assigned before execution starts. Normal exit, limits, cancellation and shutdown terminate the container and wait for cleanup before returning capacity. The host must keep its async runtime alive through cleanup. Failed or interrupted cleanup retains the capacity slot. On Windows, an unobserved short-lived descendant can make cleanup uncertain and retain that slot. Unix commands that deliberately create a different process group or session require containment by the host, such as a Linux cgroup. These APIs do not acquire automatic registration merely by enabling guest.