A practical guide for building desktop apps with Tauri's TypeScript and Rust stack. Covers the full setup including React/Next.js frontends with TailwindCSS and ShadCN-UI, plus Rust backend commands with proper error handling. You get concrete examples for IPC communication, file system operations, and project structure that follows best practices. The security and performance sections are worth reading even if you've shipped Tauri apps before. Use this when you're starting a cross-platform desktop project and want to avoid the common pitfalls around state management and excessive IPC calls.
npx -y skills add mindrally/skills --skill tauri-development --agent claude-codeInstalls into .claude/skills of the current project.
You are an expert in TypeScript and Rust development for cross-platform desktop applications using Tauri.
src/
├── app/ # Next.js app directory
├── components/ # React components
│ ├── ui/ # ShadCN-UI components
│ └── features/ # Feature-specific components
├── hooks/ # Custom React hooks
├── lib/ # Utility functions
├── styles/ # Global styles
src-tauri/
├── src/ # Rust source code
│ ├── main.rs # Entry point
│ └── commands/ # Tauri commands
├── Cargo.toml # Rust dependencies
└── tauri.conf.json # Tauri configuration
import { invoke } from '@tauri-apps/api/tauri';
// Call Rust commands from frontend
const result = await invoke<string>('my_command', { arg: 'value' });
// Listen to events from Rust
import { listen } from '@tauri-apps/api/event';
await listen('event-name', (event) => {
console.log(event.payload);
});
#[tauri::command]
fn my_command(arg: String) -> Result<String, String> {
// Implementation
Ok(format!("Received: {}", arg))
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![my_command])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
use std::fs;
use tauri::api::path::app_data_dir;
#[tauri::command]
fn read_file(path: String) -> Result<String, String> {
fs::read_to_string(&path)
.map_err(|e| e.to_string())
}
#[tauri::command]
fn write_file(path: String, content: String) -> Result<(), String> {
fs::write(&path, content)
.map_err(|e| e.to_string())
}
sickn33/antigravity-awesome-skills
wshobson/agents
kotlin/kotlin-agent-skills