Back to Documentation
Deployment

Tauri v2 Development Guide

Project layout, commands, and capability-based permissions for Tauri v2.

•
10 min read
•

PlanToCode uses Tauri v2 for the desktop application. This guide covers the project structure, command system, capability-based permissions, and development workflow.

Project Layout

The desktop application follows standard Tauri v2 conventions:

  • desktop/src/: React frontend with components, hooks, and providers
  • desktop/src-tauri/: Rust backend with commands, jobs, and services
  • desktop/src-tauri/src/lib.rs: Application entry point
  • desktop/src-tauri/src/commands/: Tauri command handlers (~35 modules)
  • desktop/src-tauri/capabilities/: Permission definitions
  • desktop/src-tauri/tauri.conf.json: Tauri configuration

Tauri Configuration

tauri.conf.json configures the application:

  • productName, version, identifier for app metadata
  • build.beforeDevCommand and beforeBuildCommand for frontend
  • bundle settings for installers (DMG, NSIS, AppImage)
  • security.csp for Content Security Policy
  • plugins configuration for official plugins

Capability-Based Permissions

Tauri v2 uses capabilities to control what the app can access:

  • default.json: Base permissions for all windows
  • desktop-default.json: Desktop-specific permissions
  • plantocode-api.json: Custom permissions for PlanToCode commands
  • Permissions grant access to: filesystem, shell, http, dialog, notification

Tauri Plugins

PlanToCode uses several official Tauri plugins:

  • tauri-plugin-http: HTTP client for API calls
  • tauri-plugin-dialog: Native file/folder pickers
  • tauri-plugin-shell: Shell command execution
  • tauri-plugin-store: Persistent key-value storage
  • tauri-plugin-notification: Desktop notifications
  • tauri-plugin-updater: In-app updates
  • tauri-plugin-single-instance: Single instance enforcement

Application State

Rust state managed through Tauri's state system:

  • AppState struct holds shared state
  • RuntimeConfig for server URLs and feature flags
  • TokenManager for secure credential storage
  • ConfigCache for AI model configuration

Creating Commands

Tauri commands expose Rust functions to the frontend:

  • Use #[tauri::command] attribute on async functions
  • Return Result<T, String> for error handling
  • Access state via State<AppState> parameter
  • Register in lib.rs invoke_handler

Single Instance

The app enforces single instance to prevent data conflicts:

  • tauri-plugin-single-instance handles detection
  • Second launch focuses existing window
  • Deep links forwarded to running instance

Development Workflow

Common commands for development:

  • pnpm tauri dev: Start development with hot reload
  • pnpm tauri build: Build production release
  • cargo test: Run Rust tests
  • cargo clippy: Lint Rust code

Mobile Considerations

Tauri v2 supports mobile, but PlanToCode uses native Swift:

  • iOS app built with SwiftUI for native experience
  • Shared API contracts between desktop and mobile
  • Device linking via WebSocket relay

Distribution

Build artifacts for each platform:

  • macOS: .dmg with universal binary (Intel + Apple Silicon)
  • Windows: NSIS installer and MSIX package
  • Linux: AppImage for broad compatibility