# 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 ```bash # 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.