Tauri Multi-Window Application Structure
Multiple windows with distinct contexts. Organized IPC, events, and window management.
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
- Start with minimal template
- Add window folders under
src/windows/ - Configure
tauri.conf.jsonfor multiple windows - Create window manager in
src-tauri/src/windows/ - 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/