Politique de confidentialité — Table Companion
Ce document décrit factuellement le fonctionnement actuel de l'application et de son serveur. Il ne constitue pas un avis juridique.
1. Principe local-first
Table Companion est conçu pour fonctionner d'abord en local. Pour une table sans Foundry VTT, le contenu de jeu créé dans l'application (personnages, tables, documents/handouts, images, état de partie et historique des dés) reste sur vos appareils et n'est partagé qu'entre les appareils de la table, via le réseau local ou une connexion pair-à-pair WebRTC.
Le serveur public sert surtout à mettre les appareils en relation : identité technique d'appareil, annuaire d'invitations, signalisation WebRTC, configuration et identifiants temporaires TURN, connecteur Foundry optionnel et relais optionnel de sauvegardes chiffrées.
2. Identité d'appareil
L'application n'utilise pas de compte nominatif. À l'enregistrement, le serveur crée un identifiant d'appareil anonyme et un jeton aléatoire de 32 octets. Le jeton en clair est remis une seule fois à l'application ; le serveur ne stocke que son empreinte SHA-256.
La base serveur conserve l'identifiant d'appareil, l'empreinte du jeton, la plateforme déclarée (iOS, Android ou vide), la date de création et la dernière activité vue par le serveur.
3. Invitations, présence et connexion entre pairs
Les invitations contiennent le code d'invitation, l'appareil propriétaire, l'identifiant de table, un petit bloc JSON de mise en relation, éventuellement l'identifiant du monde Foundry associé, et éventuellement l'empreinte d'une clé de reprise GM. Leur durée de vie est de 24 heures ; les battements de présence peuvent prolonger cette durée, et les invitations expirées sont supprimées par balayage périodique.
La signalisation WebRTC est relayée en mémoire pendant la connexion. Si le MJ n'est pas encore connecté, le serveur peut garder temporairement la dernière offre d'un joueur et jusqu'à 64 candidats ICE pendant 60 secondes au maximum. Les identifiants TURN sont temporaires : ils expirent au bout d'une heure et sont générés par HMAC pour le serveur coturn.
4. Foundry VTT optionnel
Si vous liez un monde Foundry VTT, l'application envoie l'URL Foundry, le nom d'utilisateur et le mot de passe au serveur afin qu'il se connecte en votre nom. Le mot de passe Foundry n'est pas stocké en clair : il est chiffré avec NaCl secretbox et une clé serveur conservée dans l'environnement de production, pas dans la base de données.
Pour maintenir la synchronisation, le serveur conserve aussi les métadonnées du monde (URL, nom d'utilisateur, identifiant utilisateur Foundry résolu, statut de connexion, version Foundry, système de jeu, capacités du module) et une projection SQLite des documents Foundry bruts nécessaires à l'application : acteurs, objets, scènes, utilisateurs, combats, messages de discussion, journaux et dossiers. Les écritures en attente vers Foundry peuvent aussi être conservées dans une file SQLite jusqu'à leur application.
Le jeton de récupération d'un monde est remis à l'application ; le serveur n'en stocke que l'empreinte SHA-256. Le sealed bundle remis à l'application contient les identifiants Foundry chiffrés par la clé serveur : l'appareil le garde pour la restauration, mais ne peut pas le déchiffrer. La suppression d'un monde lié efface les identifiants chiffrés, les projections Foundry, les membres et la file d'écritures associée.
5. Sauvegardes de campagne optionnelles
Les sauvegardes de campagne sont chiffrées de bout en bout sur l'appareil avant l'envoi. Le serveur ne reçoit ni ne possède la clé de déchiffrement ; il stocke seulement un bloc chiffré opaque et ne peut pas le lire.
Pour chaque sauvegarde, le serveur conserve : un identifiant de sauvegarde, l'identifiant de l'appareil propriétaire, l'empreinte SHA-256 du jeton de récupération, le ciphertext, le nombre d'octets en clair déclaré par le client, la date de création et la date de dernière mise à jour. Le jeton de récupération en clair n'est jamais stocké et circule dans le corps JSON, pas dans l'URL.
Un appareil peut posséder au maximum 20 emplacements de sauvegarde distincts. Le corps d'un envoi est plafonné à 64 Mo. Une sauvegarde non touchée est supprimée après 90 jours ; un téléchargement réussi ou un nouvel envoi met à jour la date de dernière activité et prolonge donc la conservation.
6. Journaux et données techniques
Le serveur traite temporairement des données de connexion, notamment les adresses IP, pour établir les connexions, appliquer les limites de débit et exploiter Caddy, Docker, coturn et l'API. Les journaux applicatifs Go enregistrent les requêtes non-health avec méthode, chemin, statut, taille de réponse, durée, identifiant de requête et identifiant d'appareil ; ils n'enregistrent pas les mots de passe, jetons, ciphertexts de sauvegarde ou contenus de requêtes sensibles.
Dans la configuration versionnée actuelle, Caddy n'active pas de journal d'accès dédié et Docker/coturn ne définissent pas de durée de conservation applicative spécifique. La durée effective des journaux d'infrastructure dépend donc de la rotation système du VPS.
7. Autorisations Android
L'application Android déclare les autorisations nécessaires au fonctionnement réseau et aux retours de jeu : accès Internet, état réseau/Wi-Fi, changement du mode multicast Wi-Fi, découverte locale via NEARBY_WIFI_DEVICES sur Android 13+ ou localisation réseau sur Android 12 et versions antérieures, notifications, vibration, service de synchronisation au premier plan, tâches initiées par l'utilisateur et redémarrage pour relancer les tâches planifiées.
Le manifeste déclare la caméra comme fonctionnalité optionnelle, mais pas l'autorisation CAMERA. Le scan de QR code utilise le scanner de codes de Google Play Services, sans permission caméra propre à l'application.
8. Publicité, analytics et partage
Table Companion n'affiche pas de publicité, n'utilise pas de SDK analytics tiers et ne revend pas les données. Le collecteur de crash est actuellement un no-op : aucun rapport de crash ou diagnostic n'est envoyé par la version Android actuelle.
Les données sont partagées uniquement pour fournir les fonctions demandées : entre appareils de la même table, avec votre serveur Foundry si vous activez l'option Foundry, ou via les relais techniques nécessaires à la connexion.
9. Enfants
Table Companion n'est pas destiné aux enfants de moins de 13 ans.
10. Vos droits et suppressions
La plupart des données de jeu créées dans l'application sont locales : les supprimer dans l'application ou désinstaller l'application les supprime de l'appareil. Les invitations expirent automatiquement après 24 heures sans renouvellement. Les sauvegardes chiffrées peuvent être remplacées, récupérées ou supprimées via leur jeton de récupération, et expirent après 90 jours sans activité.
Pour les données conservées côté serveur, notamment une identité d'appareil, une liaison Foundry ou une sauvegarde chiffrée, vous pouvez utiliser les fonctions de l'application quand elles existent ou contacter l'adresse ci-dessus. Si cette politique change, la date de mise à jour en haut de page sera modifiée.