# Feature catalog — tauri-apps/tauri

> Canonical page: https://codevetter.com/unpack/tauri/feature-catalog

# Feature catalog — tauri-apps/tauri

Scanned commit 745b9a48aeb6e7f48d70adf3d043e6203de5bac6 (2026-09-22). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

User-facing surface has three layers: the Rust API (Builder, windows, webviews, menus, tray, events, state, plugins, custom protocols), the JS API (invoke, Channel, events, window/webview/menu/tray/path/image modules), and the `cargo-tauri` CLI covering the whole project lifecycle (init, dev with hot-reload, build, bundle, icon, signer, plugin scaffolding, ACL permission/capability helpers, migrate, inspect, info). Bundling supports all major OS installer formats, and the repo ships example apps plus a WebDriver driver for automation.
- `tauri dev` runs the configured `build.beforeDevCommand` via `sh -c` (or `cmd /S /C` on Windows) in the frontend dir, then waits up to ~180s for the devUrl TCP port before starting the app. — [crates/tauri-cli/src/dev.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/dev.rs)
- When `build.devUrl` is unset and `build.frontendDist` points at an existing directory, `tauri dev` starts a built-in static file dev server (default port 1430, env TAURI_CLI_PORT) and injects its URL into the merged config. — [crates/tauri-cli/src/dev.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/dev.rs) [crates/tauri-cli/src/dev/builtin_dev_server.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/dev/builtin_dev_server.rs)
- `tauri dev` watches the src-tauri dir plus workspace dependency paths and `build.additionalWatchFolders` with a 1-second debounced notify watcher, rebuilding the app on Rust changes. — [crates/tauri-cli/src/interface/rust.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/interface/rust.rs)
- `tauri build` runs beforeBuildCommand, compiles via the configured runner (default cargo), then computes bundler settings and calls `tauri_bundler::bundle_project` to emit installers per the `bundle` config. — [crates/tauri-cli/src/build.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/build.rs) [crates/tauri-cli/src/bundle.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/bundle.rs)
- The CLI exposes project scaffolding (`init` writing src-tauri/tauri.conf.json, `plugin init/new`), icon generation (`icon`), updater key handling (`signer generate/sign`), v1→v2 `migrate`, environment diagnostics (`info`), and ACL helpers (`permission`, `capability`, `inspect`). — [crates/tauri-cli/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/lib.rs) [crates/tauri-cli/src/init.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/init.rs) [crates/tauri-cli/src/icon.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/icon.rs) [crates/tauri-cli/src/signer/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/signer/mod.rs) [crates/tauri-cli/src/migrate/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/migrate/mod.rs) [crates/tauri-cli/src/info/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/info/mod.rs)
- Windowing features include multiwindow/multiwebview creation via `WebviewWindowBuilder::new(app, label, WebviewUrl)`, drag-drop events, `on_new_window` handlers, document-title hooks, and vibrancy effects — exercised by examples/api, examples/multiwindow and examples/multiwebview. — [examples/api/src-tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/examples/api/src-tauri/src/lib.rs) [crates/tauri/src/webview/webview_window.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/webview/webview_window.rs) [examples/README.md](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/examples/README.md)
- Desktop menu and tray systems live in crates/tauri/src/menu and crates/tauri/src/tray (tray behind the `tray-icon` feature auto-enabled by trayIcon config), with global listeners via `Builder::on_menu_event`/`on_tray_icon_event`. — [crates/tauri/src/menu/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/menu/mod.rs) [crates/tauri/src/tray/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/tray/mod.rs) [crates/tauri/src/app.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/app.rs)
- The JS event API (`listen`, `emit`, `once`) targets EventTarget kinds Any/AnyLabel/App/Window/Webview/WebviewWindow and is implemented over plugin commands `plugin:event|listen`/`unlisten`/`emit`; built-in `tauri://` events (resize, move, close-requested, drag-drop, theme-changed, ...) are enumerated in TauriEvent. — [packages/api/src/event.ts](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/packages/api/src/event.ts) [crates/tauri/src/event/plugin.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/event/plugin.rs) [crates/tauri/src/event/listener.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/event/listener.rs)
- IPC offers `invoke()` for request/response commands, `Channel` for ordered streaming (messages carry an index, out-of-order messages are buffered client-side), and `Resource` handles wrapping the Rust `ResourceTable` closed via `plugin:resources|close`. — [packages/api/src/core.ts](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/packages/api/src/core.ts) [crates/tauri/src/ipc/channel.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/ipc/channel.rs) [crates/tauri/src/resources/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/resources/mod.rs)
- The `asset:` custom protocol serves arbitrary filesystem files gated by the FsScope, with SafePathBuf validation, magic-byte mime sniffing, HEAD support and single/multi-range (206, multipart/byteranges) responses capped at 1000KiB per range. — [crates/tauri/src/protocol/asset.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/protocol/asset.rs) [crates/tauri/src/scope/fs.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/scope/fs.rs)
- Apps can register custom URI scheme protocols (`UriSchemeProtocol` handler registered through the WebviewManager's `register_uri_scheme_protocol`) and use the Isolation security pattern, which encrypts IPC payloads through a sandboxed iframe. — [crates/tauri/src/manager/webview.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/manager/webview.rs) [crates/tauri/src/protocol/isolation.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/protocol/isolation.rs) [crates/tauri/scripts/isolation.js](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/scripts/isolation.js)
- Mobile features: `tauri android`/`tauri ios` CLI subcommands (ios only compiled on macOS), `#[tauri::mobile_entry_point]` for lib entry, and Kotlin-side PluginManager bridged by the `android_binding!` macro. — [crates/tauri-cli/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/lib.rs) [crates/tauri-cli/src/mobile/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-cli/src/mobile/mod.rs) [crates/tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/lib.rs)
- The `test` cargo feature exposes `tauri::test` with `mock_app()`/`mock_context()` and a MockRuntime so apps and internals can be unit-tested without a real OS webview. — [crates/tauri/src/test/mod.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/test/mod.rs) [crates/tauri/src/test/mock_runtime.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/test/mock_runtime.rs) [crates/tauri/src/lib.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri/src/lib.rs)
- End-to-end WebDriver testing is a first-class feature: tauri-driver proxies native drivers and packages/api-e2e runs wdio specs against examples/api, with Android/iOS variants via appium. — [crates/tauri-driver/src/main.rs](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/crates/tauri-driver/src/main.rs) [packages/api-e2e/package.json](https://github.com/tauri-apps/tauri/blob/745b9a48aeb6e7f48d70adf3d043e6203de5bac6/packages/api-e2e/package.json)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
