In Tauri, a capability says which permissions a window or webview gets. A permission allows or denies specific commands. A scope narrows what an allowed command may touch, such as which folders. Deny always overrides allow, and the command itself must enforce its scope correctly.
The three pieces
- Permissions are the units: allow or deny a command.
- Capabilities are files that grant a set of permissions to named windows.
- Scopes are extra rules that a command receives, for example path globs for the file system plugin or URL filters for the http plugin.
Capabilities live as JSON or TOML files in src-tauri/capabilities/, or inline in tauri.conf.json. The docs say all capability files in the directory are enabled by default. If you list capabilities explicitly in the configuration, only those are used.
Windows and labels
Each capability lists window labels. A window can match several capabilities and its permissions merge. The docs point out that boundaries depend on labels, not titles, and recommend limiting window creation to higher privileged windows. If a low privilege window can create a new window, check what label it can pick.
Commands are open by default
This catches teams out. The capabilities page says that, by default, every command registered with the invoke handler is callable from all windows. To restrict this you define an app manifest for commands in the build script. Review your registered commands and decide which windows need each one.
Scopes need correct code
The scope page is clear that the command receives the scope but must handle it. Developers must ensure no bypass is possible and audit the validation logic. A path scope that allows an app data folder recursively is only as good as the code that resolves paths. The docs' own examples deny the webview data folder, since it holds sensitive data.
Remote content
By default the API is available only to bundled code. The remote URLs option lets listed origins call listed commands. The docs warn that on Linux and Android, Tauri cannot tell a request from an embedded iframe from one by the window itself. Avoid remote access unless you must.
Review checklist
- Does each window have only the permissions it uses?
- Are file scopes as narrow as possible, with denies for sensitive folders?
- Are platform specific capabilities limited with the platforms field?
- Do custom commands validate their scope and arguments?
- Is any remote URL granted access, and why?
Quick check
Do capabilities protect me from a bug in my Rust command?
No. The docs list insecure Rust code and incorrect scope checks as outside what capabilities protect against.
Sources
Last reviewed: 19 October 2026.