- Panel Reglages dans l'UI (modal) - Folder picker natif Wails pour dossier local - ListS3Buckets via aws-cli (profile-aware) - TestS3Access pour verifier acces bucket - Config persistee user config dir (cross-OS): %APPDATA%/field-sync ou ~/.config/field-sync - Header affiche bucket + dest visibles - Auto-open modal si bucket vide au premier run Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
field-sync-gui
GUI desktop sur-mesure Cosma terrain : ingest cartes SD GoPro → disque local + AWS S3.
Stack : Wails v2 (Go backend) + Svelte+TS+Tailwind (frontend) + s5cmd (uploads S3 parallèles).
Pourquoi ?
Workflow terrain actuel : SD → disque dur (1 par 1) → script rclone Windows → S3. Lent, série, peu de visibilité.
field-sync-gui ingère 4 cartes SD en parallèle, copie locale + sync S3 simultanés, progress live par slot, manifeste JSON par session, retry auto, dry-run dispo. Single binary par OS, 0 install.
Binaries pré-buildés (Linux + Windows)
Build host : 192.168.0.91 (Proxmox VM openclaw).
build/bin/field-sync-gui # Linux x86_64 (~7.7 MB)
build/bin/field-sync-gui.exe # Windows x86_64 (~11 MB)
macOS : non cross-compilable depuis Linux sans osxcross. À builder sur un Mac (cf. section Build).
Install runtime
Pré-requis user (toutes OS)
- s5cmd dans le PATH — uploads S3 (10× plus rapide que aws-cli) — https://github.com/peak/s5cmd/releases
- AWS credentials : profile
cosma(ou autre) configuré dans~/.aws/credentialsouaws configure --profile cosma
Linux
chmod +x field-sync-gui
./field-sync-gui
Pré-requis système : libwebkit2gtk-4.1-0 (Ubuntu 24.04) ou libwebkit2gtk-4.0-37 (Ubuntu ≤22).
Windows
Double-clic field-sync-gui.exe. WebView2 Runtime requis (préinstallé Win11, Edge récent).
macOS
Build local nécessaire — voir section Build.
Configuration
Au premier lancement, l'app charge .env depuis le répertoire courant ou variables d'env :
FIELD_SYNC_S3_BUCKET=cosma-field-data
FIELD_SYNC_LOCAL_DEST=/data/cosma/sessions
AWS_PROFILE=cosma
FIELD_SYNC_CONCURRENCY=4
FIELD_SYNC_CONCURRENCY = nombre de workers parallèles (défaut 4 = 1 par slot).
Usage
- Insère jusqu'à 4 cartes SD GoPro (USB readers ou slot natif)
- Lance l'app → ↻ Rescan détecte les cartes (auto-rescan toutes les 3s)
- Vérifie les slots A/B/C/D affichés
- (Optionnel) Coche Dry-run pour simuler sans toucher S3
- Clique ▶ START INGEST → 4 workers parallèles, progress live
- À la fin → manifeste
<localDest>/<session-id>/manifest.json(sha256, S3 URI, status par fichier) - ✕ Cancel pour interrompre proprement
Format manifeste
{
"sessionID": "cosma-20260427-2200",
"entries": [
{
"source": "/media/sd-A/DCIM/100GOPRO/GX010001.MP4",
"localDest": "/data/cosma/sessions/cosma-20260427-2200/A/DCIM/100GOPRO/GX010001.MP4",
"s3Path": "s3://cosma-field-data/cosma-20260427-2200/A/DCIM/100GOPRO/GX010001.MP4",
"sha256": "abc123...",
"bytes": 524288000,
"status": "done"
}
]
}
Statuts : local | s3 | done | error | dry-run.
Build (depuis sources)
Pré-requis
- Go 1.22+
- Node 18+
- Wails CLI :
go install github.com/wailsapp/wails/v2/cmd/wails@latest - Linux :
apt install libgtk-3-dev libwebkit2gtk-4.1-dev - Windows cross-compile depuis Linux :
apt install gcc-mingw-w64-x86-64 - macOS : build sur un Mac (Xcode CLI tools)
Commandes
# Linux natif
wails build -tags webkit2_41 -platform linux/amd64
# Windows depuis Linux
CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ wails build -platform windows/amd64
# macOS (sur Mac)
wails build -platform darwin/amd64 # Intel
wails build -platform darwin/arm64 # Apple Silicon
wails build -platform darwin/universal # Universal binary
Sortie dans build/bin/.
Dev mode (hot reload)
wails dev -tags webkit2_41
Architecture
field-sync-gui/
├── app.go # orchestrateur Wails (méthodes exposées au frontend)
├── main.go # entrypoint Wails
├── internal/
│ ├── config/ # .env loader
│ ├── detect/ # gopsutil → SD cards detection
│ ├── copier/ # CopyLocal (sha256 streaming) + CopyS3 (s5cmd) + Pool workers
│ └── manifest/ # JSON atomic writer (lock + tmp+rename)
├── frontend/
│ ├── src/
│ │ ├── App.svelte # UI 4 slots + boutons + progress bars
│ │ ├── style.css # Tailwind directives
│ │ └── main.ts
│ ├── tailwind.config.js
│ └── postcss.config.js
└── build/bin/ # binaires output
Méthodes Wails exposées
| Méthode | Signature | Rôle |
|---|---|---|
ScanCards() |
[]SDCard |
Détecte cartes SD (4 max) |
StartIngest(slots) |
[]SlotPayload → error |
Lance ingest 4 workers |
CancelIngest() |
error |
Cancel ctx en cours |
GetSnapshot() |
Snapshot |
État courant (slots + config) |
SetDryRun(b) |
bool |
Toggle dry-run |
LoadConfig() |
config.Config |
Recharge .env |
Events Wails : slot-update (par worker), session-done (fin de session).
Limitations connues / TODO
- macOS : pas de build cross-OS depuis Linux (osxcross trop lourd, build sur Mac requis)
- Windows : code-signing absent (warning SmartScreen au premier run)
- Pas de mode resume après crash (TODO : reprendre manifeste partiel)
- Pas de vérif ETag S3 post-upload (TODO : compare sha256 ↔ ETag pour fichiers <5GB)
- Pas de hook Discord/Webhook fin de session (TODO)
- Détection SD : heuristique (paths
/media/,/Volumes/, optremovable) — peut nécessiter ajustement par OS
Licence
Internal Cosma — non distribué publiquement.