Tauri 2 isola o privilegiado no Rust e expõe superfície mínima ao frontend. Capabilities e permissions são o contrato de segurança — não um detalhe de config.
Stack e escopo
| Peça | Papel |
|---|---|
| Tauri 2 | Runtime, janelas, IPC, plugins |
| src-tauri | Rust: commands, state, capabilities |
| Frontend | Web (React/Vue/Svelte/etc. do projeto) |
| Plugins | FS, dialog, shell, http, etc. com permissões explícitas |
Não escreva padrões de Tauri 1 (allowlist legado) em apps novos. Preserve a estrutura já adotada pelo projeto.
Organização
src/ # frontend
src-tauri/
src/
lib.rs # #[cfg_attr] run, plugins, invoke_handler
main.rs
commands/ # commands por domínio
capabilities/ # permissões por janela/contexto
tauri.conf.json
Cargo.toml
- Commands finos; lógica pesada em módulos Rust testáveis.
- Estado compartilhado:
tauri::State/Mutex/RwLockconscientes de blocking. - Frontend fala só via
invoke/ events — sem assumir Node APIs.
Commands e IPC
#[tauri::command]
fn greet(name: String) -> Result<String, String> {
if name.is_empty() {
return Err("name required".into());
}
Ok(format!("Hello, {name}!"))
}
// lib.rs
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
import { invoke } from "@tauri-apps/api/core";
const msg = await invoke<string>("greet", { name: "Ada" });
- Commands:
Result<T, E>serializável; erros seguros para o UI. - Valide input no Rust; o webview é hostil.
- Prefer
asynccommands para I/O; não bloqueie o runtime à toa. - Events (
emit/listen) para push; commands para request/response.
Capabilities e permissões
- Declare em
capabilities/o que cada janela/label pode fazer. - Princípio do menor privilégio: FS, shell e HTTP só nos paths/comandos necessários.
- Plugins só entram se houver permission correspondente.
- Revise capabilities em todo feature que toque disco, rede ou processos.
Frontend
- Use APIs
@tauri-apps/api(v2) e plugins oficiais alinhados. - Detecte runtime Tauri antes de chamar IPC (SSR/preview web).
- UX desktop (menus, atalhos, densidade, chrome de janela): skill
better-desktop-interface. Close-to-tray só se o produto pedir — sem inflar o shell. - i18n do webview:
i18n-frontend. - Assets e CSP: configure em
tauri.conf.json; eviteunsafe-inlinesem necessidade.
Config e build
- Identifiers, janelas e security em
tauri.conf.json/ arquivos de capabilities. - Secrets e signing: fora do repo; CI com secrets do store.
- Dev:
tauri devcom URL do bundler do front. - Prod:
tauri build; teste o artefato instalável no OS alvo. - Multiplataforma: paths e FS via APIs Tauri, não hardcode de Unix/Windows.
Segurança
- Nunca exponha command genérico de shell/FS sem allowlist rígida.
- Normalize e valide paths; bloqueie path traversal.
- Trate o frontend como não confiável (XSS no webview = RCE se as permissões forem amplas).
- Atualizações: prefer mechanism oficial/plugin de updater com assinatura.
Anti-padrões
- Portar mentalidade de Electron/Node para o core Rust
- Capabilities permissivas “para funcionar” deixadas no merge
- Commands que aceitam path/comando arbitrário do UI
- Bloquear UI thread com I/O síncrono longo
- Misturar padrões Tauri 1 allowlist em projeto v2
- Logar tokens/PII no lado Rust ou no webview
Integração com outras skills
- HIG desktop (menu, atalhos, densidade):
better-desktop-interface - Visual web do frontend:
better-web-interface - GUI Rust immediate mode (sem webview):
egui
Fluxo ao implementar uma feature
- Inspecione
tauri.conf.json, capabilities e commands existentes. - Defina command/event + tipos de payload.
- Restrinja permissions/capabilities ao mínimo.
- Implemente Rust + chamada
invokeno front. - Teste em
tauri deve valide o build se a superfície nativa mudou. - Revise paths, rede e shell expostos.
Critérios de conclusão
- IPC tipado com erros tratados no UI
- Capabilities mínimas para a feature
- Input validado no Rust
- Sem APIs privilegiadas desnecessárias no frontend
- Build/dev do projeto funcionando no escopo da mudança
- Sem regressão de superfície de ataque (FS/shell/http)