Agent skill

Tauri

by mukiwu in mukiwu/tempo-term

A skill your agent uses when working with Tauri 2 projects (tauri.conf.json, src-tauri/, capabilities, permissions,

Apache-2.0Auto-check passedFrontend & Design

Install Tauri

skills CLI
$ npx skills add mukiwu/tempo-term --skill tauri -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install mukiwu/tempo-term tauri --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/mukiwu/tempo-term.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/tauri .claude/skills/tauri && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tauri
GitHub stars
228
Token cost
~2.5k tokens
SKILL.md length
513 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses when working with Tauri 2 projects (tauri.conf.json, src-tauri/, capabilities, permissions,

  • Works in 9 steps: Forgot to register command in… → Multiple invoke_handler! calls — only… → Missing capability — frontend invoke… → …
  • Working with Tauri 2 projects (tauri.conf.json
  • SKILL.md covers Quick Reference, Project Structure, Minimal Setup and Capability Schema (Official), plus 10 more sections
  • Calls pnpm

What it does

Tauri is an agent skill from mukiwu/tempo-term. Use when working with Tauri 2 projects (tauri.conf.json, src-tauri/, capabilities, permissions,

Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Frontend & Design. It works with Tauri. The repository describes itself as: AI-powered terminal, editor and file explorer. The licence is Apache-2.0.

When your agent uses it

  • Working with Tauri 2 projects (tauri.conf.json

Example prompts

  • “/tauri”

Workflow steps

9 steps, taken from the first numbered list in SKILL.md.

  1. Forgot to register command in generate_handler! — frontend gets "command not found"
  2. Multiple invoke_handler! calls — only the last one wins; use a single call
  3. Missing capability — frontend invoke rejected with permission error
  4. Path var typo — $APP_DATA is wrong; correct is $APPDATA
  5. std::sync::Mutex across .await — panic at runtime
  6. unwrap() in command — panics propagate to JS as an opaque error
  7. Result — works but loses type safety; use thiserror enum
  8. Return Vec via JSON — encodes as base64, slow; use Response::new(bytes)
  9. Frontend imports v1 path — @tauri-apps/api/tauri doesn't exist in v2

What it can do on your machine

Read from SKILL.md and the folder at commit 6750c17. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • v2.tauri.app

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Tauri loads about 2.5k tokens when it runs. Until then it costs about 25 tokens; SKILL.md has 513 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~25
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from mukiwu/tempo-term at commit 6750c17, republished under its Apache-2.0 licence (© mukiwu). 513 words, ~2,529 tokens.

Download SKILL.mdSave it as .claude/skills/tauri/SKILL.md (or your agent's skills folder).
name
tauri
description
Use when working with Tauri 2 projects (tauri.conf.json, src-tauri/, capabilities, permissions,

Tauri 2 Application Development

Tauri 2 is a Rust-based framework for building lightweight, secure cross-platform desktop apps with web frontends. This skill covers Tauri 2 specifically (not v1 — APIs differ).

Quick Reference

TaskSolutionNotes
Define backend command#[tauri::command] async fn name(...)Register in generate_handler!
Call from frontendinvoke<T>('name', { args })Import from @tauri-apps/api/core
Grant frontend accessAdd to src-tauri/capabilities/*.jsonPermission = "plugin:command"
Restrict file accessPermission with allow: [{ path: "$APPDATA/x/*" }]Use Tauri path vars, not absolute
Manage shared stateapp.manage(Mutex::new(state)) + State<'_, Mutex<T>>Tauri wraps in Arc internally
Stream large datatauri::ipc::Channel<T>Avoids JSON overhead
Return binary efficientlytauri::ipc::Response::new(bytes)Skip serde JSON encoding
Custom error typethiserror::Error + manual SerializeDon't return Result<T, String>
Lock across .awaittokio::sync::Mutexstd::sync::Mutex panics if held across await
Add a plugin.plugin(tauri_plugin_xxx::init()) in builderPlus pnpm add @tauri-apps/plugin-xxx
Strict CSPtauri.conf.json > app.security.cspTauri auto-injects nonces for bundled assets

Project Structure

my-tauri-app/
├── src/                          # Frontend (React/Vue/Svelte/...)
├── src-tauri/
│   ├── Cargo.toml
│   ├── tauri.conf.json           # Main config
│   ├── capabilities/
│   │   └── default.json          # IPC permissions per window
│   ├── permissions/              # Custom permission definitions
│   ├── icons/
│   └── src/
│       ├── main.rs               # Just calls into lib
│       ├── lib.rs                # tauri::Builder setup, generate_handler!
│       └── commands/             # Command modules
└── package.json

Minimal Setup

src-tauri/src/lib.rs
rust
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_fs::init())
        .manage(AppState::default())
        .invoke_handler(tauri::generate_handler![
            commands::greet,
            commands::save_note,
        ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
A Command (best practice)
rust
// src-tauri/src/commands/notes.rs
use serde::Serialize;
use tauri::State;
use tokio::sync::Mutex;

#[derive(Debug, thiserror::Error)]
pub enum NoteError {
    #[error("invalid path")]
    InvalidPath,
    #[error("io: {0}")]
    Io(#[from] std::io::Error),
}

impl Serialize for NoteError {
    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
        s.serialize_str(&self.to_string())
    }
}

#[derive(Default)]
pub struct AppState {
    pub last_saved: Option<String>,
}

#[tauri::command]
pub async fn save_note(
    contents: String,
    state: State<'_, Mutex<AppState>>,
    app: tauri::AppHandle,
) -> Result<(), NoteError> {
    let dir = app.path().app_data_dir().map_err(|_| NoteError::InvalidPath)?;
    let path = dir.join("note.md");
    tokio::fs::create_dir_all(&dir).await?;
    tokio::fs::write(&path, contents).await?;
    state.lock().await.last_saved = Some(path.to_string_lossy().into_owned());
    Ok(())
}
Frontend Call
ts
// src/lib/notes.ts
import { invoke } from '@tauri-apps/api/core'

export async function saveNote(contents: string): Promise<void> {
    return invoke<void>('save_note', { contents })
}
Capability JSON
json
// src-tauri/capabilities/main.json
{
  "identifier": "main",
  "description": "Permissions granted to the main window",
  "windows": ["main"],
  "permissions": [
    "core:default",
    "core:event:default",
    {
      "identifier": "fs:allow-write-text-file",
      "allow": [{ "path": "$APPDATA/notes/*" }]
    }
  ],
  "platforms": ["macOS", "windows", "linux"]
}

Capability Schema (Official)

FieldTypeRequiredNotes
identifierstring✓Unique name
permissionsarray✓"plugin:command" strings or scoped objects
descriptionstring—Human-readable purpose
windowsstring[]—Window labels; supports glob
webviewsstring[]—Webview labels; supports glob
platformsstring[]—macOS / windows / linux / iOS / android
localboolean—Default true; for local app URLs
remote.urlsstring[]—Allowed remote URL patterns (URLPattern syntax)

Security rule: A window with no matching capability has zero IPC access. Use this — make new windows opt-in.

Permission Format

Three forms inside permissions: []:

json
"core:default"                              // simple string
"fs:allow-read-text-file"                   // plugin:command

{                                            // scoped object
  "identifier": "fs:allow-write-text-file",
  "allow": [{ "path": "$APPDATA/notes/*" }],
  "deny": [{ "path": "$APPDATA/notes/secret" }]
}
Tauri Path Variables (use these, not absolute paths)
VarMaps to (macOS sandboxed)
$APPDATA~/Library/Application Support/<bundle-id>
$APPCONFIG~/Library/Application Support/<bundle-id>
$APPCACHE~/Library/Caches/<bundle-id>
$APPLOG~/Library/Logs/<bundle-id>
$DOCUMENT~/Documents (requires user-selected-files entitlement under sandbox)
$HOMEsandbox container home
$RESOURCEbundled resources

Custom Permissions

Define reusable permission sets in src-tauri/permissions/<name>.toml:

toml
[[permission]]
identifier = "read-notes"
description = "Read user notes from app data"
commands.allow = ["read_text_file", "read_dir"]

[[scope.allow]]
path = "$APPDATA/notes/*"

Then reference in capability: "permissions": ["fs:read-notes"].

State Management

rust
// Register
.manage(Mutex::new(AppState::default()))

// Use in command (sync mutex — fine if NOT held across .await)
#[tauri::command]
fn get_count(state: State<'_, std::sync::Mutex<AppState>>) -> u32 {
    state.lock().unwrap().count
}

// Use in async command — MUST be tokio::sync::Mutex if held across .await
#[tauri::command]
async fn save(state: State<'_, tokio::sync::Mutex<AppState>>) -> Result<(), Error> {
    let mut s = state.lock().await;
    do_async_work().await?;
    s.last_saved = Some(now());
    Ok(())
}

Pitfall: type mismatch between manage(T) and State<'_, U> causes a runtime panic. Use a type alias.

Show full SKILL.md (209 more words)Show less

Async Commands — Key Rules

  • Async runs on Tokio; preferred for I/O
  • Cannot use &str or State<'_, T> directly with naked async — wrap return in Result<T, E> (this satisfies the lifetime requirement)
  • Use tokio::fs, tokio::sync::*, never block the runtime

Streaming with Channel

rust
use tauri::ipc::Channel;

#[derive(Clone, Serialize)]
#[serde(tag = "event", content = "data")]
enum DownloadEvent {
    Progress { downloaded: u64, total: u64 },
    Done,
}

#[tauri::command]
async fn download(url: String, on_event: Channel<DownloadEvent>) -> Result<(), Error> {
    // ... fetch
    on_event.send(DownloadEvent::Progress { downloaded: 1024, total: 10240 })?;
    on_event.send(DownloadEvent::Done)?;
    Ok(())
}

Frontend:

ts
import { Channel, invoke } from '@tauri-apps/api/core'
const channel = new Channel<DownloadEvent>()
channel.onmessage = (e) => console.log(e)
await invoke('download', { url: '...', onEvent: channel })

Binary Response (avoid JSON)

rust
#[tauri::command]
fn read_image(path: String) -> Result<tauri::ipc::Response, Error> {
    let bytes = std::fs::read(path)?;
    Ok(tauri::ipc::Response::new(bytes))
}

Frontend gets an ArrayBuffer directly — no JSON parse cost.

CSP — Production-Grade Example

tauri.conf.json:

json
{
  "app": {
    "security": {
      "csp": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' asset: data:; connect-src 'self' https://api.example.com; font-src 'self' data:"
    }
  }
}

Tauri auto-adds nonces for bundled assets. Avoid unsafe-eval. If using WASM, add 'wasm-unsafe-eval' to script-src.

Plugins — Tauri 2 Naming

v1v2
@tauri-apps/api/fs@tauri-apps/plugin-fs
@tauri-apps/api/shell@tauri-apps/plugin-shell
@tauri-apps/api/dialog@tauri-apps/plugin-dialog
@tauri-apps/api/tauri (invoke)@tauri-apps/api/core
@tauri-apps/api/notification@tauri-apps/plugin-notification
@tauri-apps/api/clipboard@tauri-apps/plugin-clipboard-manager

Common Pitfalls (Tauri 2)

  1. Forgot to register command in generate_handler! — frontend gets "command not found"
  2. Multiple invoke_handler! calls — only the last one wins; use a single call
  3. Missing capability — frontend invoke rejected with permission error
  4. Path var typo — $APP_DATA is wrong; correct is $APPDATA
  5. std::sync::Mutex across .await — panic at runtime
  6. unwrap() in command — panics propagate to JS as an opaque error
  7. Result<T, String> — works but loses type safety; use thiserror enum
  8. Return Vec<u8> via JSON — encodes as base64, slow; use Response::new(bytes)
  9. Frontend imports v1 path — @tauri-apps/api/tauri doesn't exist in v2

© mukiwu, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/tauri of mukiwu/tempo-term.

Open the folder on GitHubat commit 6750c17

Compare with similar skills

Tauri next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Tauri compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tauri this skillmukiwu/tempo-term228—~2.5kAutomated safety check: PassApache-2.0
Ccgui Plugin Creatorzhukunpenglinyutong/desktop-cc-gui4.4k—~1.3kAutomated safety check: PassNone
Create Keybindgraphif/project-graph4.5k—~2kAutomated safety check: PassNone
Cross Platform Tauri UIifer47/markeron1.2k—~2kAutomated safety check: PassMIT
App Feedback AdminJamailar/Beav1.8k—~1.1kAutomated safety check: PassCustom licence
Cursor BYOK Frontend Guideleookun/cursor-byok3.2k—~1.9kAutomated safety check: PassMIT

Similar skills

  • Ccgui Plugin Creator

    zhukunpenglinyutong/desktop-cc-gui

    为 CC GUI 桌面客户端创建、修改、迭代插件(Tier-0 声明式 CSS/JSON,或 Tier-1 单文件 ESM)。当用户要"做一个插件 / 给 CC GUI 加个功能 / 改输入框或界面样式 / 加设置页、侧边栏或状态栏入口 / 加面板页签或命令面板命令 / 把某套工作流包装成插件 / 改一下我做过的那个插件",或提到 ccgui 插件、插件目录、从本地目录安装插件时使用。

    4.4k GitHub stars~1.3k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Create Keybind

    graphif/project-graph

    指导如何在 Project Graph 项目中创建新的快捷键。当用户需要添加新的快捷键、修改快捷键绑定或需要了解快捷键系统的实现方式时使用此技能。

    4.5k GitHub stars~2k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Cross-platform UI styling for MarkerOn Tauri app (macOS WKWebView vs Windows WebView2).

    1.2k GitHub stars~2k tokensUpdated today
    Frontend & DesignAuto-check passed
  • App Feedback Admin

    Jamailar/Beav

    Read platform-admin feedback issues through the trusted HTTP admin API, summarize user reports, and turn them into RedBox/RedConvert repair and iteration plans.

    1.8k GitHub stars~1.1k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Cursor BYOK Frontend Guide

    leookun/cursor-byok

    Sets the rules for building the Cursor BYOK desktop app's React and Tauri frontend, especially its HTTP boundary and component state architecture.

    3.2k GitHub stars~1.9k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Tauri Config Ipc

    ifer47/markeron

    Extend MarkerOn settings, persisted config, or Tauri IPC commands.

    1.2k GitHub stars~1k tokensUpdated today
    Frontend & DesignAuto-check passed

More from mukiwu/tempo-term

  • Windows Tauri

    mukiwu/tempo-term

    A skill your agent uses when writing or reviewing code in this Tauri app that can behave differently on Windows — spawning a subprocess (git/gh/any Command), path handling, cfg-gated platform APIs…

    228 GitHub stars~4.3k tokensUpdated 8 days ago
    Auto-check passed
  • Tauri Performance Review

    mukiwu/tempo-term

    Expert workflow for reviewing Tauri 2 desktop app performance.

    228 GitHub stars~2.4k tokensUpdated 8 days ago
    Auto-check passed
  • Tauri Security Review

    mukiwu/tempo-term

    Expert workflow for reviewing Tauri 2 desktop app security. An agent skill from mukiwu/tempo-term.

    228 GitHub stars~2.8k tokensUpdated 8 days ago
    Auto-check: notes

Works with

Questions about Tauri

What does Tauri do?

A skill your agent uses when working with Tauri 2 projects (tauri.conf.json, src-tauri/, capabilities, permissions,. Tauri is an agent skill from mukiwu/tempo-term.

When should I use Tauri?

Tauri fits situations like: working with Tauri 2 projects (tauri.conf.json.

How do I install Tauri in Claude Code?

Run `npx skills add mukiwu/tempo-term --skill tauri -a claude-code`. Or copy the skill folder (.claude/skills/tauri in mukiwu/tempo-term) into .claude/skills/tauri in your project. Claude Code loads it when a task matches its description.

How do I install Tauri in Codex?

Run `npx skills add mukiwu/tempo-term --skill tauri -a codex`. Or copy the skill folder (.claude/skills/tauri in mukiwu/tempo-term) into .agents/skills/tauri in your project. Codex loads it when a task matches its description.

Can I use Tauri in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add mukiwu/tempo-term --skill tauri -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tauri, .gemini/skills/tauri, .github/skills/tauri and .opencode/skills/tauri in your project.

What does Tauri need to run?

Going by SKILL.md and its folder, Tauri needs the command-line tools its instructions call (pnpm).

Does Tauri access the network?

SKILL.md names 1 domain. As links in the text: v2.tauri.app. This is read from the text; nothing was executed.

Is Tauri safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Tauri use?

Tauri is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Tauri use?

About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Tauri?

Skills that share tags, products or a category with Tauri: Ccgui Plugin Creator (zhukunpenglinyutong/desktop-cc-gui, 4.4k stars), Create Keybind (graphif/project-graph, 4.5k stars), Cross Platform Tauri UI (ifer47/markeron, 1.2k stars) and App Feedback Admin (Jamailar/Beav, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tauri?

mukiwu (a GitHub user) maintains it in mukiwu/tempo-term, which has 228 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on September 30, 2026.

Source: mukiwu/tempo-term on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.