Jules Galliotdesign & ingénierie produit · indépendant Me contacter

PanoptiCool

Un outil hors ligne qui ouvre les exports de données personnelles d’Instagram et de TikTok, et les rend lisibles. Tout se passe dans le navigateur.

Nature
projet propre, ouvert
Rôle
conception, code
Chantier
18 juin → 5 août 2026
Dépôt public
45 commits
Licence
AGPL-3.0-only
Connecteurs
Instagram, TikTok
Décisions gelées
8 ADR
Fichiers TS
293
dont tests
86
Construction
Astro, statique
Interface
îlots Preact
Moteur
TS pur, Web Worker
Tests
Vitest 4
Qualité
Biome
Exécution
Node 22 LTS
Jeux d’essai
Python, stdlib
Modèle local
llama.cpp, en option
Serveur
aucun
Langues
français, anglais
Site
panopti.cool
Code
github

Le problème

Instagram et TikTok sont tenus de remettre une copie des données conservées sur un utilisateur qui en fait la demande. Ils le font, sous la forme d’une archive de fichiers JSON : conforme à la loi, illisible en pratique.

Ce qu’elle contient est plus large qu’on ne l’imagine. Sur un compte Instagram de dix ans : les conversations et les photos échangées, les lieux d’où le compte s’est connecté, les centres d’intérêt que la plateforme lui a attribués, la liste des annonceurs qui l’ont ciblé.

Et ce n’est qu’une part. L’export est ce que la plateforme accepte de rendre, pas ce qu’elle sait. Les scores, les segments publicitaires et les modèles construits à partir de ces données n’y figurent pas.

Pourquoi ce sujet, maintenant

Deux textes de 2026 posent la même question : jusqu’où identifier les gens pour les protéger.

Le 14 août, le Conseil constitutionnel a censuré l’interdiction des réseaux sociaux aux moins de quinze ans. Un des motifs : la loi ne disait ni comment l’âge devait être justifié, ni dans quelles limites. Contrôler l’âge de tous suppose d’identifier tout le monde.

Le 9 juillet, le Parlement européen a prolongé jusqu’en avril 2028 le régime volontaire de détection dans les messageries. Le règlement CSAR, dit « Chat Control », qui rendrait cette détection obligatoire, est toujours en négociation.

Ces textes décident de ce qui sera collecté demain. L’export, lui, existe déjà, et le lire ne demande l’autorisation de personne.

Le parti pris

Aucun serveur. Le site est un fichier statique ; l’archive est lue par le navigateur, et l’analyse tourne sur le poste du visiteur. Rien n’est téléversé, faute d’endroit où téléverser.

Le code est public sous AGPL. Le choix de licence est délibéré : il interdit de reprendre le moteur dans un service en ligne fermé.

Ce que ça coûte : tout dépend de la machine. Un export Instagram pèse plusieurs gigaoctets, et c’est la mémoire qui plafonne en premier.

Deux exports, deux lectures

Instagram et TikTok ne rendent pas la même chose. PanoptiCool n’en fait donc pas la même page.

Instagram

Presque tout est directement lisible : identité, lieux, conversations, comptes croisés, médias. Le travail consiste à trier, et surtout à décider quoi ne pas afficher.

TikTok

La liste des vidéos vues n’est qu’une suite de liens, sans titre ni sujet : inexploitable hors ligne. Le profil se reconstruit à partir des recherches, des commentaires et des comptes suivis.

Même moteur, deux produits distincts. C’est la règle qui vaudra pour les plateformes suivantes.

Comment ça marche

L’archive est déposée sur la page. Le navigateur la décompresse lui-même, puis passe le contenu à un moteur qui tourne dans un Web Worker : un fil d’exécution à côté de la page, pour qu’elle ne se fige pas pendant l’analyse.

La lecture se fait en flux. Un export TikTok contient des dizaines de milliers d’entrées de visionnage dont seule la date est retenue ; tout charger en mémoire pour ça ferait tomber l’onglet. On lit, on garde la date, on jette.

Le fichier est validé à l’entrée, jamais en sortie : ce qui arrive vient d’une plateforme, donc d’un tiers. Une archive tronquée, mal formée ou trop lourde est refusée avec le motif, plutôt qu’un écran blanc.

Deux analyses qui n’ont rien à voir

Le même export passe par deux chemins indépendants. Le premier tourne toujours ; le second ne démarre que sur demande.

Le moteur · déterministe

Il repère des mots d’un lexique dans les commentaires et les recherches, puis applique trois filtres : la négation (« je ne suis pas déprimé » ne compte pas), la citation (une phrase rapportée n’est pas celle de son auteur), la troisième personne (« mon frère a… » parle de quelqu’un d’autre).

Même fichier, même résultat. Chaque déduction affiche le mot qui l’a produite, surligné dans le commentaire d’origine.

Le modèle local · en option

Il lit les mêmes textes et déduit ce qui n’y est pas écrit. Il tourne en local, via llama.cpp, sur un clic. Il reçoit les commentaires bruts et rien d’autre : un banc d’essai a montré que tout ajout dégradait la sortie.

En échange, il n’est pas reproductible, il dépend du modèle installé, et il peut se tromper avec aplomb. D’où le second chemin.

Les lexiques français et anglais sont appliqués à tous les items, sans détecter la langue. Les trois filtres échouent du bon côté : au pire une déduction est ratée, jamais inventée. Un détecteur de langue sur une recherche de trois mots ferait l’inverse.

Le modèle repart du .zip, pas du résultat du moteur. Le moteur ne conserve que les preuves citées par une déduction, jamais la liste complète des commentaires : lui faire porter cette liste aurait été plus simple, et aurait fait sauter la limite de mémoire sur laquelle le reste repose.

Ce qui a été mesuré

Octets envoyés
0
l’export ne quitte pas la machine
Comptes requis
0
aucune inscription
Serveurs
0
build statique
Archive lue
0–5 %
la part exploitable d’un export TikTok

Le dernier chiffre est le plus parlant : quelques pour cent d’un export TikTok suffisent à reconstituer un profil. Le reste n’est pas exploité parce qu’il n’est pas exploitable hors ligne, et l’outil le dit au lieu de le combler.

Écrans

L’accueil, en anglais. Local, ouvert, sans compte : annoncé d’entrée.
Instagram — les comptes croisés, rendus comme une foule où l’on peut entrer.
TikTok — une déduction et les commentaires dont elle sort. Données de démonstration, entièrement synthétiques.

Ce que le projet démontre

  • Le profilage n’attend pas l’IA Sur TikTok, les commentaires et les recherches suffisent à sortir des constats précis — rythmes, thèmes, centres d’intérêt — avec un lexique et trois filtres contextuels. Pas de modèle, pas d’apprentissage : de la correspondance de mots et des règles. Ce qu’une plateforme déduit d’un compte est à portée de moyens ordinaires.
  • Un petit modèle quantisé fait le reste Lancé en local sur quelques milliers de commentaires bruts, il retrouve ce que le lexique ne voit pas : des dynamiques de fond, des comportements, des centres d’intérêt réels plutôt que déclarés. Aucun centre de données n’est nécessaire — un ordinateur portable suffit.
  • Consulter ses données est inconfortable, et nécessaire C’est le seul moment où « profil publicitaire » cesse d’être une abstraction. Le produit est construit pour que ce moment reste tenable : cartes sensibles repliées, déductions au conditionnel, preuve visible sous chacune. L’inconfort doit venir du constat, jamais de la façon dont il est présenté.

Un cas voisin du vôtre ?

Estimer mon projet Me contacter