"You can't navigate a house you've never walked through. Walk the tree once, deliberately."
The Two Halves, as Folders
Open the project create-tauri-app made and you'll see the two-process model laid out as directories. At the root lives your frontend — exactly what you'd expect from a web app: index.html, src/ with your components, package.json, a bundler config like vite.config.ts. This half is built by your web toolchain, not by Tauri.
Inside src-tauri/ lives the native half, and it's a complete Rust crate. The files you'll touch most:
Cargo.toml— Rust dependencies (this is wheretauri = "2"and your plugins are declared).src/main.rs— the tiny binary entry (callsrun()).src/lib.rs— whererun()actually lives: the Builder, plugins, commands, setup.tauri.conf.json— the config that wires frontend to core (next lesson).capabilities/— the security grants (thesecuritytrack).icons/— app icons for every platform.build.rs+gen/— generated build glue and schemas; you rarely hand-edit these.
Why main.rs and lib.rs Are Split
It looks redundant: main.rs is two lines that just call run() in lib.rs. The reason is mobile. On iOS and Android there is no main() you control — the OS calls into your library. By putting all real logic in lib.rs's run() (marked with a mobile entry-point attribute), the same code path serves desktop and mobile. This split is forward-compatibility baked into the scaffold, even if you only target desktop today.