Tauri Shell¶
Status: implemented as an experimental shell in this slice, now with local bundle commands, an updater-capable GitHub Actions artifact workflow, and a packaged-only connected updater experiment.
The current Tauri port lives under shells/tauri/.
Current responsibilities:
show a shell-local Flying Stable splash window immediately while backend startup runs
start Django on a random localhost port and wait for
/health/generate a fresh per-session shell-to-Django auth token, pass it to Django as
DESKTOP_DJANGO_AUTH_TOKEN, and includeX-Desktop-Django-Tokenin the readiness pollload the web view through Django’s
/desktop-auth/bootstrap/URL so Django can set an HttpOnly same-origin auth cookie before redirecting to the appsupervise both
manage.py runserverandmanage.py db_workeras child processesshut down Unix child processes with
SIGTERMfirst, then force-kill only after a 2-second grace periodin packaged mode, check a configured HTTPS updater endpoint after the first main-window load and prompt before downloading/installing a newer signed update
consume the shared staged backend from
.stage/backend/for packaged-like runs and local bundle buildsbundle shell-local icon outputs generated into
shells/tauri/src-tauri/icons/from the shared source art underassets/brand/build hosted CI artifacts through
.github/workflows/tauri-packages.yml, including updater payloads and.sigfiles when a signing key is configured
Local commands:
just tauri-installjust tauri-testjust tauri-startjust tauri-smokejust tauri-packaged-startjust tauri-packaged-smokejust tauri-build
Scope boundaries:
Tauri is still experimental in this slice
.github/workflows/tauri-packages.ymlnow provides an updater-capable GitHub Actions workflow for this shell while still staying artifact-onlyElectron remains the most complete shell path
Tauri uses a bootstrap HttpOnly cookie instead of Electron’s hidden per-request header injection because this Tauri path does not currently have an Electron-equivalent external-localhost outgoing request header hook
the Tauri updater uses
tauri-plugin-updater, not a Django localhost API or a broadened shell bridgetauri.conf.jsonkeeps a placeholderplugins.updaterblock because Tauri requires it whenbundle.createUpdaterArtifactsis enabled; the real endpoint list and public key still come fromDESKTOP_DJANGO_TAURI_UPDATE_ENDPOINTSplusDESKTOP_DJANGO_TAURI_UPDATE_PUBLIC_KEYpackaged update checks stay disabled unless
DESKTOP_DJANGO_TAURI_UPDATE_ENDPOINTSandDESKTOP_DJANGO_TAURI_UPDATE_PUBLIC_KEYare set at build time or supplied at runtimethe hosted Tauri lane uses build-only
tauri-action, not GitHub Release publicationthe current Tauri config now applies a minimal
app.security.cspfor Tauri-served shell assets, including the local splash window and localhost bootstrap surfacethat CSP is intentionally narrow and should not be read as production-hardening for the Django pages loaded over
http://127.0.0.1:<random-port>Tauri now matches Electron’s Unix shutdown shape more closely, but Windows still uses forced process-tree teardown because that remains the most reliable packaged-app cleanup path in this repo
Tauri is not a release-parity path in this slice
the Windows support claim is limited to local plus CI-built NSIS installer generation, with manual install/run validation still required
the current Windows config keeps Tauri’s default
downloadBootstrapperWebView2 installer behavior rather than an offline-ready embedded runtimethe hosted Linux AppImage job currently applies
NO_STRIP=trueas an upstreamlinuxdeployworkaround rather than a claim of finished Linux release hardeninglocal
just tauri-buildruns now pass--no-signautomatically whenTAURI_SIGNING_PRIVATE_KEYis absent so unsigned local bundles still build even thoughcreateUpdaterArtifactsis enabled in configjust tauri-buildnow also prints a Windows NSIS validation checklist when run on Windows, while/docs/release.mdkeeps the canonical written checklistinstaller install/run validation still needs a real live Windows machine and is not automated in this repo
Current minimal CSP posture:
default-src 'self'connect-srcis limited to Tauri IPC plus localhost (ipc:,http://ipc.localhost,http://127.0.0.1:*,http://localhost:*)inline style is still allowed for the shell-local splash document
the policy blocks plugin/object embedding and framing with
object-src 'none'andframe-ancestors 'none'this covers the Tauri-served splash/bootstrap assets only; the Django UI remains a localhost-served renderer with its own separate hardening story
tasks_demo posture in this slice:
supported
Tauri follows the same staged-backend subprocess model as Electron and starts
db_workerafter Django passes the/health/readiness check