Files
clip-sync/ARCHITECTURE.md
T
bruno 736c9024f3 feat: clip-sync v1.0 — daemon de sync clipboard bidirectional en Go
- Daemon Go ~150 lignes, zéro dépendance hors stdlib + toml
- Watch clipboard local (poll 500ms, hash-based dedup)
- Serveur HTTP POST /clip pour réception des pairs
- Anti-boucle d'écho (lastHash + host+TS filtering)
- Cross-platform: Linux (xclip/wl-paste), macOS, Windows
- Configuration TOML statique des pairs
- install.sh one-liner multi-OS
- ARCHITECTURE.md + ROADMAP.md + README.md
2026-08-08 12:02:58 -04:00

3.0 KiB

clip-sync — Architecture

Principe

Un daemon Go (~150 lignes, zéro dépendance hors stdlib) qui synchronise le presse-papier entre machines sur un LAN. Chaque machine tourne le même binaire, écoute sur :9137, et pousse les nouveaux clips vers toutes les autres.

┌──────────────┐   POST /clip   ┌──────────────┐
│  deepin      │◄──────────────►│  vivobook    │
│  :9137       │   {text,ts}    │  :9137       │
│              │                │              │
│  poll 500ms  │                │  poll 500ms  │
│  xclip -o    │                │  Get-Clip    │
└──────────────┘                └──────────────┘

Boucles (tout dans main.go)

Boucle 1 — Watch local

Toutes les 500ms, lit le clipboard local (xclip -o / powershell Get-Clipboard), le hashe (SHA-256). Si le hash diffère du dernier connu → broadcast HTTP POST à tous les pairs.

Boucle 2 — Receive

Serveur HTTP POST /clip. Reçoit {text, ts, host}. Si le host est soi-même ou si le timestamp est ≤ au dernier reçu de ce host → ignore. Sinon, écrit dans le clipboard local ET met à jour lastHash pour que la boucle 1 ne rebroadcast pas.

Anti-boucle d'écho

Après un clipboard.Write() déclenché par un clip reçu, lastHash est mis à jour avec le hash du texte reçu. Le poller local le voit comme "déjà connu" → pas de rebroadcast.

Composants

Fichier Rôle Lignes
main.go Serveur HTTP + watch loop + dispatch ~120
peers.toml Configuration des pairs ~10
install.sh Installation one-liner cross-OS ~40

Plateformes

OS Clipboard read Clipboard write
Linux (X11) xclip -o -selection clipboard xclip -selection clipboard
Linux (Wayland) wl-paste wl-copy
macOS pbpaste pbcopy
Windows powershell -Command Get-Clipboard powershell -Command Set-Clipboard -Value ...

Détection automatique au démarrage via runtime.GOOS + test de présence des binaires.

Ce qui est volontairement omis

  • Chiffrement — LAN de confiance. Si besoin → TLS entre pairs (v2).
  • Découverte automatique (mDNS) — config statique = 5 lignes de TOML. Discovery = 200 lignes. v2.
  • Historique / ring buffer — ce n'est pas un gestionnaire de presse-papier, c'est du live sync.
  • UI / tray icon — daemon headless, systemd --user ou nssm pour Windows.
  • Auth token — HTTP en clair sur LAN. Port 9137 non exposé à l'extérieur.

Dépendances

Zéro. net/http, crypto/sha256, encoding/json, os/exec, runtime. Stdlib Go pure.

Build

# Linux
GOOS=linux GOARCH=amd64 go build -o clip-sync .

# Windows
GOOS=windows GOARCH=amd64 go build -o clip-sync.exe .

# macOS
GOOS=darwin GOARCH=amd64 go build -o clip-sync .

Un binaire statique par OS. Pas de Docker, pas de runtime.