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.

ConcernElectron siblingThis template
Native runtimeBundled Chromium + Node main processRust core + the OS's system webview (smaller installers, lower memory)
Security boundarycontextBridge preload scriptDeclarative capabilities ACL — per-window, never wildcard
IPC typesHand-written Zod schemas over ConveyorCompiler-derived types via tauri-specta, committed src/lib/bindings.ts with CI drift detection
Secure storageElectron safeStorageOS 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

LayerChoice
Native runtimeTauri 2 (Rust), single system-webview window
UI runtimeReact 19, React Router 7 (HashRouter, lazy routes)
Language and buildTypeScript 5.8, Vite 7
StylingTailwind CSS 4 + tw-animate-css, shadcn/ui (Radix, CVA, cmdk, sonner)
App statezustand 5, TanStack Query 5, react-hook-form, zod 4
Backend clientsupabase-js 2 with typed database access
BillingCreem via Supabase Edge Functions and a Supabase entitlement read model
Updatestauri-plugin-updater over a minisign-signed static feed
Observabilitytauri-plugin-log + Rust redaction, optional Sentry (Rust crate + @sentry/browser)
Localizationi18next / react-i18next, English and Simplified Chinese
TestingVitest 4, plus an isolated WebdriverIO + tauri-driver e2e harness
Toolingpnpm 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.
AreaStatusScope
Shell & IPCIntegratedRust core + sandboxed webview, 15 typed commands, tauri-specta bindings with CI drift detection, capabilities ACL, guarded external navigation
Desktop surfacesIntegratedFrameless custom titlebar, JS-built native menus + tray, command palette, window-state persistence, logs, redacted diagnostics
SettingsIntegratedVersioned tauri-plugin-store JSON store, forward migrations, backup import/export, search, theme, locale, proxy, storage, notifications, shortcuts
AuthenticationFlag-gatedVITE_AUTH_ENABLED defaults on; Supabase email/password with OS-keychain session storage
Data examplesExampleTodos, profile, and avatar upload are patterns to copy; they need the Supabase schema from the setup docs
BillingFlag-gatedVITE_BILLING_ENABLED defaults off; Creem checkout, customer portal, license mode, and <FeatureGate> activate only when configured
Privacy slotsOpt-in slotRust + webview Sentry; provider-agnostic analytics config and consent UI ship, but the transport remains a no-op scaffold until you implement a provider
Auto-updateFlag-gatedVITE_AUTO_UPDATE_ENABLED defaults on; background checks are a separate runtime opt-in, default off
Showcase catalogRemovable demoCapability catalog, component gallery, and demo routes behind VITE_SHOWCASE_ENABLED and [template-demo] markers
DistributionIntegratedWindows NSIS + MSI, macOS DMG, Linux AppImage/deb/rpm, env-driven signing/notarization, minisign-signed update feed
Developer experienceIntegratedpnpm 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 /account route for the signed-in profile and avatar flows.
  • About — redacted diagnostics with a copy button.
  • Command paletteCmd/Ctrl+K opens 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_URL is 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:

On this page