Projet personnel, open source · 2026

Clipboard

L’historique du presse-papiers, local et hors ligne, pour Linux, Windows et macOS.

Une alternative à Ditto pour Linux, qui reste sur votre machine, marche hors ligne et sait se faire oublier.

Contexte
Projet personnel, open source
Rôle
Conception, développement et packaging
Année
2026
Statut
En développement actif
Stack
Rust, Dioxus 0.7, SQLite, arboard, tokio, GitHub Actions
  • 750 ms entre deux lectures du presse-papiers
  • 3 formats d’installation pour Linux et Windows
  • 14 tests d’acceptation, de stockage et de système
  • 0 octet envoyé sur le réseau

Le contexte

Sous Windows, Ditto garde l’historique de tout ce qu’on copie. Sous Linux, et surtout sous Wayland, je n’ai rien trouvé d’équivalent qui me convienne. J’ai donc écrit le mien. Il est local, rapide, fonctionne hors ligne et tourne sous Linux avec Wayland ou X11, sous Windows et sous macOS.

C’est un projet personnel open source, toujours en développement.

Stack & infra

  • Rust et Dioxus 0.7 pour l’interface de bureau. Dioxus s’appuie sur la WebView du système, WebKitGTK sous Linux et WebView2 sous Windows, au lieu d’embarquer tout un Chromium.
  • arboard lit et écrit le presse-papiers, aussi bien le texte que les images RGBA.
  • SQLite est embarqué avec rusqlite, en mode WAL, avec un auto-vacuum incrémental et des migrations appliquées au démarrage.
  • Le binaire est optimisé avec une LTO complète et une seule unité de compilation. Les symboles sont retirés et un panic arrête directement le programme.
  • GitHub Actions lance les tests à chaque push. À chaque nouvelle version, dx bundle produit le .deb et l’AppImage sous Linux et l’installeur NSIS sous Windows, puis publie la release.

Comment ça marche

Un thread de surveillance lit le presse-papiers toutes les 750 ms. Chaque entrée est identifiée par une empreinte SHA-256, qui tient aussi compte de la largeur et de la hauteur pour les images. Copier deux fois la même chose ne crée donc pas de doublon.

L’historique est stocké dans SQLite. Depuis l’interface, on peut épingler une entrée, la supprimer, la recopier ou vider tout ce qui n’est pas épinglé. Avant de rendre une image au système, l’application vérifie la taille de ses données. Elle se lance avec la session, grâce à un fichier .desktop sous Linux et à une clé Run du registre sous Windows, et peut rester discrètement dans la barre système.

Architecture de Clipboard, du système à l’interface
  • Raccourci GNOME (service externe, Ctrl+Alt+C via gsettings)
  • Socket Unix (service, instance unique)
  • Interface Dioxus (interface, épingler · recopier)
  • Presse-papiers (service externe, texte · images RGBA)
  • Thread de surveillance (worker, 750 ms · SHA-256)
  • SQLite (stockage, WAL · migrations)
  • Raccourci GNOME vers Socket Unix, relance le binaire
  • Socket Unix vers Interface Dioxus, « show »
  • Presse-papiers vers Thread de surveillance, arboard
  • Thread de surveillance vers SQLite, sans doublon
  • SQLite vers Interface Dioxus, historique

La difficulté

Tout s’est joué sur le raccourci global. Sous Wayland, une application n’a pas le droit d’écouter le clavier en dehors de sa fenêtre. C’est une protection voulue par le compositeur, pas un bug, et les bibliothèques de raccourcis habituelles ne marchent donc que sous X11.

Plutôt que de chercher à contourner cette protection, l’application déclare un raccourci personnalisé dans GNOME, Ctrl+Alt+C, avec gsettings. Ce raccourci relance le binaire, qui repère l’instance déjà ouverte et lui demande de s’afficher par une socket Unix. On a ainsi une seule instance à la fois, sans démon en plus.

Il a aussi fallu gérer les différences de formats d’image entre les systèmes, et empaqueter trois plateformes depuis une seule CI.

Ce que ça m’a apporté

  • De la programmation système en Rust, avec des threads, de la communication entre processus et l’intégration au bureau.
  • Composer avec les règles de sécurité d’une plateforme au lieu de chercher à les contourner.
  • Livrer un logiciel de bureau de bout en bout, avec les installeurs, les releases et le démarrage automatique.