Overview
A full-featured Tauri 2 desktop starter with auth, billing, settings, updates, secure OS-keychain storage, and capability-scoped IPC wired together.
The Tauri template is a full-featured, clone-and-ship desktop starter for teams shipping commercial apps on Windows, macOS, and Linux. It pre-packages the high-frequency plumbing of a real desktop product — auth, a searchable settings center, auto-update wiring, logging with redaction, Creem billing, OS-keychain secure storage, capability-scoped IPC, packaging, and a one-pass rebrand — so you replace the brand, pages, and business logic and ship.
Keep the Rust core and the typed command boundary in place; swap the default brand, demo surfaces, and product logic for your own.
"Full-featured" means real desktop plumbing, not a launch guarantee. Some surfaces are Example, Opt-in slot, or Removable demo and are meant to be adapted or deleted before you release.
Tauri or Electron?
This template is the Tauri counterpart of the Soar Electron starter: the same frontend stack, the same product surface, and the same Supabase + Creem backend. The desktop layer is what differs.
| Concern | Electron sibling | This template |
|---|---|---|
| Native runtime | Bundled Chromium + Node main process | Rust core + the OS's system webview (smaller installers, lower memory) |
| Security boundary | contextBridge preload script | Declarative capabilities ACL — per-window, never wildcard |
| IPC types | Hand-written Zod schemas over Conveyor | Compiler-derived types via tauri-specta, committed src/lib/bindings.ts with CI drift detection |
| Secure storage | Electron safeStorage | OS keychain via the Rust keyring crate |
If you own both, the Supabase billing schema and Edge Functions are shared — one backend serves either app. See the Electron root if you are comparing.
Tech stack
| Layer | Choice |
|---|---|
| Native runtime | Tauri 2 (Rust), single system-webview window |
| UI runtime | React 19, React Router 7 (HashRouter, lazy routes) |
| Language and build | TypeScript 5.8, Vite 7 |
| Styling | Tailwind CSS 4 + tw-animate-css, shadcn/ui (Radix, CVA, cmdk, sonner) |
| App state | zustand 5, TanStack Query 5, react-hook-form, zod 4 |
| Backend client | supabase-js 2 with typed database access |
| Billing | Creem via Supabase Edge Functions and a Supabase entitlement read model |
| Updates | tauri-plugin-updater over a minisign-signed static feed |
| Observability | tauri-plugin-log + Rust redaction, optional Sentry (Rust crate + @sentry/browser) |
| Localization | i18next / react-i18next, English and Simplified Chinese |
| Testing | Vitest 4, plus an isolated WebdriverIO + tauri-driver e2e harness |
| Tooling | pnpm 11.1.3, ESLint, Prettier, tauri-specta codegen, one-pass rebrand |
Feature status
Status labels used throughout this root:
- Integrated — wired in and available by default.
- Flag-gated — a whole subsystem stripped or hidden by a build-time flag; defaults are called out on each page.
- Opt-in slot — dark until configured and the user opts in.
- Example — working demo code meant to be replaced with your product logic.
- Removable demo — evaluation surface marked with
[template-demo]and covered by the Showcase deletion checklist.
| Area | Status | Scope |
|---|---|---|
| Shell & IPC | Integrated | Rust core + sandboxed webview, 15 typed commands, tauri-specta bindings with CI drift detection, capabilities ACL, guarded external navigation |
| Desktop surfaces | Integrated | Frameless custom titlebar, JS-built native menus + tray, command palette, window-state persistence, logs, redacted diagnostics |
| Settings | Integrated | Versioned tauri-plugin-store JSON store, forward migrations, backup import/export, search, theme, locale, proxy, storage, notifications, shortcuts |
| Authentication | Flag-gated | VITE_AUTH_ENABLED defaults on; Supabase email/password with OS-keychain session storage |
| Data examples | Example | Todos, profile, and avatar upload are patterns to copy; they need the Supabase schema from the setup docs |
| Billing | Flag-gated | VITE_BILLING_ENABLED defaults off; Creem checkout, customer portal, license mode, and <FeatureGate> activate only when configured |
| Privacy slots | Opt-in slot | Rust + webview Sentry; provider-agnostic analytics config and consent UI ship, but the transport remains a no-op scaffold until you implement a provider |
| Auto-update | Flag-gated | VITE_AUTO_UPDATE_ENABLED defaults on; background checks are a separate runtime opt-in, default off |
| Showcase catalog | Removable demo | Capability catalog, component gallery, and demo routes behind VITE_SHOWCASE_ENABLED and [template-demo] markers |
| Distribution | Integrated | Windows NSIS + MSI, macOS DMG, Linux AppImage/deb/rpm, env-driven signing/notarization, minisign-signed update feed |
| Developer experience | Integrated | pnpm dev, quality gate scripts, colocated tests, typed IPC, one-pass rebrand |
App surface map
The webview is a React SPA (HashRouter) inside a frameless desktop shell:
- Sidebar layout — Home, Showcase (26-capability catalog + Components gallery + live demos), Logs, Help, Update, Account, Settings, About, and Billing when billing is enabled.
- Authentication — Login, Register, Forgot Password, and Reset Password render without the shell.
- Settings center — 8 searchable tabs today: General, Appearance, Notifications, Shortcuts, Proxy, Storage, Updates, and Advanced.
- Account page — a separate
/accountroute for the signed-in profile and avatar flows. - About — redacted diagnostics with a copy button.
- Command palette —
Cmd/Ctrl+Kopens route actions, settings shortcuts, and Showcase actions when the demo layer is enabled. - Onboarding gate — first-run onboarding, with an optional EULA gate when
EULA_URLis set.
With VITE_AUTH_ENABLED on (the default), the webview validates
VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY before it mounts. The
placeholder values in .env.example pass validation, so you can explore the
shell immediately — but real auth, profile, avatar, todos, and billing flows
need a Supabase project.
Brand defaults
The identity is intentionally literal while you evaluate the template: Soar Tauri, the soar-tauri:// deep-link scheme, and the com.soarstarter.tauri
bundle identifier. Frontend modules import these from
shared/constants.ts, while pnpm rebrand synchronizes
its known fields across that file, tauri.conf.json, Cargo.toml, and
package.json. The Branding guide lists native metadata and keyring identity
that still require a manual pass.
Start here
The fastest route from clone to a distributable desktop app:
Installation
Install the toolchain — including Rust and per-OS webview deps — and run the app.
Environment Variables
Understand frontend-public config, Rust runtime env, build secrets, and Edge secrets.
Supabase Setup
Create the backend, auth redirects, storage bucket, and the schema the app expects.
Billing
Enable Creem checkout and account-bound entitlements.
Packaging
Build Windows, macOS, and Linux installers.
Auto-Update
Host the minisign-signed update feed and wire release builds.
