Available Commands
Development
pnpm dev
# Starts Vite at http://localhost:5173
# Hot module replacement enabled
# Tauri commands will NOT workpnpm tauri dev
# Compiles Rust backend
# Starts Vite dev server
# Opens native desktop window
# Auto-reloads on changesType Checking
pnpm build
# Runs: tsc && vite build
# Checks types + builds frontendcd src-tauri && cargo check
# Type-checks Rust without buildingcd src-tauri && cargo clippy
# Runs Clippy linter for RustLinting & Formatting
pnpm check
# Runs Biome lint + format check
# Exits with error if issues foundpnpm lint
# Runs Biome linterpnpm format
# Formats all files with Biome
# Auto-organizes importsTesting
pnpm test
# Runs Vitest test suitepnpm test:watch
# Re-runs tests on file changespnpm test -- src/lib/diff.test.ts
# Runs specific test filepnpm test -- -t "test name"
# Runs test matching nameProduction Build
Build Desktop App
pnpm tauri buildThis command:
TypeScript type check
Runs tsc to verify frontend types
Vite production build
Bundles frontend to src-tauri/target/release/bundle/
- Minifies JavaScript/CSS
- Optimizes images
- Generates source maps (optional)
Rust release build
Compiles Rust with optimizations:
cargo build --release- Full optimizations (
-O3equivalent) - No debug symbols (smaller binary)
- Takes ~2-5 minutes
Create platform bundles
Generates installers for current platform
Output Artifacts
src-tauri/target/release/bundle/
├── dmg/
│ └── Glyph_0.1.10_aarch64.dmg # Installer
├── macos/
│ └── Glyph.app # Application bundle
└── updater/
└── Glyph_0.1.10_aarch64.app.tar.gz # Auto-updaterNote
Separate builds needed for x86_64 (Intel) and aarch64 (Apple Silicon)
src-tauri/target/release/bundle/
├── msi/
│ └── Glyph_0.1.10_x64_en-US.msi # Installer
├── nsis/
│ └── Glyph_0.1.10_x64-setup.exe # NSIS installer
└── updater/
└── Glyph_0.1.10_x64.msi.zip # Auto-updatersrc-tauri/target/release/bundle/
├── deb/
│ └── glyph_0.1.10_amd64.deb # Debian package
├── appimage/
│ └── glyph_0.1.10_amd64.AppImage # Portable app
└── updater/
└── glyph_0.1.10_amd64.AppImage.tar.gzPre-push Checklist
Before pushing to remote, run:
pnpm check && pnpm build && cd src-tauri && cargo checkThis verifies:
- ✅ Code is formatted (Biome)
- ✅ No linting errors (Biome)
- ✅ TypeScript compiles
- ✅ Rust compiles
Tip
Add this as a Git pre-push hook:
#!/bin/sh
pnpm check && pnpm build && cd src-tauri && cargo checkMake executable:
chmod +x .git/hooks/pre-pushBuild Optimization
Rust Release Profile
Configured in src-tauri/Cargo.toml:
[profile.release]
opt-level = 3 # Maximum optimization
lto = true # Link-time optimization
codegen-units = 1 # Single codegen unit (slower build, faster runtime)
strip = true # Remove debug symbols
panic = 'abort' # Smaller binary (no unwinding)Vite Build Options
Configured in vite.config.ts:
export default defineConfig({
build: {
target: 'esnext',
minify: 'esbuild', // Fast minification
sourcemap: false, // Disable for smaller bundle
rollupOptions: {
output: {
manualChunks: { // Code splitting
vendor: ['react', 'react-dom'],
editor: ['@tiptap/react', '@tiptap/starter-kit']
}
}
}
}
});Platform-Specific Builds
macOS: Universal Binary
Build for both Intel and Apple Silicon:
# Build x86_64 (Intel)
rustup target add x86_64-apple-darwin
pnpm tauri build -- --target x86_64-apple-darwin
# Build aarch64 (Apple Silicon)
rustup target add aarch64-apple-darwin
pnpm tauri build -- --target aarch64-apple-darwin
# Combine into universal binary
lipo -create \
src-tauri/target/x86_64-apple-darwin/release/glyph \
src-tauri/target/aarch64-apple-darwin/release/glyph \
-output glyph-universalWindows: 32-bit and 64-bit
# 64-bit (default)
pnpm tauri build
# 32-bit
rustup target add i686-pc-windows-msvc
pnpm tauri build -- --target i686-pc-windows-msvcLinux: Multiple Distros
# Debian/Ubuntu (.deb)
pnpm tauri build -- --bundles deb
# AppImage (universal)
pnpm tauri build -- --bundles appimage
# Both
pnpm tauri build -- --bundles deb,appimageCI/CD Pipeline
GitHub Actions Example
name: Build
on:
push:
branches: [main]
pull_request:
jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
with:
version: 10.28.2
- uses: actions/setup-node@v3
with:
node-version: 18
cache: pnpm
- run: pnpm install
- run: pnpm check
- run: pnpm build
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v3
- uses: dtolnay/rust-toolchain@stable
- run: pnpm install
- run: pnpm tauri build
- uses: actions/upload-artifact@v3
with:
name: macos-dmg
path: src-tauri/target/release/bundle/dmg/*.dmgVersioning
Version is stored in two places and must match:
{
"version": "0.1.10"
}[package]
version = "0.1.10"Warning
If versions don’t match, build will fail. Use a script to sync versions:
#!/bin/bash
VERSION=$1
jq ".version = \"$VERSION\"" package.json > package.json.tmp
mv package.json.tmp package.json
sed -i '' "s/version = .*/version = \"$VERSION\"/" src-tauri/Cargo.tomlUsage: ./scripts/bump-version.sh 0.1.11
Bundle Size Analysis
Frontend Bundle
pnpm build
# Check output in terminal:
# dist/assets/index-a1b2c3.js 245.67 kBRust Binary Size
cd src-tauri
cargo build --release
ls -lh target/release/glyph
# Example: 12M (macOS), 8M (Linux), 10M (Windows)Reduce Binary Size
- Strip symbols (enabled by default in release profile)
- Enable LTO (enabled by default)
- Use
wee_alloc(minimal allocator):[dependencies] wee_alloc = "0.4"
Debug Builds
For debugging production issues:
# Build with debug symbols
pnpm tauri build -- --debug
# Or modify Cargo.toml temporarily:
[profile.release]
strip = false
debug = true