$ cat /posts/tauri-20-project-structure-files-and-folders-explained.md
[tags]Tauri 2.0

Tauri 2.0 Project Structure Files and Folders Explained

drwxr-xr-x2026-01-285 min0 views
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

plaintextfull_structure.txt
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 documentation

Frontend 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

typescriptmain.tsx
// 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 warnings

App.tsx - Main Component

typescriptApp.tsx
// 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

rustmain.rs
// 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 logic

Cargo.toml - Rust Configuration

tomlCargo.toml
[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 flags

build.rs - Build Script

rustbuild.rs
// 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 modification

Configuration 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.

jsontauri.conf.json
{
  // 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 settings

package.json - Node Configuration

jsonpackage.json
{
  "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 tooling

vite.config.ts - Vite Configuration

typescriptvite.config.ts
// 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 variables

tsconfig.json - TypeScript Configuration

jsontsconfig.json
{
  "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 files

Icons 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.

FilePlatformUsage
icon.icoWindowsApplication icon, taskbar, executable
icon.icnsmacOSApplication icon, Dock, Finder
32x32.pngAllSmall icon, system tray
128x128.pngAllStandard icon size
[email protected]AllHigh DPI displays (256x256)
icon.png (512x512+)LinuxDesktop icon, various sizes
Icon Generation: Use online tools like icon.kitchen to generate all required icon formats from a single high-resolution PNG (1024x1024 recommended). Tauri's icon generation during build creates optimized versions for each platform.

Output Directories

src-tauri/target/ - Rust Build Output

plaintexttarget_structure.txt
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 artifacts

dist/ - 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.

jsondefault.json
// 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 requests

Code Organization Best Practices

Frontend Organization

plaintextfrontend_organization.txt
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 point

Backend Organization

rustbackend_organization.rs
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)

plaintext.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
*.temp

Key Takeaways

  • Clear Separation: Frontend code in src/, backend code in src-tauri/ maintains clean architecture
  • Configuration Control: tauri.conf.json controls 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/ and dist/ are gitignoredβ€”generated on each build

Next Steps

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.

$ cat /comments/ (0)

new_comment.sh

// Email hidden from public

>_

$ cat /comments/

// No comments found. Be the first!

[session] guest@{codershandbook}[timestamp] 2026

Navigation

Categories

Connect

Subscribe

// 2026 {Coders Handbook}. EOF.