- 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
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 --userounssmpour 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.