FolderStructure.dev

Tauri Multi-Window Application Structure

Multiple windows with distinct contexts. Organized IPC, events, and window management.

#tauri #rust #desktop #multi-window #ipc
PNGPDF

Project Directory

my-tauri-app/
package.json
vite.config.js
src/
main.js
Main window entry
windows/
Window-specific code
main/
Primary window
index.html
App.vue
main.js
settings/
Settings dialog
index.html
Settings.vue
main.js
about/
About window
index.html
About.vue
main.js
shared/
Cross-window code
lib/
ipc.js
Event utilities
commands.js
windows.js
Window helpers
components/
TitleBar.vue
Custom titlebar
Button.vue
style.css
src-tauri/
Cargo.toml
tauri.conf.json
Multi-window config
build.rs
src/
main.rs
lib.rs
windows/
Window management
mod.rs
manager.rs
Create/destroy windows
config.rs
Window definitions
commands/
mod.rs
windows.rs
Window commands
app.rs
events/
Event handling
mod.rs
handlers.rs
payloads.rs
Event data types
state/
mod.rs
app_state.rs
icons/
capabilities/
main-window.json
settings-window.json
public/

Why This Structure?

Multi-window Tauri apps need clear organization: separate entry points per window, shared components, and structured IPC. Each window has its own HTML entry and can have different capabilities. The shared/ folder prevents code duplication.

Key Directories

  • src/windows/-Each window gets its own folder with entry point
  • src/shared/-Components and utilities used across windows
  • src-tauri/src/windows/-Rust window creation and management
  • src-tauri/src/events/-Inter-window communication handlers
  • capabilities/-Per-window permission sets

Window Creation

// src-tauri/src/windows/manager.rs
pub fn open_settings(app: &AppHandle) -> Result<()> {
    WebviewWindowBuilder::new(app, "settings",
        WebviewUrl::App("windows/settings/index.html".into()))
        .title("Settings")
        .inner_size(400.0, 300.0)
        .build()?;
    Ok(())
}

Getting Started

  1. Start with minimal template
  2. Add window folders under src/windows/
  3. Configure tauri.conf.json for multiple windows
  4. Create window manager in src-tauri/src/windows/
  5. Set up per-window capabilities

When To Use This

  • Apps with separate settings or preferences window
  • Document-based apps with multiple editors
  • Dashboard apps with detachable panels
  • Apps needing different security contexts per window

Trade-offs

  • Build complexity-Multiple HTML entry points to configure
  • State sync-Must manage state consistency across windows
  • Bundle size-Shared code may duplicate if not configured

Best Practices

  • Use events for inter-window communication
  • Keep window state in Rust, sync to frontends
  • Create window configs in Rust, not just JSON
  • Use capability files to restrict window permissions
  • Share components via src/shared/