FRAMEWORK DESKTOP • RUST + WEBVIEW • OPEN SOURCE

Tauri — Desktop en Rust, interface en Web

Tauri construit des applications desktop cross-platform en utilisant le WebView natif du système d'exploitation pour l'interface et Rust pour le backend système. Résultat : des binaires de 3 à 10 Mo contre 150+ Mo pour Electron.

Créé en 2019 (CrabNebula)
Backend Rust
Frontend HTML / CSS / JS (tout framework)
Taille typique 3–10 Mo
Tauri
~5 Mo
Electron
~150 Mo
01

Définition & concept

Tauri est un framework qui permet de créer des applications desktop légères en utilisant n'importe quel framework frontend web (React, Vue, Svelte, Vanilla JS…) pour l'interface, et Rust pour toute la logique système backend.

La différence clé avec Electron : Tauri n'embarque pas Chromium. Il utilise le WebView natif déjà présent dans le système d'exploitation : WebView2 (Edge/Blink) sur Windows, WKWebView (Safari/WebKit) sur macOS, et WebKitGTK sur Linux. Économie : ~120 Mo par application.

ℹ
Pourquoi Rust ? Rust offre des performances proches du C/C++ sans garbage collector, une gestion mémoire sans fuites garantie à la compilation, et une sécurité de type qui prévient les vulnérabilités classiques (buffer overflow, race conditions). Le backend Tauri est compilé en binaire natif.
CritèreHTAElectronTauri
Moteur HTMLMSHTML/IEChromium embarquéWebView natif OS
BackendWScript/VBSNode.jsRust
Taille bundle~0 Ko~150 Mo~3–10 Mo
RAM (démarrage)~20 Mo~150 Mo~30 Mo
PlateformesWindowsWin+Mac+LinuxWin+Mac+Linux+Mobile*
Courbe d'apprentissageFaibleModéréeÉlevée (Rust)
PerformanceFaibleBonneExcellente

* Support mobile (iOS/Android) disponible en beta avec Tauri 2.x.

02

Historique & évolution

2019 — Genèse

Daniel Thompson-Yvetot et l'équipe TauriApps créent le projet comme alternative légère à Electron. Le concept : utiliser WebView natif + Rust au lieu d'embarquer Chromium + Node.js.

2021 — Stabilisation Tauri 1.0 beta

Le projet rejoint la Linux Foundation. L'API se stabilise. La communauté croît rapidement, attirée par la promesse de binaires ultra-légers.

2022 — Tauri 1.0 stable

Première version stable. Support Windows (WebView2), macOS (WKWebView), Linux (WebKitGTK). L'API de invoke (appel frontend → Rust) et le système de plugins sont figés.

2023 — CrabNebula & Tauri 2.0 alpha

L'entreprise CrabNebula se forme pour soutenir commercialement le projet. Tauri 2.0 introduit le support mobile (iOS/Android), le nouveau système de permissions "Capabilities", et l'ACL (Access Control List) pour les plugins.

2024 — Tauri 2.0 stable

Tauri 2.x devient stable. Support iOS et Android en production. Le système de Capabilities remplace les permissions granulaires de la v1. L'écosystème de plugins officiel s'étoffe.

03

Architecture Frontend / Core

Tauri sépare strictement l'interface (WebView, n'importe quel framework JS) du backend (Rust). La communication est explicite et typée.

Frontend — WebView
HTML / CSS / JavaScript
React / Vue / Svelte / Solid
TypeScript natif
@tauri-apps/api (JS)
invoke() → Rust commands
Événements bidirectionnels
WebView2 (Win) · WKWebView (Mac)
WebKitGTK (Linux)
INVOKE / EVENTS ⇄
Core — Rust
src-tauri/main.rs
#[tauri::command] fns
Accès fichiers (fs)
Processus (child_process)
HTTP client (reqwest)
SQLite (sqlx)
Tous les crates Rust
STRUCTURE PROJET TAURI
mon-app/
├── package.json            ← frontend (npm)
├── src/                    ← frontend (React, Vue, etc.)
│   └── App.tsx
└── src-tauri/
    ├── Cargo.toml          ← dépendances Rust
    ├── tauri.conf.json     ← configuration Tauri
    └── src/
        └── main.rs         ← backend Rust (commands)
04

Installation & prérequis

⚠
Prérequis : Node.js (v18+), Rust (via rustup.rs), et les dépendances système selon la plateforme (WebView2 sur Windows, Xcode CLT sur macOS, webkit2gtk sur Linux).
INSTALLATION
# 1. Installer Rust (si pas déjà installé)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 2. Créer un projet Tauri (avec Vite + React par exemple)
npm create tauri-app@latest
# → choix du frontend : Vanilla / Vue / React / Svelte / Solid

# 3. Installer les dépendances
cd mon-app && npm install

# 4. Démarrer en mode développement (hot-reload)
npm run tauri dev

# 5. Build de production (binaire natif + installeur)
npm run tauri build
⚠
Rust obligatoire : Contrairement à Electron qui ne requiert que Node.js, Tauri nécessite une toolchain Rust complète pour compiler le backend. Le premier build peut prendre 5–15 minutes (compilation des dépendances Rust). Les builds suivants sont rapides grâce au cache Cargo.
05

Commands Rust ↔ Frontend

La communication frontend → Rust se fait via des Commands : des fonctions Rust annotées avec #[tauri::command] et appelées depuis JS avec invoke().

RUST — SRC-TAURI/SRC/MAIN.RS
use tauri::command;
use std::fs;

// Command simple : retourne une valeur
#[command]
fn lire_fichier(chemin: String) -> Result<String, String> {
    fs::read_to_string(&chemin)
        .map_err(|e| e.to_string())
}

// Command async avec accès à l'état Tauri
#[command]
async fn executer_ffmpeg(
    args: Vec<String>,
    app: tauri::AppHandle
) -> Result<String, String> {
    let output = std::process::Command::new("ffmpeg")
        .args(&args)
        .output()
        .map_err(|e| e.to_string())?;
    Ok(String::from_utf8_lossy(&output.stdout).to_string())
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![
            lire_fichier,
            executer_ffmpeg
        ])
        .run(tauri::generate_context!())
        .expect("Erreur Tauri");
}
JAVASCRIPT / TYPESCRIPT — FRONTEND
import { invoke } from '@tauri-apps/api/core'

// Appel d'une command Rust — async, typé
const contenu = await invoke<string>('lire_fichier', {
  chemin: '/home/user/doc.txt'
})

// Écouter des événements Rust → Frontend
import { listen } from '@tauri-apps/api/event'
const unlisten = await listen<number>('progress', (event) => {
  console.log(`Progression: ${event.payload}%`)
})
06

Capabilities & APIs

Tauri 2.x utilise un système de Capabilities (ACL) : chaque permission système doit être explicitement déclarée. Aucun accès implicite.

tauri-plugin-fs

Lecture/écriture fichiers avec permissions granulaires par chemin et par opération.

tauri-plugin-shell

Exécuter des processus externes (ffmpeg, git…). Chaque executable doit être déclaré explicitement.

tauri-plugin-dialog

Boîtes de dialogue natives : ouverture fichier, sauvegarde, messages, confirmation.

tauri-plugin-notification

Notifications système natives sur toutes les plateformes.

tauri-plugin-http

Requêtes HTTP(S) depuis le backend Rust via reqwest. Permissions par domaine.

tauri-plugin-sql

Base de données SQLite, MySQL ou PostgreSQL directement depuis le backend Rust.

tauri-plugin-store

Stockage persistant clé-valeur JSON — équivalent localStorage mais natif.

tauri-plugin-updater

Mise à jour automatique de l'application avec vérification de signature cryptographique.

tauri-plugin-clipboard

Lire et écrire dans le presse-papiers (texte, images).

tauri-plugin-global-shortcut

Raccourcis clavier globaux système.

Tous les crates Rust

crates.io donne accès à 100 000+ bibliothèques Rust pour le backend (crypto, DB, réseau…).

tauri-plugin-camera (v2)

Accès à la caméra — desktop et mobile (iOS/Android) avec Tauri 2.

07

Plugins & écosystème

CARGO.TOML — AJOUT DE PLUGINS
[dependencies]
tauri = { version = "2", features = [] }
tauri-plugin-fs      = "2"
tauri-plugin-dialog  = "2"
tauri-plugin-shell   = "2"
tauri-plugin-http    = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
TAURI.CONF.JSON — CAPABILITIES (PERMISSIONS)
{
  "capabilities": [{
    "identifier": "main-capability",
    "windows": ["main"],
    "permissions": [
      "fs:read-all",
      "fs:write-all",
      "dialog:open",
      "shell:execute",
      "http:default"
    ]
  }]
}
08

Sécurité — Avantages Rust

Tauri a une posture de sécurité nettement supérieure à Electron par défaut :

AspectElectronTauri
PermissionsImplicites (tout Node.js accessible)ACL explicite par capability
Accès filesystemToujours disponible (main process)Doit être déclaré par chemin
Processus externeschild_process sans restrictionChaque exe déclaré dans la config
Memory safetyNode.js (GC, pas de buffer overflow)Rust (garanti à la compilation)
Surface d'attaqueChromium + Node.js + V8WebView + Rust (minimal)
Mise à jour signéeOptionnelVérification signature intégrée
🦀
Rust & sécurité mémoire : Le compilateur Rust garantit à la compilation l'absence de use-after-free, double free, buffer overflow et data races — les classes de vulnérabilités les plus exploitées en C/C++. Sans sacrifier les performances.
09

Compatibilité par plateforme

Windows 10/11
✔ NATIF
WebView2 (Edge/Blink)
Windows 7
✔ SUPPORTÉ
WebView2 compatible
macOS 10.15+
✔ NATIF
WKWebView (Safari/WebKit)
Ubuntu 20+
✔ NATIF
WebKitGTK
iOS (v2)
⚡ BETA STABLE
WKWebView, Tauri 2.x
Android (v2)
⚡ BETA STABLE
WebView Android, Tauri 2.x
Navigateur web
✘ NON
Desktop/mobile uniquement
⚠
WebView natif = comportement variable : Contrairement à Electron qui garantit le même Chromium partout, Tauri utilise le WebView du système. Une même app peut se comporter différemment sur Windows (Blink/Edge) et macOS (WebKit/Safari). Tester sur chaque plateforme est indispensable.
10

Poids vs Electron

L'avantage numéro un de Tauri est la taille des binaires distribués. Le WebView natif n'est pas inclus dans le bundle — il est déjà sur l'OS de l'utilisateur.

MétriqueTauriElectronFacteur
Installateur Windows~3–10 Mo~80–200 Mo×20–30 plus léger
Installateur macOS~3–8 Mo~100–250 Mo×25–40 plus léger
RAM au démarrage~30–80 Mo~150–400 Mo×3–5 plus léger
Temps de démarrage< 500 ms2–5 secondes×4–10 plus rapide
CPU idle~0%1–3%Rust est compilé
Temps de build initial5–15 min (Rust)30–60 sec (npm)Electron plus rapide
Rebuild incrémental~30–60 sec~5 secElectron plus fluide en dev
11

Build & distribution

BUILD PRODUCTION
# Build pour la plateforme courante
npm run tauri build
# → src-tauri/target/release/bundle/
#   Windows : .exe (NSIS) + .msi
#   macOS   : .dmg + .app
#   Linux   : .AppImage + .deb + .rpm

# Build cross-platform via GitHub Actions (recommandé)
# Tauri ne compile pas cross-platform nativement —
# il faut un runner macOS pour le .dmg, Windows pour le .exe
ℹ
Cross-compilation : Contrairement à Electron, Tauri ne permet pas de compiler pour toutes les plateformes depuis une seule machine (le binaire Rust doit être compilé sur chaque OS cible). L'approche standard est d'utiliser GitHub Actions avec des runners Windows, macOS et Linux en parallèle.
12

Cas d'usage appropriés

Cas d'usagePertinenceRaison
App desktop légère cross-platformEXCELLENTC'est le cas d'usage principal de Tauri. Binaires minuscules.
App sensible à la sécuritéEXCELLENTACL, Rust memory safety, surface d'attaque minimale.
App mobile + desktop (v2)TRÈS BONTauri 2 unifie desktop et mobile avec le même code Rust.
Performance critique backendEXCELLENTRust est proche du C en performance. Idéal pour traitement vidéo, crypto, DB.
Équipe sans expérience RustRISQUÉRust a une courbe d'apprentissage élevée. Electron est plus accessible.
Prototypage rapideCORRECTdev hot-reload fonctionne, mais les erreurs Rust ralentissent.
App distribuée grand publicEXCELLENTInstallateur léger = frein à l'adoption réduit.
🦀
Conclusion : Tauri est le meilleur choix pour des applications desktop cross-platform légères, sécurisées et performantes. Le coût est la courbe d'apprentissage Rust et la compilation plus longue. Si ton équipe maîtrise déjà JavaScript mais pas Rust, commencer par Electron et migrer vers Tauri est une stratégie valide.