Vai al contenuto principale

Web APIs.
Uncapped.

The JavaScript APIs you already know, without the browser's limits. Real push, Face ID, the native camera, from the web code you already have.

Runs in the browser too: automatic fallbacks on every API.

import { getAppo } from '@appolabs/sdk'
const appo = getAppo()
await appo.push.requestPermission()
await appo.biometrics.authenticate('Sign in')

Live from @appolabs/sdk: every call on this page runs today.

Browser vs Appo

What the browser gives you.
What Appo gives you.

Same JavaScript. The difference is what happens when you call it.

Push notifications

In the browser
const reg = await navigator.serviceWorker
.register('/sw.js')
const sub = await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: VAPID_PUBLIC_KEY,
})
// then: a push server, the Web Push
// protocol, and a PWA install on iOS

Service worker, VAPID keys, and on iOS, only after a PWA install.

With Appo
await appo.push.requestPermission()
appo.push.onMessage((msg) => {
render(msg)
})

Delivered with the app closed. Lock screen, badges, sound.

Biometrics

In the browser
const cred = await navigator.credentials.get({
publicKey: {
challenge, // from your server
rpId: 'example.com',
allowCredentials, // registered keys
},
})
// then: verify the assertion server-side

A WebAuthn ceremony with a challenge from your server.

With Appo
const ok = await appo.biometrics
.authenticate('Sign in')

Face ID or Touch ID. One call, one boolean.

Camera

In the browser
const stream = await navigator.mediaDevices
.getUserMedia({ video: true })
// draw to a <canvas>, grab a frame,
// stop every track when done

A video stream in a tab. Capture is on you.

With Appo
const photo = await appo.camera.takePicture()

The native camera. A photo back.

Secure storage

In the browser
localStorage.setItem('token', jwt)
// plaintext, readable by any
// same-origin script, evictable

Plaintext, readable by any same-origin script, evictable.

With Appo
await appo.storage.set('token', jwt)

Keychain on iOS, Keystore on Android. Encrypted.

And in the browser?

The same code runs there too. Every API has an automatic fallback, and you can branch on appo.isNative

JavaScript Bridge

Ten namespaces. One bridge.

Every API awaits like the web APIs you already use, with a native implementation behind it.

appo.push

requestPermission() · getToken() · onMessage(cb)

Notifications that arrive with the app closed.

appo.biometrics

isAvailable() · authenticate(reason)

Face ID and Touch ID with automatic web fallback.

appo.camera

requestPermission() · takePicture()

Opens the system camera, returns a photo.

appo.location

requestPermission() · getCurrentPosition()

Current position with permission handling built in.

appo.haptics

impact(style) · notification(type)

Impact and notification feedback.

appo.storage

get(key) · set(key, value) · delete(key)

Key-value storage, encrypted at rest.

appo.share

open({ title, message, url })

The system share sheet.

appo.network

getStatus() · onChange(cb)

Connection status and change events.

appo.device

getInfo()

Model, OS and app version.

appo.nfc

readTag() · writeTag(records) · onTag(cb)

Read and write NDEF tags.

Publishing

Then we put it in the stores.

The bridge gives your code native reach. Appo handles the part that isn't code.

Native app and signing

iOS and Android apps, certificates and signing managed for you.

Submission and review

Store listings, submission and review handling, on your own developer accounts.

Updates after release

Web and content updates land without resubmitting; native releases when needed.

From the terminal

Create it. Open it.

One command creates the app from your site's URL. No account needed for the trial: the install QR prints right in your terminal.

$ npx @appolabs/appo new --url negozio.it
App created.
█▀▀▀▀▀█ █▀▄▄ █  █▀█▀▀▀▄█  █▀▀▀▀▀█
█ ███ █ ▄▀▀▄▀ ▄▄▄▀ █▄ ▀██ █ ███ █
█ ▀▀▀ █  ▀▄▀█ █  ▄▄▄█▄  █ █ ▀▀▀ █
▀▀▀▀▀▀▀ █▄█ █ █ ▀▄█ █ █▄█ ▀▀▀▀▀▀▀
▀▄▀█ ▀▀█ █  ▀ ▄ █▀▄█▄▀ ▄▄ █▄ █▄▀█
▄ ▀▄▀█▀  █▀█ ▄█▄▄▀▄ █ ▀█▀ ██▀█ █▀
  ██ ▀▀▀▄▀█▀ ▄ ▀▄ █▀ ▄█ ██ ▄▀█▄█
▀██▄▀▄▀▄█▀▄  ▄ ▀█▀▀▄▄█▄  ▄█ ▀▀█
███ █ ▀██ ▀ ▄▄▀█▀▄▀▀▀▀█████ ██▀▄▄
 ▀▀ ▄▀▀▀▄██ ▀▀▄██▀ ▄▀▀▄▄▀▀▄▀█ ▀█
▄█▀▀▀▄▀ █▄ ▀ ███ ▄█ ▀█▄▄▀ ▄▀ █▀▀▄
 ▄ ▀▄▄▀▄  ▀█▄▀▀ █ ▀▄   █  ▀█▄▄ █▀
▀  ▀  ▀▀█▄▀▀▀▄ █▀█ ▄  █ █▀▀▀█▄ ▄
█▀▀▀▀▀█ ██▄█▄▄  ▄  ▀ █▀██ ▀ █▄▄▄
█ ███ █ ▄▀█▀ ▀▀  ▀▄▄█ ▄▀▀▀▀█▀▄▀▀▄
█ ▀▀▀ █ ▀▀ ▀▀ █▄▄▄▄█ ▀  █▀██▄▀  ▄
▀▀▀▀▀▀▀ ▀▀ ▀ ▀▀▀ ▀▀ ▀▀ ▀    ▀ ▀
QR on screen · scan it, the app opens on your phone

The button copies the command.

From your AI editor

Describe the outcome.

One command adds the server to your AI editor (Claude Code, Codex). Your assistant calls Appo's tools: it creates the app, puts the preview on your phone, and takes it to the stores: you review.

$ npx @appolabs/appo mcp

Turn negozio.it into an app

create_app(url: "negozio.it")
App created.

Open it on my phone

preview_app(id: 128)
QR in chat · scan it, the app opens on your phone.

Using Cursor? The .mcp.json config is in the docs.

Bring your stack

0 rewrites
Your code stays the same
Same day
From npm install to native build
10 native APIs
One JavaScript bridge

Works with your stack

Pricing

No rebuild. No surprises.

Start free with your existing site. Upgrade when you publish.

Starter

For those starting out

40/month

120 billed every 3 months

  • iOS and Android apps
  • Store publishing guide
  • 500 push notifications/month
  • Automatic sync
  • Email support
Start free
Most popular

Business

For growing businesses

90/month

270 billed every 3 months

  • Everything in Starter
  • Managed publishing
  • Unlimited push notifications
  • Face ID / Touch ID
  • Advanced analytics
  • Custom branding
  • Priority chat support
Start free

Agency

For teams and agencies

Custom
  • Everything unlimited
  • White-label solution
  • Dedicated account manager
  • Custom SLA
  • SSO and team management
  • On-premise option
Talk to the team

Questions? Answers.

The bridge, the fallbacks, and how publishing works.

Have a technical question? Contact us

Create your first app from your terminal

One command from your terminal, or add the MCP server to your AI editor. No rebuild.

Open-source CLIDevice-auth, no cardMCP for Claude Code, Codex, Cursor