- Never include Claude Code attribution (Co-Authored-By) in commit messages
To release a new version:
./scripts/release.sh 0.2.0This bumps version in package.json, src-tauri/tauri.conf.json, and src-tauri/Cargo.toml, commits, tags, and pushes. The v* tag triggers the GitHub Actions release workflow which:
- Deploys Convex functions to production
- Builds for macOS (universal), Windows, and Linux
- Generates an AI changelog via OpenRouter
- Creates a draft GitHub Release with all artifacts +
latest.jsonfor auto-updates
| Secret | Required |
|---|---|
CONVEX_DEPLOY_KEY |
Yes |
VITE_CONVEX_URL |
Yes |
VITE_CONVEX_SITE_URL |
Yes |
TAURI_SIGNING_PRIVATE_KEY |
Yes |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD |
Yes |
OPENROUTER_API_KEY |
Yes |
OPENROUTER_MODEL |
No (default: openrouter/free) |
VITE_SENTRY_DSN |
No (telemetry disabled if absent) |
- Deployment:
exuberant-mink-69 - URL:
https://exuberant-mink-69.eu-west-1.convex.cloud - Site:
https://exuberant-mink-69.eu-west-1.convex.site
- Use
unknown(notany) in catch blocks; narrow withinstanceof Error - No
vite-env.d.tsexists —import.meta.envaccess requiresas anycast (known tech debt) - Prefer typed API wrappers from
src/lib/api.tsover rawinvoke<>()calls - Import components share common UI via
src/components/import/shared.tsx(FilePickerDropzone,ImportModalWrapper,readJsonFile)
npm run buildrunstsc && vite build— must pass with zero warnings- Vendor chunks are split via
manualChunksinvite.config.ts(Solid, Convex, Sentry) — keep main chunk under 500 kB - Avoid mixing static and dynamic
import()of the same module — use static imports when the module is already in the dependency graph