Write for the Web. Ship Native.

Jasonelle wraps your web application into a native iOS and Android app. Keep the web technologies you already know and ship a real native app, with a bidirectional JavaScript-to-native bridge.

// your web app calls native features
const device = await window.jasonelle.plugins.device.info();
console.log(device.platform);  // "ios" | "android"

// native pushes an event back into your app
window.jasonelle.plugins.hello.handle = ({ event, ...payload }) => {
  if (event === "ContentView.onAppear") cart.refresh(payload);
});
Why Jasonelle

Your Web App Is Already the App

Your frontend runs inside a native container connected to the platform through a bridge that goes both ways.

Native on both platforms

A SwiftUI app on WKWebView for iOS and a Kotlin Jetpack Compose app on WebView for Android.

iOS

Bidirectional bridge

JavaScript to native: device APIs, native UI, plugins. Native to JavaScript: code pushes data and events back into your app.

Architecture

Extensible plugins

Native capabilities are plugins. Add the ones your app needs and Jasonelle grows with it, without leaving the web.

Create one

One command to build

task gen assembles a complete, configured Xcode and Android Studio project from the same sources.

The pipeline
The Pipeline

Two Platforms, One Set of Inputs.

lib/common/ is the base layer. Platform directories override or extend it, same path, platform wins. Drop a file in lib/<platform>/sources/ and it replaces the stock file during the build.

After the last step each build/<platform>/ directory holds a complete native project ready to open and build.

Read the architecture
task gen
  • 1
    icon App icons for both platforms from one 1024px PNG
  • 2
    jsonc Merges the cascading config.jsonc and store.jsonc
  • 3
    bundler Bundles TypeScript into a single webview.js
  • 4
    plugins Copies only the plugins you configured
  • 5
    core Assembles the source tree, applying overrides
  • 6
    link Links plugins into the native projects
  • 7
    appconf Sets bundle ID, app name, version and build number
Plugins

Native Capabilities, One Call Away

Every plugin is callable from your web code as window.jasonelle.plugins.<name>.

Device

Device information straight from the platform, iOS and Android.

plugins.device.info()

Apple Sign In

Sign in with Apple through AuthenticationServices, plus a native button. iOS only.

plugins.appleSignIn()

Cookies

Persist web view cookies in the iOS Keychain and Android EncryptedSharedPreferences.

plugins.cookies.save()

OpenTelemetry

Counters and histograms from inside the app, on both platforms.

plugins.opentelemetry.counter()

Hello

The sample plugin. Read it end to end to learn how the bridge works.

plugins.hello.call()

Your own

Subclass the plugin base, declare it in your config and task gen wires it into both projects.

Creating plugins
License

Dual Licensed, Your Choice

Jasonelle is open source under AGPLv3. Add a Jasonelle Key and the MPLv2 license applies.

OPEN SOURCE

AGPLv3

  • Full source and plugin set
  • Build and run in the simulator
  • Full mode available for testing
  • No key required
  • No real device execution
SHIP TO THE STORES

WITH A JASONELLE KEY

MPLv2

  • Real device execution
  • App Store and Play Store builds
  • Device APIs such as GPS in production
  • Every future v4 release
  • Still open source
FAQ

Common Questions, Answered

The short version of everything people ask before they start.

Yes. Jasonelle is dual licensed. Without a license key it is licensed under AGPLv3 and will not execute on real devices, though full mode can be activated for testing.
With a valid key from the store, the MPLv2 license applies and real device execution is allowed. Some features, such as GPS, require real hardware, so purchase a license if you use Jasonelle in your projects.
No. You keep writing the web app you already have. Native access is available: everything the bridge and the plugin system expose is extra capability on top of your existing frontend.
No. v4 is a complete rewrite from scratch, with better docs and better code, and it breaks compatibility with the earlier versions. The v3.0.4 tag is still available for legacy Jasonette and Jasonelle projects, but without official support.
Go 1.26 or newer to build the CLI tools, though prebuilt binaries ship in dist/. For iOS you need the Xcode workspace. For Android, Gradle and the Android SDK with the SDK path in local.properties.
Put a file at the same path in lib/<platform>/sources/ and it replaces the stock file from sources/<platform>/ during the build. Configuration cascades the same way: lib/common/config/ first, platform overrides on top.
Community

Ask, Report, or Just Say Hi

Jasonelle is built in the open. Bugs, patches and wild ideas are all welcome.

Telegram group

For help and general chat. The fastest way to get an answer.

t.me/jasonelle

GitHub

File issues, send pull requests or browse the releases and the decision records behind each choice.

jasonelle/jasonelle

Made by Ninjas.cl

Proudly coded in Chile. Need something more? Ninjas builds web and mobile products for teams.

ninjas.cl