Skip to main content
Despia ships native features continuously. RevenueCat, OneSignal, AppsFlyer, GPS, HealthKit, Storage Vault, biometrics, local media, widgets — the platform covers the capabilities most production apps need. But some problems are narrower than that. A fitness app integrating with a Chinese OEM watch via an SDK used by a few hundred developers worldwide. A medical device company wrapping a proprietary Bluetooth protocol into a patient-facing app. A logistics platform connecting to hardware scanners with a vendor SDK that ships as a closed Swift Package. These are real technical problems. Despia cannot anticipate all of them, and it does not try to. The plugin ecosystem exists for exactly these cases. It is the same architecture Despia uses for every built-in feature, a URL scheme intercepted by Swift and Kotlin handlers, results written back to the web layer, opened up so advanced developers can wrap any SDK into the platform themselves. When a native developer publishes an extension, the integration becomes available to every Despia app through the same single call pattern used for every other feature on the platform.
No new API to learn per integration. No context switching between SDK documentation systems. The platform is the API.
The plugin ecosystem is in active development. If you want early access or want to publish an extension, reach out at extensions@despia.com.

How it works

An extension is a Swift Package containing two files you write and one JSON spec you declare. Everything else, URL routing, param validation, config forms in the dashboard, Package.swift generation, thread safety, is handled by the Despia runtime.
Your Swift file contains only the native SDK call:
Your Java file mirrors it exactly:
Your web layer calls it the same way it calls every other Despia feature:

The Swift and Java interface

Both platforms share the same call interface. DespiaExtensionCall is the only type you interact with, it gives you typed param accessors, dashboard config values, and the two ways to send data back to your web layer. Reading params and config:
Sending results back:
The Java side is identical, call.resolve(), call.emit(), call.reject(), with the same semantics on both platforms. Write your SDK logic once per platform. Everything else is handled.
The DespiaExtension API is in active QA and subject to change over the coming weeks and possibly months. Method names, param shapes, and registration patterns may be revised before the public release. If you are building an extension in early access, expect to update your code as the spec stabilises.

Third-party Swift packages and Android libraries

Declare your native SDK dependencies in despia-extension.json. Despia generates Package.swift and build.gradle from them, you never write either file.
Despia generates the full SPM manifest and Gradle dependency block from this. When a developer imports your extension from the dashboard, those packages are pulled in automatically. They install an extension, not a build system.

Real example: OEM Bluetooth device integration

BLE is one of the hardest things to get right on both iOS and Android. With DespiaExtension you declare the scheme, write the CoreBluetooth and Android BLE calls, and your web app talks to the hardware with a single despia() call.
From the web layer, the hardware is just a function call:
CoreBluetooth and Android BLE are among the most platform-specific APIs in mobile. Both require native delegates, background threading, and careful state management. An extension author writes that once. Every web developer using Despia gets hardware access with a few lines of JavaScript.

What the runtime eliminates

Native SDK integration has a fixed cost: URL routing, param decoding, thread management, config forms, package manifests, scheme conflict detection. The same boilerplate, rewritten for every integration, on every platform. DespiaExtension handles all of it. You write the SDK call. The rest is the runtime’s job.

What ships at launch

The extension system exposes the same architecture used by every built-in Despia feature. First-party extensions in development include camera and media picker, QuickLook document preview, and native contacts access. Third-party extensions are importable directly from the Despia dashboard by URL, no build tooling, no Xcode, no Android Studio required on the app developer’s end.

For developers solving hard problems

Despia continues to ship built-in native features. The extension system is not a replacement for that. It is the answer to the long tail of technical problems the platform cannot anticipate. If you are building something that requires a proprietary hardware SDK, a niche vendor integration, or a platform capability that simply does not exist in any general-purpose mobile tool, this is the right foundation. Write the native code once in Swift and Java. Every developer using Despia gets access through the same await despia() call they already know. If you are evaluating Despia for a production project and want to understand how a specific integration would work, reach out directly.

NPM Package

despia-native