Tauri 2.0 Project Structure Files and Folders Explained

Understanding Tauri 2.0 project structure is essential for efficient development, enabling you to navigate files confidently, know where to implement features, organize code logically, and leverage the framework's architecture effectively. A Tauri project follows a clear separation of concerns with distinct directories for frontend web code, backend Rust code, configuration files, build assets, and platform-specific resources, creating a maintainable codebase that scales well from small tools to complex applications. This comprehensive guide explores every file and folder in a Tauri project including the src/ directory containing frontend code (React, Vue, Svelte, or vanilla JavaScript), src-tauri/ directory housing backend Rust code and Tauri-specific configurations, configuration files controlling application behavior, build scripts managing compilation process, icon assets for platform-specific app icons, and output directories containing compiled binaries and installers. Whether you created your first Tauri app or are planning to start, understanding this structure ensures you can quickly locate files, implement new features in appropriate locations, troubleshoot issues effectively, and maintain clean code organization. The project structure reflects Tauri's hybrid architecture where web technologies handle UI rendering while Rust manages system operations, security, and performance-critical tasks.
Project Structure Overview
my-tauri-app/
βββ src/ # Frontend source code (React/Vue/Svelte)
β βββ App.tsx # Main application component
β βββ App.css # Component styles
β βββ main.tsx # Frontend entry point
β βββ assets/ # Static assets (images, fonts, etc.)
β βββ components/ # React/Vue/Svelte components
β
βββ src-tauri/ # Tauri backend (Rust)
β βββ src/
β β βββ main.rs # Rust entry point
β β βββ lib.rs # Library code (optional)
β β βββ commands/ # Custom command modules
β βββ Cargo.toml # Rust dependencies and metadata
β βββ Cargo.lock # Dependency lock file
β βββ tauri.conf.json # Tauri configuration
β βββ build.rs # Build script
β βββ capabilities/ # Permission configuration
β β βββ default.json # Default permissions
β βββ icons/ # Application icons
β β βββ 32x32.png
β β βββ 128x128.png
β β βββ [email protected]
β β βββ icon.icns # macOS icon
β β βββ icon.ico # Windows icon
β βββ target/ # Rust build output
β βββ debug/ # Debug builds
β βββ release/ # Release builds
β
βββ public/ # Public static files
β βββ favicon.ico # Website favicon
β
βββ dist/ # Frontend build output (generated)
β
βββ node_modules/ # Node.js dependencies (generated)
β
βββ package.json # Node dependencies and scripts
βββ package-lock.json # Node dependency lock file
βββ vite.config.ts # Vite configuration
βββ tsconfig.json # TypeScript configuration
βββ tsconfig.node.json # TypeScript config for Node
βββ index.html # HTML entry point
βββ .gitignore # Git ignore rules
βββ README.md # Project documentationFrontend Directory (src/)
The src/ directory contains your web application codeβthe user interface that runs in the WebView. This is standard web development using your preferred framework.
main.tsx - Entry Point
// src/main.tsx - React application entry point
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./index.css";
// Mount React application to DOM
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// Purpose:
// - Initialize React application
// - Mount to DOM element with id="root"
// - Apply global styles
// - Enable strict mode for development warningsApp.tsx - Main Component
// src/App.tsx - Main application component
import { useState } from "react";
import { invoke } from "@tauri-apps/api/core";
import "./App.css";
function App() {
// Component state
const [message, setMessage] = useState("");
// Call Tauri backend command
async function handleAction() {
const result = await invoke<string>("my_command", {
param: "value",
});
setMessage(result);
}
return (
<div className="container">
<h1>My Tauri App</h1>
<button onClick={handleAction}>Call Backend</button>
{message && <p>{message}</p>}
</div>
);
}
export default App;
// Purpose:
// - Root component rendered by main.tsx
// - Contains main application UI
// - Handles user interactions
// - Communicates with Tauri backend via invoke()assets/ - Static Resources
Store images, fonts, SVGs, and other static files in src/assets/. Vite processes these during build, optimizing images and generating proper import paths. Import assets in components: import logo from './assets/logo.svg'.
Backend Directory (src-tauri/)
The src-tauri/ directory contains Rust backend code, Tauri configurations, and build artifacts. This is where system operations, security policies, and business logic live. Learn more about creating Rust commands.
src/main.rs - Rust Entry Point
// src-tauri/src/main.rs - Rust application entry point
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
// Define Tauri command
#[tauri::command]
fn my_command(param: String) -> String {
format!("Received: {}", param)
}
// Mobile entry point (Tauri 2.0)
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
// Register commands
.invoke_handler(tauri::generate_handler![my_command])
// Setup window event handlers
.setup(|app| {
// Initialization code here
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
fn main() {
run();
}
// Purpose:
// - Entry point for Rust application
// - Register Tauri commands
// - Configure application behavior
// - Handle initialization logicCargo.toml - Rust Configuration
[package]
name = "my-tauri-app"
version = "0.1.0"
edition = "2021"
# Application metadata
[package.metadata]
authors = ["Your Name <[email protected]>"]
license = "MIT"
repository = "https://github.com/yourusername/my-tauri-app"
[build-dependencies]
tauri-build = { version = "2.0", features = [] }
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tauri = { version = "2.0", features = ["devtools"] }
# Optional: Additional dependencies for functionality
tokio = { version = "1", features = ["full"] } # Async runtime
reqwest = { version = "0.11", features = ["json"] } # HTTP client
rusqlite = "0.30" # SQLite database
# Target-specific dependencies
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-shell = "2.0"
# Build optimizations
[profile.release]
panic = "abort"
codegen-units = 1
lto = true
opt-level = "s" # Optimize for size
strip = true # Strip symbols
# Purpose:
# - Define Rust package metadata
# - Specify Tauri and other dependencies
# - Configure build optimizations
# - Manage feature flagsbuild.rs - Build Script
// src-tauri/build.rs - Build script
fn main() {
tauri_build::build()
}
// Purpose:
// - Runs before main compilation
// - Generates code from tauri.conf.json
// - Bundles assets and resources
// - Sets up build environment
// - Usually doesn't need modificationConfiguration Files
tauri.conf.json - Tauri Configuration
The most important configuration file controlling application behavior, window settings, security policies, and build options. This file deserves deep understandingβsee the complete tauri.conf.json guide for detailed explanations of all options.
{
// Build configuration
"build": {
"beforeDevCommand": "npm run dev",
"beforeBuildCommand": "npm run build",
"devUrl": "http://localhost:1420",
"frontendDist": "../dist"
},
// Application metadata
"productName": "my-tauri-app",
"version": "0.1.0",
"identifier": "com.mycompany.mytauriapp",
// Application configuration
"app": {
"windows": [
{
"title": "My Tauri App",
"width": 800,
"height": 600
}
],
"security": {
"csp": "default-src 'self'"
}
},
// Bundle configuration
"bundle": {
"active": true,
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/icon.icns",
"icons/icon.ico"
]
}
}
// Controls:
// - Development server settings
// - Window appearance and behavior
// - Security policies (CSP)
// - Build and bundle options
// - Platform-specific settingspackage.json - Node Configuration
{
"name": "my-tauri-app",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"tauri": "tauri",
"tauri:dev": "tauri dev",
"tauri:build": "tauri build"
},
"dependencies": {
"@tauri-apps/api": "^2.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@tauri-apps/cli": "^2.0.0",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"@vitejs/plugin-react": "^4.2.0",
"typescript": "^5.3.0",
"vite": "^5.0.0"
}
}
// Purpose:
// - Define Node.js dependencies
// - Configure npm scripts
// - Set project metadata
// - Manage frontend toolingvite.config.ts - Vite Configuration
// vite.config.ts - Vite build configuration
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
// Vite server configuration
server: {
port: 1420,
strictPort: true,
},
// Environment variables prefix
envPrefix: ["VITE_", "TAURI_"],
// Build options
build: {
target: "esnext",
minify: "esbuild",
sourcemap: false,
},
// Clear console on updates
clearScreen: false,
});
// Purpose:
// - Configure Vite dev server
// - Set build optimizations
// - Configure plugins (React, Vue, etc.)
// - Handle environment variablestsconfig.json - TypeScript Configuration
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
// Purpose:
// - Configure TypeScript compiler
// - Set type checking strictness
// - Define module resolution
// - Specify included filesIcons Directory
The src-tauri/icons/ directory contains application icons in various sizes and formats for different platforms. Tauri uses these during build to generate platform-specific icon formats.
| File | Platform | Usage |
|---|---|---|
| icon.ico | Windows | Application icon, taskbar, executable |
| icon.icns | macOS | Application icon, Dock, Finder |
| 32x32.png | All | Small icon, system tray |
| 128x128.png | All | Standard icon size |
| [email protected] | All | High DPI displays (256x256) |
| icon.png (512x512+) | Linux | Desktop icon, various sizes |
Output Directories
src-tauri/target/ - Rust Build Output
src-tauri/target/
βββ debug/ # Development builds
β βββ my-tauri-app # Debug executable
β βββ my-tauri-app.exe # Windows debug executable
β βββ build/ # Build artifacts
β
βββ release/ # Production builds
βββ my-tauri-app # Optimized executable
βββ my-tauri-app.exe # Windows release executable
βββ bundle/ # Platform installers
βββ nsis/ # Windows NSIS installer
β βββ my-tauri-app_0.1.0_x64-setup.exe
βββ msi/ # Windows MSI installer
β βββ my-tauri-app_0.1.0_x64_en-US.msi
βββ dmg/ # macOS disk image
β βββ my-tauri-app_0.1.0_x64.dmg
βββ deb/ # Debian package
β βββ my-tauri-app_0.1.0_amd64.deb
βββ appimage/ # Linux AppImage
βββ my-tauri-app_0.1.0_amd64.AppImage
// This directory is gitignored and regenerated on each build
// Size: Can be several GB with all build artifactsdist/ - Frontend Build Output
Vite generates the dist/ directory when building the frontend (via npm run build). Contains optimized HTML, CSS, and JavaScript ready for production. Tauri bundles these files into the application during tauri build.
Capabilities Directory (Tauri 2.0)
Tauri 2.0 introduces the capabilities system for fine-grained permission control. The src-tauri/capabilities/ directory contains JSON files defining what APIs your application can access. Learn more about security and permissions.
// src-tauri/capabilities/default.json - Permission configuration
{
"identifier": "default",
"description": "Default permissions for the application",
"windows": ["main"],
"permissions": [
"core:default",
"shell:default",
"dialog:default",
"fs:default",
"http:default"
]
}
// Purpose:
// - Define API access permissions
// - Restrict frontend capabilities
// - Enhance application security
// - Control which windows have which permissions
// Common permissions:
// - core:default - Basic Tauri APIs
// - fs:read-file - Read files
// - fs:write-file - Write files
// - shell:execute - Run commands
// - dialog:open - File dialogs
// - http:request - HTTP requestsCode Organization Best Practices
Frontend Organization
src/
βββ components/ # Reusable UI components
β βββ Button.tsx
β βββ Input.tsx
β βββ Modal.tsx
βββ hooks/ # Custom React hooks
β βββ useTauri.ts
β βββ useFileSystem.ts
βββ services/ # API and service layers
β βββ tauriAPI.ts # Tauri command wrappers
β βββ database.ts # Database operations
βββ utils/ # Utility functions
β βββ helpers.ts
β βββ constants.ts
βββ types/ # TypeScript type definitions
β βββ index.d.ts
βββ styles/ # Global styles
β βββ global.css
β βββ variables.css
βββ App.tsx # Root component
βββ main.tsx # Entry pointBackend Organization
src-tauri/src/
βββ main.rs # Entry point and command registration
βββ lib.rs # Library exports (optional)
βββ commands/ # Tauri command modules
β βββ mod.rs # Module exports
β βββ file_ops.rs # File operations commands
β βββ database.rs # Database commands
β βββ system.rs # System commands
βββ state/ # Application state
β βββ mod.rs
β βββ app_state.rs
βββ models/ # Data models
β βββ mod.rs
β βββ user.rs
βββ utils/ # Utility functions
β βββ mod.rs
β βββ helpers.rs
βββ error.rs # Error types
// Example main.rs with organized imports:
mod commands;
mod state;
mod models;
mod utils;
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.manage(state::AppState::default())
.invoke_handler(tauri::generate_handler![
commands::file_ops::read_file,
commands::file_ops::write_file,
commands::database::query,
commands::system::get_info,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}Version Control (.gitignore)
# Dependencies
node_modules/
# Build output
dist/
src-tauri/target/
# Environment variables
.env
.env.local
# IDE files
.vscode/
.idea/
*.swp
*.swo
# OS files
.DS_Store
Thumbs.db
# Logs
*.log
npm-debug.log*
yarn-debug.log*
# Temporary files
*.tmp
*.tempKey Takeaways
- Clear Separation: Frontend code in
src/, backend code insrc-tauri/maintains clean architecture - Configuration Control:
tauri.conf.jsoncontrols most application behavior without code changes - Standard Tooling: Vite for frontend, Cargo for backendβfamiliar tools for developers
- Multiple Outputs:
target/release/bundle/contains installers for all configured platforms - Security First: Capabilities directory (Tauri 2.0) enforces permission boundaries
- Icon Management: Single icons directory generates all platform-specific formats
- Build Artifacts:
target/anddist/are gitignoredβgenerated on each build
Next Steps
- Configure Your App: Deep dive into tauri.conf.json configuration
- Build Frontend: Integrate React, Vue, or Svelte for modern UI
- Create Commands: Learn Rust backend development
- Implement IPC: Master frontend-backend communication
- Add File Access: Implement file system operations
- Secure Your App: Configure permissions and security
Conclusion
Understanding Tauri's project structure is fundamental to efficient development, enabling you to navigate codebases confidently, implement features in appropriate locations, and maintain clean separation between frontend and backend concerns. The structure reflects Tauri's hybrid architecture where modern web technologies handle UI rendering in the src/ directory while Rust manages system operations, security, and performance in src-tauri/, with clear configuration files controlling application behavior. By organizing code following best practices with modular command structures, separated concerns, reusable components, and proper type definitions, you create maintainable applications that scale from simple tools to complex desktop software. This foundation prepares you for advanced Tauri development including complex state management, multi-window applications, plugin integration, and production deployment with confidence in your project's organization.
$ share --platform
$ cat /comments/ (0)
$ cat /comments/
// No comments found. Be the first!


