Anonyfiles est une solution open source complète pour l’anonymisation automatisée de documents texte, tableurs et fichiers bureautiques. Elle s’appuie sur des technologies de traitement du langage naturel (spaCy) et des stratégies avancées de remplacement (Faker, codes, placeholders, etc.).
À force d’utiliser l’intelligence artificielle dans des cas variés, un besoin simple mais essentiel s’est imposé : 👉 pouvoir anonymiser rapidement des données textuelles avant de les soumettre à un traitement externe (IA, workflow, audit, etc.).
Mais l’objectif ne s’arrêtait pas là : 🔁 Pouvoir désanonymiser un fichier traité grâce à un mapping généré pendant l’anonymisation faisait aussi partie des ambitions du projet.
Et comme je suis curieux et passionné, je me suis dit : autant en profiter pour aller plus loin 🧠 en créant une solution complète, modulaire et réutilisable, avec API, CLI et interface graphique moderne.
anonyfiles_core
: bibliothèque Python contenant tout le moteur d’anonymisation et de désanonymisation.anonyfiles_cli
: outil en ligne de commande s’appuyant sur anonyfiles_core
pour traiter les fichiers localement.anonyfiles_api
: API REST (FastAPI) qui utilise également anonyfiles_core
afin d’exposer les mêmes fonctionnalités à distance.La GUI Tauri, située dans anonyfiles_gui
, s’appuie elle-même sur l’API pour offrir une interface graphique.
.txt
, .csv
, .docx
, .xlsx
, .pdf
, .json
[REDACTED]
, codes séquentiels, etc.job_id
)anonyfiles/
ꜜ
├── README.md # Présent fichier
├── anonyfiles_core/ # Bibliothèque cœur
│ └── README.md # Documentation du moteur
├── anonyfiles_cli/ # Outil CLI (Python)
│ └── README.md # Documentation CLI détaillée
├── anonyfiles_api/ # API FastAPI pour appel distant
│ └── README.md # Documentation API détaillée
├── anonyfiles_gui/ # Interface graphique (Tauri / Svelte)
│ └── README.md # Documentation GUI détaillée
└── ...
Ce document décrit le chemin complet d'une requête depuis le client jusqu'au stockage des résultats ainsi que les relations entre la CLI, l'API et la GUI.
anonyfiles_core
.anonyfiles_core
.Extrait du README.md
montrant cette organisation :
* `anonyfiles_cli` : outil en ligne de commande s’appuyant sur `anonyfiles_core` pour traiter les fichiers localement.
* `anonyfiles_api` : API REST (FastAPI) qui utilise également `anonyfiles_core` afin d’exposer les mêmes fonctionnalités à distance.
La GUI Tauri, située dans `anonyfiles_gui`, s’appuie elle-même sur l’API pour offrir une interface graphique.
POST /anonymize
avec le fichier et les options.jobs/<job_id>
), écrit status.json
et lance run_anonymization_job_sync
en tâche de fond.AnonyfilesEngine
: lit le fichier, applique les règles d'anonymisation, écrit les fichiers de sortie (texte anonymisé, mapping CSV, log CSV, audit).status.json
à finished
ou error
et stocke le journal d'audit.GET /anonymize_status/{job_id}
ou la WebSocket /ws/{job_id}
puis télécharge éventuellement les fichiers avec GET /files/{job_id}/{file_key}
.Les fichiers générés sont stockés dans le dossier jobs/
(aucune base de données n'est utilisée par défaut).
sequenceDiagram
participant C as Client
participant A as API FastAPI
participant J as Job handler
participant E as AnonyfilesEngine
participant F as Jobs directory
C->>A: POST /anonymize (fichier)
A->>J: crée job + status pending
J->>E: lance anonymisation
E->>F: écrit fichiers de sortie
E-->>J: résultat (success ou error)
J->>F: met à jour status.json
C->>A: GET /anonymize_status/{job_id}
A->>F: lit status.json
A-->>C: statut + contenus
graph TD
subgraph Coeur
CORE["anonyfiles_core"]
end
CLI["anonyfiles_cli"] -->|utilise| CORE
API["anonyfiles_api"] -->|utilise| CORE
GUI["anonyfiles_gui"] -->|appelle la CLI| CLI
GUI -. optionnel .-> API
La CLI et l’API partagent le même moteur (anonyfiles_core
). La GUI interagit principalement avec la CLI pour réaliser l’anonymisation localement mais peut aussi appeler l’API si un serveur distant est disponible.
La CLI et l’API invoquent toutes deux le même moteur situé dans anonyfiles_core
.
Par exemple, la CLI démarre ainsi :
from anonyfiles_core import AnonyfilesEngine
engine = AnonyfilesEngine(config_path)
engine.anonymize_file("input.txt")
De son côté, l’API réutilise exactement cette classe pour traiter les requêtes :
from anonyfiles_core import AnonyfilesEngine
@router.post("/anonymize")
async def anonymize(file: UploadFile):
engine = AnonyfilesEngine(config_path)
# temporary async wrapper around `anonymize`
return await engine.anonymize_async(file)
Cet appel asynchrone utilise simplement asyncio.to_thread
pour exécuter la
méthode de base de façon non bloquante.
fr_core_news_md
git clone https://github.com/simongrossi/anonyfiles.git
cd anonyfiles
Chaque dossier (anonyfiles_core
, anonyfiles_cli
, anonyfiles_api
) possède son
propre requirements.txt
. Vous pouvez donc installer uniquement la partie qui
vous intéresse :
# Installation du moteur seulement
pip install -e anonyfiles_core
# Installation de la CLI uniquement
pip install -r anonyfiles_cli/requirements.txt
# Installation de l'API uniquement
pip install -r anonyfiles_api/requirements.txt
➡️ Voir anonyfiles_cli/README.md
Pour activer l'autocomplétion Bash, Zsh ou Fish :
anonyfiles_cli --install-completion bash # ou zsh/fish
➡️ Voir anonyfiles_gui/README.md
➡️ Voir anonyfiles_api/README.md
Afin d’isoler proprement les dépendances entre la CLI, l’API et la GUI, le projet utilise trois environnements virtuels distincts :
env-cli
→ pour anonyfiles_cli
(spaCy, typer…)env-api
→ pour anonyfiles_api
(FastAPI, pydantic…)env-gui
→ pour les éventuelles dépendances Python liées à la GUIDes scripts de configuration automatique sont disponibles à la racine du projet pour Linux/macOS et Windows :
Pour simplifier l'installation et l'exécution sous Linux et macOS, utilisez le Makefile
fourni à la racine du projet.
make setup
Cette commande va :
env-cli
, env-api
, env-gui
)fr_core_news_md
dans l'environnement env-cli
make cli # Lancer un exemple CLI
make api # Lancer l'API FastAPI
make gui # Construire les fichiers statiques de la GUI (build web)
make test-api # Lancer un test API (avec curl)
make clean # Nettoyer les environnements virtuels
Pour les utilisateurs Windows, utilisez les scripts PowerShell ou les fichiers batch :
./anonyfiles.ps1 -action setup # Crée les environnements et installe les dépendances
./anonyfiles.ps1 -action api # Lance l’API FastAPI
./anonyfiles.ps1 -action cli # Lance le moteur CLI
./anonyfiles.ps1 -action gui # Lance la GUI (Tauri)
./anonyfiles.ps1 -action clean # Supprime les environnements
anonyfiles.bat setup :: Crée les environnements et installe les dépendances
anonyfiles.bat api :: Lance l’API
anonyfiles.bat cli :: Lance le moteur CLI
anonyfiles.bat gui :: Lance la GUI (Tauri)
anonyfiles.bat clean :: Supprime les environnements
Les fichiers suivants sont disponibles à la racine du projet :
Makefile
anonyfiles.ps1
anonyfiles.bat
default_paths.toml
Les chemins de sortie par défaut peuvent être configurés dans le fichier
default_paths.toml
à la racine du projet. Exemple :
[paths]
output_dir = "~/anonyfiles_outputs"
mapping_dir = "~/anonyfiles_mappings"
log_dir = "~/anonyfiles_logs"
Ces valeurs seront chargées automatiquement par la CLI et la GUI pour
déterminer où écrire les fichiers générés. Vous pouvez également
fournir un autre fichier en définissant la variable d’environnement
ANONYFILES_DEFAULTS_FILE
qui pointera vers un fichier default_paths.toml
personnalisé. Exemple d’activation :
# Dans un shell
export ANONYFILES_DEFAULTS_FILE=/etc/anonyfiles/paths.toml
Ou dans un service Systemd :
[Service]
Environment=ANONYFILES_DEFAULTS_FILE=/etc/anonyfiles/paths.toml
Chaque entrée du fichier cli_audit_log.jsonl
est une ligne JSON.
En plus des champs existants (timestamp
, success
, error
, etc.),
les erreurs enregistrent désormais le command
exécuté et les arguments
passés à la CLI lorsque ces informations sont disponibles.
anonyfiles_core/README.md
anonyfiles_cli/README.md
anonyfiles_gui/README.md
anonyfiles_api/README.md
Priorité | Thème | État | Commentaire / Lien tâche |
---|---|---|---|
1 | Robustesse multi-format (TXT, CSV, DOCX, XLSX) | ✅ Fait | Moteur factorisé, détection commune |
2 | Remplacement positionnel fiable | ⚠️ Test/Debug | En cours de vérification |
3 | Détection universelle des dates et emails | ✅ Fait | Regex avancée + spaCy |
4 | Performance / gestion mémoire | 🔜 À venir | Streaming, lazy processing |
5 | Règles de remplacement par type (YAML) | ⚠️ Test/Debug | Règles personnalisées en test |
6 | Mapping codes <-> originaux | ⚠️ Test/Debug | Mapping inverse, audit, désanonymisation |
7 | Filtre exclusion (YAML / CLI) | ✅ Fait | Configurable, évite faux positifs |
8 | Support PDF / JSON | 🔜 À venir | PDF natif, JSON complet |
9 | Désanonymisation CLI (mapping inverse) | ⚠️ Test/Debug | Tests en cours |
10 | GUI avancée (drag & drop, prévisualisation) | 🚧 En cours | Tauri/Svelte, UX moderne |
11 | Copie, export, gestion multi-fichier dans la GUI | 🚧 En cours | Copier/coller, sélection, batch |
12 | Support anglais, espagnol, allemand | 🔜 À venir | Modèles spaCy additionnels |
13 | API asynchrone avec suivi de jobs (job_id ) |
✅ Fait | CORS, UUID, audit log complet |
Un guide détaillé (Docker, systemd, Nixpacks) est disponible dans
deploy/README.md
.
Le fichier deploy/anonyfiles-api.service
permet de lancer l'API comme service
systemd. Les réglages principaux s'appuient sur des variables d'environnement à
définir (par exemple dans /etc/default/anonyfiles-api
) :
ANONYFILES_USER
: utilisateur exécutant le serviceANONYFILES_HOME
: répertoire racine du projetANONYFILES_HOST
: adresse d'écoute d'uvicorn (ex. 127.0.0.1
)ANONYFILES_PORT
: port d'écoute de l'API (ex. 8000
)ANONYFILES_JOBS_DIR
: répertoire des jobs (défaut jobs
)Un fichier railway.json.example
est fourni à la racine pour simplifier un
déploiement via Railway. Copiez-le en railway.json
puis ajustez les valeurs
(nom du service, chemin de santé, variables d'environnement...) avant de
lancer votre déploiement.
Toute contribution est la bienvenue : bugfix, traduction, documentation, suggestion !
Avant de lancer les tests, installez les dépendances dédiées :
pip install -r requirements-test.txt
Les dépendances principales sont définies dans requirements.in
. Utilisez
pip-tools pour générer un
requirements.txt
figé :
pip install pip-tools
pip-compile requirements.in
pip-compile requirements-test.in # fige aussi les dépendances de test
Merci de créer une issue ou une PR avec un descriptif clair et un code lisible.
Projet distribué sous licence MIT. Voir LICENSE.
Pour toute question, consultez la documentation CLI/GUI/API ou ouvrez une issue sur GitHub.