v0.1.8
Menu
Download

Tauri v2 Shell

Tauri turns the Vite React app into a signed Windows desktop binary with extra windows, sidecars, and IPC.

Two primary webviews ship today: main (full app) and mini (always-on-top pop-out). Each loads the same Vite bundle from dist/ in release, or http://localhost:1420 during tauri dev. Window chrome (minimize, maximize, close, queue drawer, mini toggle) is custom React in App.tsx, not native title bars (decorations: false).

Rust commands register in lib.rs via generate_handler!. TypeScript calls them with invoke from @tauri-apps/api/core. Local media paths go through convertFileSrc plus assetProtocol scopes in tauri.conf.json so <video> can read files under your home and download drives.

Cross-window playback does not share Zustand. Main emits play-in-mini / play-media; mini emits send-to-main and stop-playback. Each webview has its own JS heap, so events plus a few flat localStorage keys bridge state.

The updater plugin fetches updater.json from GitHub on startup (runUpdateCheck in updaterCheck.ts). Signed NSIS builds download and install in-app. Post-install copy can be structured JSON parsed by updatePostInstall.ts for the scrollable What is new modal.

In the repo

  "build": {
    "beforeDevCommand": "npm run dev",
    "devUrl": "http://localhost:1420",
    "beforeBuildCommand": "npm run build",
    "frontendDist": "../dist"
  "bundle": {
    "active": true,
    "targets": "all",
    "createUpdaterArtifacts": true,
    "externalBin": [
      "binaries/yt-dlp",
      "binaries/ffmpeg",
      "binaries/ffprobe"
    ],
export async function runUpdateCheck(): Promise<UpdateCheckResult> {
  try {
    const currentVersion = await getVersion();
    const next = await check();
    if (!next) {
      return { kind: "up-to-date", currentVersion };
    }
    return {
      kind: "available",
      update: next,
      version: next.version,
      teaserNotes: teaserNotesFromUpdaterBody(next.body ?? ""),
    };
  } catch (e) {
    const message = e instanceof Error ? e.message : String(e);
    return { kind: "error", message };
  }
}

Where it shows up

  • src-tauri/tauri.conf.json windows, sidecars, asset scopes, updater pubkey
  • App.tsx startup update check and UpdaterLayers.tsx UI
  • MiniPlayer.tsx second window entry; Tauri events for playback handoff
  • Explorer child webview: explorer_embed.rs, open_youtube_explorer command