sync-hub
Un petit démon local (macOS uniquement — launchd, ~/Library/...) qui centralise, verbatim,l'historique de tes conversations IA locales (Claude Code, Codex CLI, Claude Cowork, Antigravity,imports Claude.ai/ChatGPT) dans une base SQLite unique, et l'expose :
- via un dashboard web (arbre de projets, recherche plein texte, vue chat, couverture desynchro, triage des sessions non rattachées) ;
- via un serveur MCP que Claude Code, Codex et Antigravity peuvent interroger en direct pourrécupérer le contexte exact d'un autre outil, sans jamais résumer ni reconstruire — toujours letexte original.
Rien n'est jamais deviné : une session dont le dossier de travail ne correspond à aucun projetconnu part dans un bucket « Non affecté », visible et triable, plutôt que d'être rattachée parheuristique.
Pourquoi
Travailler avec plusieurs outils d'IA sur les mêmes projets fait perdre le contexte à chaquechangement d'outil. sync-hub ne synchronise rien vers les outils (il ne touche jamais austockage natif d'un autre outil) — il lit ce qui existe déjà localement et le rend interrogeablepar n'importe quel outil connecté en MCP.
Installation
Prérequis : macOS, Node.js ≥ 20 (better-sqlite3 a un prebuild pour les versions récentes — pasbesoin d'outils de compilation dans le cas courant).
git clone <url-de-ce-repo>
cd sync-hub
npm install
npm run build
./scripts/enroll.sh # rattache la machine au hub d'équipe (voir ci-dessous)
./scripts/install_service.sh # service launchd macOS, démarre à la connexion
Le dashboard est servi sur http://127.0.0.1:4000 (local uniquement par défaut). Au premierlancement il affiche les applications IA détectées sur la machine, l'état d'enrôlement et oùdéposer les archives cloud.
Pour désinstaller : ./scripts/uninstall_service.sh.
Rejoindre le hub d'équipe
Chaque personne installe sync-hub sur sa propre machine. Le démon local lit ce que les outils IAont déjà écrit sur le disque, puis pousse vers un hub commun qui sert de sauvegarde et de point departage. Rien n'y est visible par les autres tant que le projet n'a pas été explicitement partagé.
- Se faire créer un compte sur le hub par un administrateur (menu compte → Gérer lesutilisateurs).
- Créer un jeton d'appareil : se connecter au hub, menu compte → Jetons d'appareil, nommerla machine. Le jeton n'est affiché qu'une fois.
- Enrôler la machine :
./scripts/enroll.sh. Le script vérifie le jeton auprès du hub avantde le ranger dans le trousseau macOS — il n'est jamais écrit dans un fichier ni passé enargument de commande, où l'historique du shell le garderait.
Un jeton par machine : perdre un portable se règle en révoquant son jeton, sans toucher à ceux desautres. Une machine non enrôlée fonctionne normalement en local, simplement sans sauvegardedistante — l'installateur le signale plutôt que de laisser croire le contraire.
Partager un projet
Depuis l'arborescence, l'icône de partage sur un projet, puis l'email du collègue. Le partage donnela lecture ; seul le propriétaire peut partager, et il peut retirer l'accès à tout moment. Pourquelqu'un sans compte, les liens publics par conversation restent la bonne option.
Conversations cloud
Claude.ai et ChatGPT ne stockent rien sur la machine : leur historique n'arrive que par un export.Demander l'archive dans les réglages de chaque outil, puis déposer le .zip dans l'ongletSynchronisation & Appareils (ou depuis l'écran d'accueil au premier lancement).
Variables d'environnement (toutes optionnelles)
| Variable | Défaut | Usage |
|---|---|---|
SYNC_HUB_PROJECTS_ROOT |
~/Projets |
Racine scannée pour découvrir les projets |
SYNC_HUB_DATA_DIR |
<repo>/data |
Emplacement de la base SQLite et des logs |
SYNC_HUB_IMPORTS_DIR |
<repo>/imports |
Dossier des exports bulk (ChatGPT, Claude.ai) |
PORT |
4000 |
Port du dashboard/API |
HOST |
127.0.0.1 |
Interface d'écoute (reste local par défaut) |
SYNC_HUB_REMOTE_URL |
(aucun) | Hub d'équipe vers lequel pousser/tirer |
SYNC_HUB_REMOTE_TOKEN |
(trousseau) | Jeton d'appareil — normalement lu du trousseau par run_daemon.sh, pas défini à la main |
SYNC_HUB_DISABLE_LOCAL_INGEST |
0 |
1 sur le hub : il reçoit, il ne scanne aucun fichier |
SYNC_HUB_AUTH_DISABLED |
0 |
1 pour désactiver l'authentification (instance mono-utilisateur) |
Connecter le serveur MCP
# Claude Code
claude mcp add sync-hub -s user -- node <repo>/dist/server/mcp-entry.js
# Codex — dans ~/.codex/config.toml
[mcp_servers.sync-hub]
command = "node"
args = ["<repo>/dist/server/mcp-entry.js"]
Outils exposés :
- lecture verbatim :
get_project_timeline,get_thread,search_transcripts - continuité entre fils :
link_threads,unlink_thread,get_thread_link_updates(delta-only) - gestion de projets (mêmes actions que le dashboard) :
list_projects,list_threads,rename_project,merge_projects,assign_thread_to_project,archive_thread,archive_project
Importer un export Claude.ai / ChatGPT
Dépose le(s) fichier(s) d'export dans imports/claude/ ou imports/chatgpt/, puis relance un scan(bouton « Rescanner » du dashboard, ou POST /api/sync/rescan).
Développement
npm run dev # client (Vite) + serveur (tsx watch) en parallèle
npm test # suite de tests (vitest)
npm run lint # typecheck
Architecture
src/core/db.ts— schéma SQLite + accès aux données.src/core/registry.ts— résolution projet ↔ session (correspondance exacte uniquement, jamaisde heuristique).src/core/adapters/— un adaptateur par source (Claude Code, Codex, Cowork, Antigravity, exports bulk).src/core/watch.ts— watch temps réel des nouvelles sessions.src/core/mcp-server.ts— serveur MCP.src/server/— API REST + WebSocket (Fastify).src/client/— dashboard (React + Vite + Tailwind).