Tessera — QR codes dynamiques privacy-first
Rediriger un QR après impression, mesurer sans pister, et tout self-héberger
Contexte
Un QR code imprimé est figé à vie — sauf s'il est dynamique. Tessera fait passer chaque code par un lien court que l'on contrôle, pour changer la destination à tout moment sans réimprimer. Le projet est pensé dès le départ comme open-source, self-hostable et respectueux de la vie privée.
Le défi
Offrir des redirections dynamiques à faible latence et des analytics réellement utiles, sans jamais trahir la promesse de confidentialité ni enfermer l'utilisateur : ses codes doivent continuer à fonctionner même s'il quitte le service, et ses scans ne doivent laisser aucune trace identifiante.
Les solutions de QR dynamiques du marché enferment l'utilisateur : si l'abonnement s'arrête, les codes pointent vers une page marketing (ou meurent), et chaque scan alimente un pisteur tiers.
Des codes qui résolvent toujours vers un fallback choisi par leur propriétaire, des analytics au pays sans aucun stockage d'IP, et une stack entièrement self-hostable sous licence MIT.
L'approche
Backend Symfony 7 / API Platform 4, mais l'endpoint de redirection est un contrôleur nu (hors API Platform) pour la latence, adossé à un cache de slug Redis. Les redirections sont toujours en 302 — la destination est mutable, un 301 mis en cache casserait le produit. Le logging des scans est asynchrone via Symfony Messenger pour ne jamais bloquer la redirection. La géolocalisation se limite au pays via une base GeoLite2 locale : l'IP sert à dériver le pays puis est jetée, jamais stockée. Front Angular avec i18n à l'exécution (5 langues : EN/FR/ES/IT/DE) via Transloco. Déploiement en une seule commande Docker Compose.
Aperçus
Résultats
Version 1.0.0 livrée et fonctionnelle de bout en bout, self-hostable en une commande, avec une démo guidée publique (données isolées par session). Projet open-source structuré comme un vrai produit communautaire : licence MIT, intégration continue et analyse CodeQL, guide de contribution et politique de sécurité. La couche de facturation (domaine personnalisé, branding, équipes) est conçue mais désactivée derrière un flag — le self-host reste l'offre gratuite.