Skip to content

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#

CrateImplemented subsetiOS / AndroidmacOSWindows / LinuxBrowserRemaining scope
osHost compilation platform and architectureAuto RustAuto RustDirect/manual RustDirect reports web/wasm32OS release/version and broader OS information
cryptoSHA-256/SHA-512, up to 64 KiB of cryptographic random bytes and UUID v4Auto Rust workerAuto Rust workerDirect/manual RustDirect hashes; randomness/UUIDs require web featureEncryption, key storage and other digest algorithms
applicationApp ID, display name, release version and build numberAuto native package metadataAuto bundle metadataExplicit host-provided snapshotExplicit app-provided snapshot onlyInstall identifiers/dates, referrer and store environment
deviceOS/version, architecture, memory and platform-dependent manufacturer/model/kind/simulator hintsAuto; unavailable fields remain unknownAuto Swift; direct Rust subsetDirect/manual Rust OS/architecture/RAM subsetLow-entropy platform hint onlyRoot/sideload/heap/CPU feature APIs; no stable device ID
localizationPreferred locales, calendar/timezone, weekday and clock preference where exposedAutoAuto Foundation; direct Rust subsetDirect/manual locales/timezone onlyDirect Navigator/Intl subsetChange events, direction, separators, currencies and measurement preferences
clipboardRead/write/clear textAutoAuto Swift; direct RustDirect/manual RustDirect Clipboard API; clear writes empty textImages, rich content and listeners
hapticsSelection, impact and notification feedback; Android-specific constantsAutoAuto trackpad patternsUnavailableDirect vibration adaptationPhysical feedback depends on hardware/policy; no equivalence between effects
batteryCharge/state/power-saving snapshot, wait for change, Android optimization-policy queryAuto; one change waiterAuto IOKit notificationsDirect enumeration/polling; manual bridge snapshot onlyDirect Battery Status API snapshot/wait when availableDesktop/browser power-saving policy unknown; desktop polling is not native notifications
networkConnectivity hints and demand-driven latest-state changesAuto; Android additionally exposes OS validationAuto NWPathMonitorDirect interfaces; manual bridge snapshot onlyDirect online/NetworkInformation hints and waitsAirplane mode, SSID/MAC, local-IP RPC; connectivity does not prove server reachability
postureFold state, hinge regions and angles, demand-driven latest-state changesAuto; iOS 27.1 hinge interaction, Android WindowManager and hinge sensorUnavailableUnavailableDirect Device Posture and Viewport Segments, no anglesPer-hinge Android angles on multi-hinge devices; HarmonyOS (ArkTS) not yet checked on a device
linkingValidated outbound HTTP(S), mail, telephone and SMS linksAuto open/can-open/app settingsAuto open/can-open; direct openerDirect/manual open onlyDirect user-gesture window.openInbound cold/warm links, associations, arbitrary custom schemes and opening/revealing files
passkeysWebAuthn passkey creation and sign-in with WebAuthn's JSON, user verification required; Sign in with Apple ID tokensAuto; iOS ASAuthorization, Android Credential Manager; Sign in with Apple on iOS onlyAuto ASAuthorizationUnavailableUnavailable; the sign-in client uses navigator.credentialsPasskey autofill in native text fields, security keys, attestation, Windows Hello and Linux
web_authSystem-browser sign-in sessions that come back to a private-use scheme or a loopback addressAuto; iOS ASWebAuthenticationSession, Android Auth Tab (Chrome 137 or later)Auto ASWebAuthenticationSessionDirect/manual loopback in the default browserUnavailable; the page navigates itselfClaimed https callbacks, a Custom Tabs fallback for browsers without Auth Tab, ephemeral sessions
permissionsCamera/microphone status and requestAuto; Activity broker on AndroidAuto AVFoundation; purpose strings/entitlements requiredUnavailableDirect Permissions API and temporary getUserMedia with cleanupOther permission families, media capture and uniform permanent-denial detection
brightnessGet/set temporary brightness and restore original settingAuto; iOS screen, Android activity windowUnavailableUnavailableUnavailablePersistent settings, adaptive mode and brightness change events
keep_awakeOwned display-idle inhibition until cancellation/dropAuto pending lease; background cleanupAuto Swift; direct Rust leaseDirect Rust leaseDirect Screen Wake Lock holding futureBackground execution is not granted; OS/browser policy may revoke a lease
speechVoice discovery, speak-until-finished, stop and owned-active statusAutoAuto AVSpeechSynthesizerUnavailableDirect speechSynthesisPause/resume, word boundaries, audio-session configuration; engine completion is not audible-output proof
screen_orientationPresented-interface snapshot and cancellable orientation policy leaseAuto owning scene / ActivityUnavailableUnavailableDirect Screen Orientation API where supportedChange events; policy acceptance and physical rotation are not guaranteed

Foreground services#

CrateImplemented subsetiOS / AndroidmacOSWindows / LinuxBrowserRemaining scope
local_authenticationCapability query and one cancellable local authentication prompt; explicit biometric or device-credential policyAuto LocalAuthentication / Android API 30+ strong biometricsAuto LocalAuthenticationUnavailableUnavailableBiometric-gated key operations, enrollment monitoring and physical-device success verification; not account/server authentication
locationPermission query/request, bounded current fix and demand-driven wait for a strictly newer fixAuto CoreLocation / LocationManagerAuto CoreLocationUnavailableDirect GeolocationBackground tracking, geofencing, heading and lossless route recording
notificationsImmediate local post, permission query/request and owned cancellation; Android channel configurationAuto UserNotifications / Android API 26+Auto UserNotificationsWindows unavailable; Linux direct session D-Bus clientDirect Notification API where supportedScheduling, 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.

CrateImplemented subsetiOS / AndroidmacOSWindows / LinuxBrowserRemaining scope
sharingShare one bounded text value or HTTP(S) URL through a user-selected destinationAuto activity UI / system chooserAuto sharing pickerUnavailableDirect Web Share with secure context and user activationFile sharing, incoming extensions and delivery confirmation; Android dismissal is indistinguishable from selection
store_reviewOwned-context readiness and explicit in-app review request acceptanceAuto StoreKit / Google PlayAuto StoreKitUnavailableUnavailableStore eligibility, actual prompt presentation and review outcome are intentionally not reported; store URL opening is separate
tracking_transparencyCurrent ATT status and explicit authorization requestAuto iOS ATT; Android unavailableUnavailableUnavailableUnavailableAdvertising-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#

CrateImplemented subsetiOS / AndroidmacOSWindows / LinuxBrowserRemaining scope
secure_storeGet/set/delete binary secrets up to 2 KiBAuto Keychain / Keystore AES-GCM filesAuto Swift Keychain; manual Rust KeychainManual Credential Manager / Secret ServiceUnavailableBiometrics, access groups, configurable accessibility, enumeration; not Stronghold
filesystemPrivate read/write/list/mkdir/remove/stat/rename; bounded files and directory capabilitiesAuto Rust workerAuto Rust workerDirect/manual RustDirect OPFS; file rename requires browser supportUser-selected/external files, watchers, downloads, recursive deletion and large-file streaming
document_pickerImport one ordinary file, bounded to 4 MiB with transient access and cancellationAuto owning controller / Activity result brokerAuto owning window; direct parent APIDirect parent-window APIDirect trusted-action file inputDirectories, export, multiple files, MIME filters, persistent grants and desktop guest adapters
storeJSON settings, staged edits, explicit save/load, atomic ordered batchesAuto Rust workerAuto Rust workerDirect/manual RustDirect localStorageCross-process isolation, autosave/change streams; not encrypted
sqliteParameterized writes, bounded read-only queries and atomic transaction batchesAuto bundled SQLite workerAuto bundled SQLite workerDirect/manual bundled SQLiteTypes/codecs only; no backendBrowser SQLite/OPFS worker, FTS/virtual tables, encryption, import/export and subscriptions
loggingStructured records, severity filtering, bounded JSONL rotation, explicit flush/close and exclusive writer ownershipAuto Rust workerAuto Rust workerDirect/manual RustDirect structured consoleOSLog/Logcat integration, remote sinks, automatic redaction and browser persistence
httpAllowed-origin async requests, bounded binary bodies/headers, deadlines and cancellationAuto async factory; explicit originsAuto async factory; explicit originsDirect/manual Rust async handlerDirect fetch; CORS still appliesStreaming-to-caller API, redirects and upload/progress APIs
websocketScoped guest connection handles, bounded send/receive/close, backpressure and provisional reply ownershipAuto async factory; explicit originsAuto async factory; explicit originsDirect/manual Rust async handlerDirect WebSocketReconnect 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#

CrateImplemented subsetiOS / AndroidmacOSWindows / LinuxBrowserRemaining scope
accelerometerAvailability and one fresh timestamped sample including gravity, in m/s²Auto CoreMotion/SensorManagerUnavailableUnavailableDirect Generic Sensor/DeviceMotionLossless recording, batching and physical-device coverage
gyroscopeAvailability and one fresh angular-velocity sample, in rad/sAuto CoreMotion/SensorManagerUnavailableUnavailableDirect Generic Sensor/DeviceMotionFusion/orientation and lossless recording
magnetometerAvailability and one fresh field sample, in µTAuto CoreMotion/SensorManagerUnavailableUnavailableDirect Generic Sensor when availableExplicit calibrated/uncalibrated modes and compass heading
barometerAvailability and one fresh pressure sample, in hPaAuto CoreMotion/SensorManagerUnavailableUnavailableUnavailableRelative altitude and continuous recording
light_sensorAvailability and one fresh ambient-illuminance sample, in luxiOS unavailable; Android auto SensorManagerUnavailableUnavailableDirect AmbientLightSensor where supportedPhysical-device accuracy and broader browser availability; brightness is not illumination
pedometerPermission query/request and one bounded step observation; iOS history within past seven daysAuto CoreMotion / Android step counterUnavailableUnavailableUnavailableAndroid history, lossless daily totals and physical-device validation
dialogAsync file/directory/save/message dialogsUnavailableDirect parent-window APIDirect parent-window API; Linux portal/Zenity requirementsDirect bounded open-file selection onlyGuest adapter; mobile document providers; browser save/directory/message dialogs
autostartEnable/disable/query exact host-owned startup entryUnavailableManual LaunchAgent configurationManual Windows Run / XDG configurationUnavailablePackaged login verification, OS startup-policy state; no automatic constructor
single_instanceProcess-lifetime OS lock with retained guardUnavailableDirect host startup guardDirect host startup guardUnavailableSecond-launch arguments, activation/focus handoff; no guest methods
menuBounded command/check/submenu definitions, accelerators, enabled/checked/label updates and bounded activation eventsUnavailable; definition validation onlyDirect application-menu lease on the UI threadDirect Windows HWND menu lease and accelerators; Linux snapshot menus for the tray onlyUnavailable; definition validation onlyStandard roles, radio groups, icons, context-menu presentation and Linux menu bars; no guest methods
trayOwned tray icons with validated RGBA images, tooltips/titles, optional menus and bounded coalesced eventsUnavailableDirect host-installed owner, up to 16 iconsDirect Windows owner, up to 16 icons; Linux KSNI, one iconUnavailableRunning Windows/Linux StatusNotifier verification, balloon/notification APIs; no guest methods
argumentsNative argument snapshot, typed clap parsing and explicitly disclosed UTF-8 guest snapshotOS capture unavailableDirect capture/parse; manual guest handlerDirect capture/parse; manual guest handlerExplicit snapshots/parsing onlyActivation delivery; native non-UTF-8 values cannot cross the guest string contract
shellScoped asynchronous execution, bounded binary output, deadlines, cancellation and process-container cleanupUnavailableDirect host API; Unix process groupsDirect host API; Unix process groups / Windows Job ObjectsUnavailableAutomatic guest integration, interactive stdin, streaming output and containment of Unix commands that leave their group
global_shortcutOwned shortcut registration, conflict errors, unregister/drop cleanup and bounded event pollingUnavailableManual main-thread/event-loop hostManual Windows message loop / Linux X11; Wayland unavailableUnavailableGenerated event-loop integration and Wayland backend
window_stateValidated portable placement; exact owned-window capture/restore on macOSPortable geometry onlyDirect AppKit window adapterPortable geometry onlyPortable geometry onlyNative 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.

esc