Skip to main content
The client half of the kit — Vue 3 + Ionic + Capacitor (iOS/Android) + Tauri (desktop), one codebase across web, mobile and desktop.

What you’re starting from

Every exported composable, component, api function and type is ready to use — pull it in as you need it. The account, sessions and settings screens (views/pages/account/*, _settings/AccountSettings.vue) are placeholders on purpose: you build your product’s screens on top, and the kit supplies the plumbing behind them.

Layout

Layering rule: pages/composables call the api layer; they never build request URLs or reimplement requests. (Reimplementing a request is what once let the chunk upload drift onto a stale prefix.)

Session storage — encrypted, non-exportable key

services/localStorage/core/secure_storage.ts is a transparent AES-GCM over IndexedDB layer:
  • The key is a random, non-exportable CryptoKey — never derived from a device fingerprint, never stored as raw bytes. WebCrypto (authenticated); no crypto-js.
  • A canary detects a key/data mismatch and resets the store once, cleanly (a reset = a sign-out, since only the session lives here).
  • Works in the web build and in the Capacitor / Tauri WebViews.
It keeps tokens out of plaintext at rest. It is not an XSS defence — real device-binding is the API’s sessions.device_id.

Quick start

Copy env/.env.example.env and point VITE_BACKEND_URL at the backend. Add any new var to src/vite-env.d.ts too — vite/client has an index signature, so a typo is not a type error, it just reads undefined.
WebView debugging is off by default. Release builds from npm run build:native are not inspectable via chrome://inspect / Safari Web Inspector. To debug on a device build with npm run build:native:debug — and never ship a build made that way.

Environment

Native builds (Capacitor 8 / Tauri)

Use npm run build:native for iOS/Android — it sets SHIPWIDE_NATIVE=1 so the pre-compressed .gz/.br web assets aren’t bundled into the native WebViews (dead weight there, and they break Android’s asset packager). Plain npm run build keeps them for the web/PWA deploy. The ios/ and android/ projects are committed.