Agent skill

Tauri Performance Review

by mukiwu in mukiwu/tempo-term

Expert workflow for reviewing Tauri 2 desktop app performance.

Apache-2.0Auto-check passedBusiness, Finance & HR

Install Tauri Performance Review

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

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

GitHub CLI
$ gh skill install mukiwu/tempo-term tauri-performance-review --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-performance-review .claude/skills/tauri-performance-review && 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-performance-review
GitHub stars
229
Token cost
~2.4k tokens
SKILL.md length
277 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
Apache-2.0

At a glance

Expert workflow for reviewing Tauri 2 desktop app performance.

  • Tasks that involve Performance reviews
  • SKILL.md covers When to Use, Core Principle: IPC Has Cost, Checklist by Area and Common Tauri 2 Performance Bug…, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Tasks that involve Web performance

What it does

Tauri Performance Review is an agent skill from mukiwu/tempo-term. Expert workflow for reviewing Tauri 2 desktop app performance. Covers IPC payload optimization, async command efficiency, state lock contention, large-data streaming via Channel/Response, frontend bundle size, and startup time.

Its SKILL.md is about 2.4k 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 Business, Finance & HR, covering Performance reviews and Web performance. It works with Tauri and Rust. The repository describes itself as: AI-powered terminal, editor and file explorer. The licence is Apache-2.0.

When your agent uses it

  • Tasks that involve Performance reviews
  • Tasks that involve Web performance

Example prompts

  • “/tauri-performance-review”

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

    No scripts in the folder and no shell commands in SKILL.md (its code samples are rust, typescript, toml and json).

    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 Performance Review loads about 2.4k tokens when it runs. Until then it costs about 63 tokens; SKILL.md has 277 words of instructions outside code blocks.

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

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). 277 words, ~2,396 tokens.

Download SKILL.mdSave it as .claude/skills/tauri-performance-review/SKILL.md (or your agent's skills folder).
name
tauri-performance-review
description
Expert workflow for reviewing Tauri 2 desktop app performance. Covers IPC payload optimization, async command efficiency, state lock contention, large-data streaming via Channel/Response, frontend bundle size, and startup time.

Tauri 2 Performance Review Skill

Expert workflow for reviewing Tauri 2 code with a focus on IPC throughput, async correctness, and binary/large-payload handling.

When to Use

Invoke this skill (or the tauri-performance-reviewer agent) when changes touch:

  • Any #[tauri::command] returning or accepting non-trivial data
  • Frontend invoke() callers (especially in hot paths)
  • State management — Mutex, RwLock, Arc
  • tauri.conf.json build / dev / bundle settings
  • Cargo.toml features and profiles

Core Principle: IPC Has Cost

Every invoke() round-trip serializes args to JSON, crosses a process boundary, and deserializes the response. Optimize per call, then minimize call count, then stream when total bytes are large.


Checklist by Area

Rust Commands
□ Async fn for I/O work (file, net, db) — never block the runtime
□ Sync fn for pure compute / very fast operations
□ Returns < 100KB use normal serde JSON
□ Returns ≥ 100KB binary use tauri::ipc::Response::new(bytes)
□ Streaming/progress uses tauri::ipc::Channel<T>
□ Inputs aren't Vec<u8> when an ArrayBuffer Request body would work
□ No std::sync::Mutex held across .await (use tokio::sync::Mutex)
□ No .clone() of large Vec/String when a reference works
□ &str arguments instead of String when ownership not needed
□ No JSON parse/stringify inside hot loops
□ Database/HTTP connection pooled (managed state, not per-call)
State Management
□ Mutex chosen for the access pattern (sync vs tokio)
□ Read-heavy state uses RwLock, not Mutex
□ Lock scope is minimal — release before slow work
□ No Arc<Mutex<T>> wrapping (Tauri does the Arc internally)
□ No deep clones of state on every read — return references via map_or borrow
Frontend invoke()
□ No invoke() in render loops without memoization
□ Multiple sequential invokes that fetch related data → combine into one command
□ Large blob downloads use Channel for progress + Response for bytes
□ Listen for Tauri events instead of polling via invoke
□ No invoke() inside React useEffect without dependency array
tauri.conf.json
□ build.frontendDist points to a built (minified) frontend, not dev source
□ bundle.resources only includes what's needed (not entire src/)
□ bundle.macOS.minimumSystemVersion set (avoids fat universal slices for old macOS)
□ app.windows[].visible: false at start if you want to wait for "ready" event (avoids white flash)
□ app.windows[].decorations / transparent set conservatively (each costs paint perf)
□ No huge bundled binaries in externalBin if avoidable
Cargo.toml
□ [profile.release] uses opt-level = 3 (default) and lto = "thin" or "fat"
□ codegen-units = 1 in release for max optimization (slower compile, faster binary)
□ strip = true in release (smaller binary)
□ panic = "abort" in release (smaller binary, faster)
□ No unnecessary default features on heavy crates (use default-features = false)
Startup Time
□ tauri::Builder::default() doesn't do heavy work in setup (defer to first command)
□ Plugins initialized lazily where the plugin supports it
□ Frontend doesn't fetch all data on mount — paginate
□ Splash window or hidden-then-show pattern for slow initialization

Common Tauri 2 Performance Bug Patterns

Pattern 1: Large Binary Returned As serde JSON
rust
// ❌ WRONG — 10MB image becomes ~14MB base64 JSON, ~200ms encode + parse
#[tauri::command]
fn read_image(path: String) -> Result<Vec<u8>, Error> {
    Ok(std::fs::read(path)?)
}

// ✅ CORRECT — raw ArrayBuffer, ~10ms
#[tauri::command]
fn read_image(path: String) -> Result<tauri::ipc::Response, Error> {
    Ok(tauri::ipc::Response::new(std::fs::read(path)?))
}

Frontend:

ts
const buf = await invoke<ArrayBuffer>('read_image', { path })
Pattern 2: std::sync::Mutex Across .await (Panic + Slow)
rust
// ❌ WRONG — panics in some Tokio configs; serializes async tasks
#[tauri::command]
async fn save(state: State<'_, std::sync::Mutex<AppState>>) -> Result<(), Error> {
    let mut s = state.lock().unwrap();    // sync lock
    tokio::fs::write("...", &s.buf).await?;  // held across .await
    Ok(())
}

// ✅ CORRECT — use tokio's async mutex
#[tauri::command]
async fn save(state: State<'_, tokio::sync::Mutex<AppState>>) -> Result<(), Error> {
    let mut s = state.lock().await;
    tokio::fs::write("...", &s.buf).await?;
    Ok(())
}
Pattern 3: Polling Instead of Events
ts
// ❌ WRONG — invoke every 500ms, wakes the UI thread + Rust constantly
setInterval(async () => {
    setStatus(await invoke<Status>('get_status'))
}, 500)

// ✅ CORRECT — emit from Rust, listen from frontend
import { listen } from '@tauri-apps/api/event'
const un = await listen<Status>('status:changed', (e) => setStatus(e.payload))
rust
app.emit("status:changed", status)?;
Pattern 4: Streaming Without Channel
rust
// ❌ WRONG — caller waits 30s for download; no progress UI possible
#[tauri::command]
async fn download(url: String) -> Result<Vec<u8>, Error> {
    Ok(reqwest::get(&url).await?.bytes().await?.to_vec())
}

// ✅ CORRECT — Channel sends progress + chunks
#[derive(Clone, Serialize)]
#[serde(tag = "event", content = "data")]
enum DownloadEvent {
    Progress { downloaded: u64, total: u64 },
    Chunk(Vec<u8>),
    Done,
}

#[tauri::command]
async fn download(url: String, on_event: Channel<DownloadEvent>) -> Result<(), Error> {
    let resp = reqwest::get(&url).await?;
    let total = resp.content_length().unwrap_or(0);
    let mut downloaded = 0;
    let mut stream = resp.bytes_stream();
    while let Some(chunk) = stream.next().await {
        let chunk = chunk?;
        downloaded += chunk.len() as u64;
        on_event.send(DownloadEvent::Progress { downloaded, total })?;
        on_event.send(DownloadEvent::Chunk(chunk.to_vec()))?;
    }
    on_event.send(DownloadEvent::Done)?;
    Ok(())
}
Pattern 5: N+1 Invoke Calls
ts
// ❌ WRONG — 50 round-trips for 50 notes
const notes: Note[] = []
for (const id of ids) {
    notes.push(await invoke<Note>('get_note', { id }))
}

// ✅ CORRECT — one round-trip
const notes = await invoke<Note[]>('get_notes', { ids })
Pattern 6: Mutex Held While Doing Work
rust
// ❌ WRONG — lock held while writing 100MB to disk; blocks all readers
let mut s = state.lock().await;
tokio::fs::write(&path, &s.huge_buffer).await?;  // 2 seconds
s.last_saved = Some(now());
drop(s);

// ✅ CORRECT — clone what's needed, release lock immediately
let buffer = {
    let s = state.lock().await;
    s.huge_buffer.clone()
};
tokio::fs::write(&path, &buffer).await?;
state.lock().await.last_saved = Some(now());
Pattern 7: Heavy Work in .setup() Blocks Window Show
rust
// ❌ WRONG — DB load on startup adds 3s to first paint
.setup(|app| {
    let db = load_database_sync()?;   // blocks
    app.manage(db);
    Ok(())
})

// ✅ CORRECT — initialize lazily, show window first
.setup(|app| {
    let handle = app.handle().clone();
    tauri::async_runtime::spawn(async move {
        let db = load_database().await.unwrap();
        handle.manage(db);
        handle.emit("db:ready", ()).ok();
    });
    Ok(())
})
Pattern 8: Cargo Release Profile Not Tuned
toml
# ❌ Default — 80MB binary
[profile.release]
opt-level = 3

# ✅ Tuned for ship-quality binary — typically 25-40MB
[profile.release]
opt-level = "z"      # or "s" for size
lto = true
codegen-units = 1
panic = "abort"
strip = true
Pattern 9: Frontend Bundles Dev Dependencies
json
// ❌ WRONG — frontendDist points at unminified source
"build": { "frontendDist": "../src" }

// ✅ CORRECT — point at production build output
"build": {
  "beforeBuildCommand": "pnpm build",
  "frontendDist": "../dist"
}
Pattern 10: .clone() On Large State Read
rust
// ❌ WRONG — clones a 10MB Vec on every read
#[tauri::command]
fn get_buffer(state: State<'_, Mutex<AppState>>) -> Vec<u8> {
    state.lock().unwrap().buffer.clone()
}

// ✅ CORRECT — return Response (raw bytes), no JSON, single copy
#[tauri::command]
fn get_buffer(state: State<'_, Mutex<AppState>>) -> tauri::ipc::Response {
    tauri::ipc::Response::new(state.lock().unwrap().buffer.clone())
}
// Or even better: use Bytes/Arc<[u8]> in state to avoid the clone entirely

Severity Guide

SeverityExamplesAction
CRITICALstd::sync::Mutex across .await (panic risk), 100MB+ JSON returns, polling at <1s interval, blocking I/O in async commandBlock merge
HIGHChannel not used for streaming, N+1 invoke pattern, large clone() in hot path, lock held across slow workFix before merge
MEDIUMMissing release profile tuning, missing minimumSystemVersion, suboptimal Mutex choice for read-heavy stateFollow-up
LOWStylistic, micro-opts in cold pathsBacklog

Official Documentation References

CheckSource
Calling Rust (commands, Channel, Response)https://v2.tauri.app/develop/calling-rust/
State managementhttps://v2.tauri.app/develop/state-management/
Bundle / confighttps://v2.tauri.app/reference/config/

  • Agent: tauri-performance-reviewer
  • Commands: /tauri-perf, /tauri-check, /tauri-audit

© 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-performance-review of mukiwu/tempo-term.

Open the folder on GitHubat commit 6750c17

Compare with similar skills

Tauri Performance Review 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 Performance Review compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tauri Performance Review this skillmukiwu/tempo-term229—~2.4kAutomated safety check: PassApache-2.0
Nextjs React ExpertDokhacgiakhoa/Agent-Skills-4-Vibe-Coding-CLI508—~1.7kAutomated safety check: PassCustom licence
Reflectsamzong/Recall105—~1.2kAutomated safety check: PassMIT
Add UI Stringopenfootmanager/openfootmanager1.1k—~2.6kAutomated safety check: PassGPL-3.0
Worklog Designregisx001/Worklog261—~3.3kAutomated safety check: PassMIT
Veloxdb Scalable Performanceveloxbase/veloxdb652—~1.7kAutomated safety check: PassMIT

Similar skills

  • Nextjs React Expert

    Dokhacgiakhoa/Agent-Skills-4-Vibe-Coding-CLI

    React and Next.js performance optimization from Vercel Engineering.

    508 GitHub stars~1.7k tokensUpdated 4 mo ago
    Business, Finance & HRAuto-check passed
  • Reflect

    samzong/Recall

    Use Recall Reflect to review AI coding workflow history as a conversation-first timeline and discuss observed patterns before changing behavior.

    105 GitHub stars~1.2k tokensUpdated 2 days ago
    Business, Finance & HRAuto-check passed
  • Add UI String

    openfootmanager/openfootmanager

    Add or change any text a player can see, in every locale the game ships in.

    1.1k GitHub stars~2.6k tokensUpdated today
    Testing & QAAuto-check passed
  • Worklog Design

    regisx001/Worklog

    Design and UI skill for the Worklog desktop project manager.

    261 GitHub stars~3.3k tokensUpdated 1 mo ago
    Frontend & DesignAuto-check passed
  • Guides scalability and performance work for VeloxDB's Tauri + Rust PostgreSQL backend and React + TanStack frontend.

    652 GitHub stars~1.7k tokensUpdated 9 days ago
    DatabasesAuto-check passed
  • Add Tauri Command

    devlint/GitWand

    A skill your agent uses when the user wants to expose a Rust feature to the Vue frontend, add a Tauri IPC command, invoke something from a Vue component, or wire up any backend/frontend…

    180 GitHub stars~1.5k tokensUpdated today
    DevelopmentAuto-check passed

More from mukiwu/tempo-term

  • Tauri

    mukiwu/tempo-term

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

    229 GitHub stars~2.5k tokensUpdated 9 days ago
    Auto-check passed
  • 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…

    229 GitHub stars~4.3k tokensUpdated 9 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.

    229 GitHub stars~2.8k tokensUpdated 9 days ago
    Auto-check: notes

Works with

Questions about Tauri Performance Review

What does Tauri Performance Review do?

Expert workflow for reviewing Tauri 2 desktop app performance. Tauri Performance Review is an agent skill from mukiwu/tempo-term. Expert workflow for reviewing Tauri 2 desktop app performance.

When should I use Tauri Performance Review?

Tauri Performance Review fits situations like: tasks that involve Performance reviews; tasks that involve Web performance.

How do I install Tauri Performance Review in Claude Code?

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

How do I install Tauri Performance Review in Codex?

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

Can I use Tauri Performance Review 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-performance-review -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-performance-review, .gemini/skills/tauri-performance-review, .github/skills/tauri-performance-review and .opencode/skills/tauri-performance-review in your project.

What does Tauri Performance Review need to run?

SKILL.md names no scripts, command-line tools or credentials: Tauri Performance Review is instructions for the agent only.

Does Tauri Performance Review 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 Performance Review 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 Performance Review use?

Tauri Performance Review 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 Performance Review use?

About 2.4k tokens (SKILL.md is roughly 9.6k 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 Performance Review?

Skills that share tags, products or a category with Tauri Performance Review: Nextjs React Expert (Dokhacgiakhoa/Agent-Skills-4-Vibe-Coding-CLI, 508 stars), Reflect (samzong/Recall, 105 stars), Add UI String (openfootmanager/openfootmanager, 1.1k stars) and Worklog Design (regisx001/Worklog, 261 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tauri Performance Review?

mukiwu (a GitHub user) maintains it in mukiwu/tempo-term, which has 229 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.