A Tauri 2 + React/TypeScript + Rust + SQLite desktop-app starter template, shipping the infrastructure that app templates usually leave out:
- Single-source branding codegen — every brand value authored once
in
branding.json, generated everywhere (npm run gen:branding), enforced by fences: a drift fence on the generated bytes, a raw-literal fence over the whole tree, and append-only legacy chains so a later rename cannot orphan user data.REBRANDING.mdis the procedure. - Typed SQLite layer — single-connection discipline, pragma bootstrap, append-only numbered migrations, in-memory DB test seam.
- Durable jobs queue — SQLite-backed state machine with atomic
claim, cancel vs preempt, retry budgets, crash recovery, per-kind
policy hooks, and a living
samplekind as the copy-me example. - Settings registry — allowlisted keys with a fenced TS mirror.
- AppError wire convention — one structured error shape across Rust, the IPC boundary, and the frontend union.
- 5-command PR gate — typecheck, lint, vitest, cargo test, build; CI runs the same five byte-identically (a gate-mirror test keeps the lists from drifting).
- Release pipeline skeleton — Developer ID signing, notarization
(app AND dmg), stapling, and self-update artifacts, all behind a
zero-secret contract: with no secrets configured a tag push still
goes green and drafts an unsigned build; each signing tier is
opt-in via its secret.
docs/release.mdis the manual.
The placeholder brand Starterkit is installed throughout; no product domain code is included.
Follow SCAFFOLD.md — the ordered ritual: "Use this template" →
generate your updater keypair → edit branding.json + run the
generator → one-time frozen cold-start reset → gate green →
first release. It also maps the marked edit points and the
delete-points for subsystems you don't need.
This template is a point-in-time snapshot, not a living upstream.
Instantiated apps do not track it: improvements travel in both
directions by cherry-pick, recorded in CHANGELOG.md. The
convention: an instantiated app's README records the template commit
it started from, so a future cherry-pick has a known base.
Seeded from Murmur, a local-first voice-transcription app, at commit
0b9e6b8baa4d01bf9504672eef4f528424afedd4 (its v0.1.5 release) via
git archive — never a working-tree copy, so no local process
artifacts, secrets, or user data can exist anywhere in this
repository's history. A dedicated cleanliness check
(npm run fence:template) additionally proves the tree carries no
residue of the seed app's brand or product vocabulary.
npm install
npm run typecheck
npm run lint
npm test
cargo test --manifest-path src-tauri/Cargo.toml --features test-utils
npm run buildThose five commands are the PR gate (.github/workflows/ci.yml runs
them byte-identically). npm run tauri build produces the unsigned
.app locally; docs/release.md covers signing, notarization, and
the updater pipeline.
MIT — see LICENSE. Third-party license inventory:
THIRD_PARTY_NOTICES.md (regenerate with npm run gen:notices).