iOS & Android

⚡ VBWD

A sales platform for the digital world — SaaS subscriptions, CMS, shop, booking and a token economy on one self-hosted backend, two Vue front-ends and one plugin contract.

landing1cmsmainchatchattheme-switcheranalytics
Native, not a wrapper

The same platform, now in your pocket

VBWD ships two fully native mobile clients — VBWD for iOS (SwiftUI) and VBWD for Android (Jetpack Compose). Neither is a web-view shell: they are real apps built on a shared SDK that speaks to the same backend and honours the same plugin contract as the two Vue front-ends. A plugin author who knows the web SDK maps to mobile 1:1.

The experience

From sign-in to LLM chat — the whole journey

Sign in, land on a dashboard of token balance, invoices and plugin widgets, read CMS posts in-app, chat in rooms, send tokens to another user with a tap, talk to an LLM bot that answers with tappable choice cards, and manage your profile — all from one app whose every screen is contributed by a plugin.

Sign in
Sign in
Dashboard — tokens, invoices & plugin widgets
Dashboard — tokens, invoices & plugin widgets
Posts — the CMS, rendered in-app
Posts — the CMS, rendered in-app
Chat — rooms & inbox
Chat — rooms & inbox
A conversation
A conversation
Send tokens to another user
Send tokens to another user
Token-transfer receipt in the thread
Token-transfer receipt in the thread
LLM bot — choice cards & cart
LLM bot — choice cards & cart
Profile
Profile
The plugin-driven navigation drawer
The plugin-driven navigation drawer

Screens captured from the live VBWD mobile app (Android build). The iOS app is a 1:1 SwiftUI port that renders the same screens and navigation.

One contract

A plugin is a plugin — on the web and on the phone

The mobile SDK mirrors the web SDK's seams exactly. A plugin's entry point receives a PlatformSDK facade and registers into the app through the same named extension points:

  • RoutesaddRoute(path, view) registers a screen; auth + permission gating is declarative.
  • Menu itemsaddMenuItem(...) drops an entry into the navigation drawer.
  • ComponentsaddComponent(name, view); names prefixed Dashboard* surface as dashboard widgets, Profile* as profile sections.
  • Stores, translations, events — plugin-scoped state, i18n, and a decoupled event bus shared with core.
  • Payments & cartaddPaymentAction(...) and a shared cart power native checkout across token, Stripe and invoice methods.

The backend stays the single source of truth for plugin enable/disable state; the apps read a bundled plugins.json manifest at boot and install the enabled plugins in dependency order — a disabled plugin simply never appears.

Parity

What ships in the box

Both apps carry the same constellation of feature plugins — each a native port of its web counterpart:

meinchat

Multi-room chat: SSE streaming, image attachments, peer-to-peer token transfers, LLM bot rooms with choice/menu/cart cards.

meinchat-plus

End-to-end encryption layer on top of meinchat (declares a dependency on it).

cms

In-app “Posts” browser over the host CMS — pages, posts, video and PDF.

subscription

Tarif-plan + add-on browsing, subscription management, a dashboard widget and a checkout source.

token-payment

Pay from the token balance — an instant, redirect-free debit.

stripe

Stripe Checkout as a native payment method.

invoice

“Pay by invoice” — bank-transfer instructions.

tarot

A self-contained reading feature — the canonical “non-commerce” plugin.

Read the developer guide