# AnyDrop > Partage de fichiers et de texte instantané, multi-OS, peer-to-peer, sans compte. **Domaine de production :** `anydrop.arthurbarre.fr` **Auteur :** Arthur Barré **Status :** V1 — Web app (en cours) --- ## Vision produit AnyDrop est un "AirDrop universel" : il permet de partager fichiers, photos et texte instantanément entre **tous** les appareils (iOS, Android, macOS, Windows, Linux), quel que soit leur système d'exploitation, sans compte obligatoire et sans installation forcée. Deux modes de partage : 1. **Mode réseau local** — Deux appareils sur le même Wi-Fi se voient automatiquement (détection par IP publique partagée). 2. **Mode lien public** — L'utilisateur génère une URL courte `anydrop.arthurbarre.fr/x7k` + QR code, partageable à n'importe qui, n'importe où (transfert P2P à travers internet via STUN/TURN). Dans les deux cas, le transfert est **pair-à-pair** (WebRTC DataChannel), **chiffré** (DTLS), et **ne transite pas par le serveur**. --- ## Architecture technique ### Stack V1 **Front web** - React 18 + Vite + TypeScript - TailwindCSS - Zustand (state management) - `simple-peer` (abstraction WebRTC) - `qrcode.react` (génération QR code) - PWA (installable sur mobile/desktop) **Back signaling** - Node.js + TypeScript - `ws` (WebSocket) - Rooms en mémoire (pas de DB en V1) - Génération de codes courts (3-4 caractères, alphabet sans ambiguïté) **Infra** - Signaling : Railway / Fly.io - Front : Vercel / Netlify - STUN : `stun.l.google.com:19302` (gratuit) - TURN : Open Relay (gratuit) → coturn auto-hébergé plus tard ### Pourquoi WebRTC ? - Transferts **P2P** (rapides sur réseau local, 50-500 Mo/s) - **Chiffrement natif obligatoire** (DTLS) - Fonctionne dans tous les navigateurs modernes - Pas de coût bande passante serveur pour les données ### Rôle du serveur de signaling Le serveur **ne voit jamais les fichiers**. Il sert uniquement à : 1. Regrouper les pairs par "room" (IP publique ou code court) 2. Relayer les SDP offers/answers et ICE candidates entre les pairs 3. Notifier les connexions/déconnexions Une fois la connexion WebRTC établie, le serveur est transparent. --- ## Structure du repo ``` anydrop/ ├── CLAUDE.md # Ce fichier ├── docs/ # Documentation technique détaillée │ ├── architecture.md │ ├── webrtc-flow.md │ ├── signaling-protocol.md │ └── roadmap.md ├── web/ # React PWA (front utilisateur) ├── server/ # Node signaling WebSocket ├── shared/ # Types TypeScript partagés front/back └── package.json # Monorepo (npm workspaces) ``` --- ## Roadmap (résumé) - **Phase 1 — Web PWA** *(en cours)* : détection LAN, lien public + QR, transferts fichiers/texte - **Phase 2 — Extensions** : Chrome + Firefox (menu contextuel "Envoyer via AnyDrop") - **Phase 3 — Desktop** : Tauri (macOS + Windows + Linux, une base de code) - **Phase 4 — Mobile** : iOS + Android (React Native ou Flutter, Share Sheet natif) - **Phase 5 — Avancé** : chiffrement applicatif additionnel, transferts de dossiers, historique Détails dans `docs/roadmap.md`. --- ## Conventions - **Langue du code** : anglais (variables, commentaires, commits) - **Langue de la doc utilisateur** : français (site + UI) - **Commits** : style conventional commits (`feat:`, `fix:`, `docs:`, `refactor:`…) - **Pas de compte / pas de tracking** : valeur produit fondamentale, ne pas l'abandonner pour des "features" - **Pas de stockage côté serveur** des contenus échangés (les rooms sont en RAM, volatiles) --- ## Commandes principales (à venir une fois scaffoldé) ```bash npm install # installe le monorepo npm run dev # démarre front + signaling en parallèle npm run dev:web # uniquement le front (Vite) npm run dev:server # uniquement le signaling npm run build # build production npm run typecheck # vérification TS globale ``` --- ## Principes de développement 1. **Privacy by design** — Pas de logs de contenus, pas d'analytics intrusifs, codes de rooms éphémères. 2. **Zero-friction** — Ouvrir l'URL doit suffire. Pas de compte, pas d'email. 3. **Progressive enhancement** — Le web marche partout ; les apps natives ajoutent du confort, pas des features bloquantes. 4. **Un seul domaine, plusieurs clients** — Tous les clients (web, extensions, desktop, mobile) parlent au même signaling.