.claude/skills/tauri-capabilities/SKILL.md
Guides users through configuring Tauri capabilities for security and access control, covering capability files, permissions, per-window security boundaries, and platform-specific configurations.
npx skillsauth add rdjakovic/todo2 configuring-tauri-capabilitiesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Capabilities are Tauri's permission management system that granularly controls which APIs and commands the frontend can access. They define security boundaries by specifying which permissions apply to which windows or webviews.
Capabilities serve as the bridge between permissions and windows/webviews. They:
Capability files reside in src-tauri/capabilities/ and use JSON or TOML format.
A capability file contains:
| Field | Required | Description |
|-------|----------|-------------|
| identifier | Yes | Unique capability name |
| description | No | Purpose explanation |
| windows | Yes | Target window labels (supports wildcards) |
| permissions | Yes | Array of allowed/denied operations |
| platforms | No | Target platforms (linux, macOS, windows, iOS, android) |
| remote | No | Remote URL access configuration |
| $schema | No | Reference to generated schema for IDE support |
Create src-tauri/capabilities/main.json:
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-capability",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"core:path:default",
"core:event:default",
"core:window:default",
"core:app:default",
"core:resources:default",
"core:menu:default",
"core:tray:default"
]
}
All capabilities in src-tauri/capabilities/ are automatically enabled by default. No additional configuration is required.
To explicitly control which capabilities are active, configure them in tauri.conf.json:
{
"app": {
"security": {
"capabilities": ["main-capability", "editor-capability"]
}
}
}
When explicitly configured, only the listed capabilities apply.
Store individual capability files in the capabilities directory:
src-tauri/
capabilities/
main.json
editor.json
settings.json
Reference by identifier in tauri.conf.json:
{
"app": {
"security": {
"capabilities": ["main-capability", "editor-capability", "settings-capability"]
}
}
}
Embed capabilities directly in tauri.conf.json:
{
"app": {
"security": {
"capabilities": [
{
"identifier": "my-capability",
"description": "Capability used for all windows",
"windows": ["*"],
"permissions": ["fs:default", "core:window:default"]
}
]
}
}
}
Combine file-based and inline capabilities:
{
"app": {
"security": {
"capabilities": [
{
"identifier": "inline-capability",
"windows": ["*"],
"permissions": ["fs:default"]
},
"file-based-capability"
]
}
}
}
Assign different permissions to different windows using window labels:
{
"identifier": "main-capability",
"windows": ["main"],
"permissions": ["core:window:default", "fs:default"]
}
{
"identifier": "editor-capability",
"windows": ["editor", "preview"],
"permissions": ["fs:read-files", "core:event:default"]
}
{
"identifier": "global-capability",
"windows": ["*"],
"permissions": ["core:event:default"]
}
{
"identifier": "dialog-capability",
"windows": ["dialog-*"],
"permissions": ["core:window:allow-close"]
}
Permissions follow a naming convention:
| Pattern | Description |
|---------|-------------|
| <plugin>:default | Default permission set for a plugin |
| <plugin>:allow-<command> | Allow a specific command |
| <plugin>:deny-<command> | Deny a specific command |
{
"permissions": [
"core:path:default",
"core:event:default",
"core:window:default",
"core:window:allow-set-title",
"core:window:allow-close",
"core:app:default",
"core:resources:default",
"core:menu:default",
"core:tray:default"
]
}
{
"permissions": [
"fs:default",
"fs:allow-read-file",
"fs:allow-write-file",
"shell:allow-open",
"dialog:allow-open",
"dialog:allow-save",
"http:default",
"clipboard-manager:allow-read",
"clipboard-manager:allow-write"
]
}
Target specific platforms using the platforms array.
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "desktop-capability",
"windows": ["main"],
"platforms": ["linux", "macOS", "windows"],
"permissions": [
"global-shortcut:allow-register",
"global-shortcut:allow-unregister",
"shell:allow-execute"
]
}
{
"$schema": "../gen/schemas/mobile-schema.json",
"identifier": "mobile-capability",
"windows": ["main"],
"platforms": ["iOS", "android"],
"permissions": [
"nfc:allow-scan",
"biometric:allow-authenticate",
"barcode-scanner:allow-scan"
]
}
Create platform-specific capability files:
src-tauri/capabilities/desktop.json:
{
"identifier": "desktop-features",
"windows": ["main"],
"platforms": ["linux", "macOS", "windows"],
"permissions": ["global-shortcut:default", "shell:default"]
}
src-tauri/capabilities/mobile.json:
{
"identifier": "mobile-features",
"windows": ["main"],
"platforms": ["iOS", "android"],
"permissions": ["haptics:default", "biometric:default"]
}
Allow remote URLs to access Tauri commands (use with caution):
{
"$schema": "../gen/schemas/remote-schema.json",
"identifier": "remote-capability",
"windows": ["main"],
"remote": {
"urls": ["https://*.example.com"]
},
"permissions": ["http:default"]
}
A multi-window application with different permission levels:
src-tauri/capabilities/main.json:
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-window",
"description": "Full access for main application window",
"windows": ["main"],
"permissions": [
"core:default",
"fs:default",
"shell:allow-open",
"dialog:default",
"http:default",
"clipboard-manager:default"
]
}
src-tauri/capabilities/settings.json:
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "settings-window",
"description": "Limited access for settings window",
"windows": ["settings"],
"permissions": [
"core:window:allow-close",
"core:event:default",
"fs:allow-read-file",
"fs:allow-write-file"
]
}
src-tauri/capabilities/preview.json:
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "preview-window",
"description": "Read-only access for preview window",
"windows": ["preview"],
"permissions": [
"core:window:default",
"core:event:default",
"fs:allow-read-file"
]
}
Capabilities protect against:
Capabilities do NOT protect against:
main-window, editor-readonly)Generated schemas provide IDE autocompletion. Reference them in capability files:
{
"$schema": "../gen/schemas/desktop-schema.json"
}
Available schemas after build:
desktop-schema.json - Desktop platformsmobile-schema.json - Mobile platformsremote-schema.json - Remote access capabilitiesCheck that the capability includes the required permission and targets the correct window label.
Verify the capability file is in src-tauri/capabilities/ or explicitly listed in tauri.conf.json.
Window labels in capabilities must match the labels defined when creating windows in Rust code. Labels are case-sensitive.
development
Enforce web security and avoid security vulnerabilities
development
Guides users through distributing Tauri applications on Windows, including creating MSI and NSIS installers, customizing installer behavior, configuring WebView2 installation modes, and submitting apps to the Microsoft Store.
documentation
Guides users through Tauri window customization including custom titlebar implementation, transparent windows, window decorations, drag regions, window menus, submenus, and menu keyboard shortcuts for desktop applications.
tools
Assists users with updating Tauri dependencies including the Tauri CLI, Rust crates, JavaScript packages, and checking for outdated versions to upgrade to the latest version.