Changelog
Historique complet des mises a jour de LeadTouch.
1.0.15 Onglet Cibles, collecte avancée et France entière
5 avril 2026
Nouveautes
- Nouvel onglet « Cibles » dans le dashboard — permet de configurer le ciblage de la prospection sans toucher au fichier config.yaml
- 11 profils de ciblage predefinis — web, SEO, marketing, restauration, immobilier, comptable, formation, assurance, BTP, beaute, generaliste — chacun avec des filtres NAF et options adaptes au secteur
- 4 switches on/off personnalisables par profil : ignorer les entreprises avec site pro, garder les sites template (refonte), ignorer les personnes physiques, ignorer les structures publiques
- Gestion visuelle des codes NAF — exclusions par groupe (agriculture, commerces, BTP, etc.) avec checkboxes, et codes NAF prioritaires (jamais filtres meme s'ils sont dans les exclusions)
- Panneau « Parametres avances » (pliable) — visualise la configuration complete du profil selectionne, permet d'editer chaque parametre pour creer un profil personnalise sans modifier les profils predefinis
- Collecte avancée Sirene — bouton dédié dans le panneau de run, ouvre un modal avec filtres : créneau de dates, catégorie juridique (SAS, SARL, auto-entrepreneur, etc.), tranche d'effectifs, état administratif, codes NAF, départements. Collecte uniquement sans enrichissement ni envoi
- Option « France entière » — disponible dans le sélecteur de département et dans la collecte avancée, couvre les 101 départements (métropole + DOM)
- Collecte par batches — les départements sont traités par groupes de 10 pour respecter les limites API, avec arrêt propre possible entre chaque batch
Ameliorations
- Les filtres NAF, structures publiques et personnes physiques du pipeline ne sont plus codes en dur — ils sont lus dynamiquement depuis le profil de ciblage actif
- Le filtre « site pro » est desormais controle par le profil de ciblage (
skip_has_website) au lieu de service_type
- Nouvelle section
targeting: dans config.yaml avec profil de base et overrides
- Textarea « sender_activity » agrandi dans l'onglet Configuration (largeur 100%, hauteur min 220px)
- Script de déploiement (
deploy-site.bat) corrige automatiquement les permissions fichiers (chmod 755/644) après chaque envoi
- Le dashboard s'ouvre désormais dans une fenêtre dédiée sans barre d'URL (Edge/Chrome en mode
--app) — aspect application native, fallback navigateur classique si indisponible
1.0.14 Desabonnement RGPD, engagement email et envoi progressif
4 avril 2026
Nouveautes
- Desabonnement RGPD complet — le lien de desinscription pointe vers leadtouch.fr, identifie le client emetteur et synchronise automatiquement les desabonnements au demarrage du pipeline (ajout a la blacklist locale)
- Stats d'engagement email — les ouvertures, clics et bounces sont agreges par email et envoyes au serveur LeadTouch en batch de 25 pour calculer un score d'engagement global
- Sync Mailjet periodique — les evenements Mailjet (ouvertures, clics, bounces, spam) sont desormais synchronises toutes les 50 iterations pendant l'enrichissement, et non plus uniquement en fin de pipeline
- KPI tracking sur le dashboard — 4 nouvelles cartes : ouvertures, clics, taux d'ouverture et taux de clic, affichees sous les KPI existants
- Envoi progressif — option activable dans la configuration (Limites) qui augmente graduellement le nombre d'emails par run : 20% au run 1, 40% au run 2, jusqu'a 100% au run 5+
- Envoi d'email de test — bouton « Envoyer un test » dans l'onglet Template Email, ouvre un modal pour saisir l'adresse destinataire et envoie le template actuel avec des donnees fictives
- Score d'engagement — le serveur LeadTouch calcule un score 0-100 par adresse email (base sur les taux d'ouverture, clic et bounce agreges de tous les clients), visible dans l'import
Corrections de bugs
- Erreur
database is locked lors de la sync Mailjet pendant un run — timeout SQLite augmente a 30s et busy_timeout ajoute sur toutes les connexions critique
- Erreur
UNIQUE constraint failed: email_tracking.tracking_id — la contrainte UNIQUE sur tracking_id seul empechait d'enregistrer plusieurs evenements (open + click) pour un meme email. Migre vers UNIQUE(tracking_id, event_type) critique
Ameliorations
- Les adresses desabonnees sont automatiquement exclues de l'import et du browse (conformite RGPD)
- Route
/api/import/sync-unsubscriptions dans le dashboard pour synchroniser manuellement les desabonnements
- Tous les
INSERT INTO email_tracking passes en INSERT OR IGNORE pour eviter les doublons
1.0.13 Template email editable, quota intelligent et signalement de bugs
4 avril 2026
Nouveautes
- Template email editable depuis le dashboard — onglet dedie avec editeur HTML, previsualisation en iframe et restauration du template par defaut
- Validation des placeholders obligatoires (
{{subject}}, {{body}}, {{cta_text}}, {{unsubscribe_url}}) a la sauvegarde du template
- Signalement de bugs depuis la GUI — bouton « Signaler un bug »» dans la barre de statut, modal avec sujet et description
- Les signalements sont envoyes au serveur LeadTouch avec la version client et l'OS pour un suivi centralise
- Quota intelligent Mailjet — avant chaque envoi, la reputation est evaluee via l'API Mailjet Statistics (bounces, spam, blocked). Si degradee,
max_emails est reduit automatiquement (75%, 50%, 25% ou suspension totale)
- Fallback reputation locale — si l'API Mailjet est indisponible, le taux d'echec est calcule sur les 7 derniers jours de la table
sent_emails
- Masquage des donnees sensibles dans l'onglet Importer — les emails et telephones sont masques dans la previsualisation (ex:
j***@d***.com) avec icone cadenas. Les donnees completes ne sont visibles qu'apres import
- Synchronisation evenements Mailjet — les ouvertures, clics, bounces, spam et blocages sont recuperes automatiquement via l'API Mailjet en fin de pipeline. Le
MessageID Mailjet est stocke a l'envoi pour le suivi
- Actions automatiques sur evenements Mailjet : hard bounce →
invalid_email, spam complaint → blacklist automatique
- Nouvelle commande CLI
--check-mailjet pour synchroniser manuellement les evenements Mailjet des 14 derniers jours
Ameliorations
- Invalidation automatique du cache template dans le mailer apres modification depuis le dashboard
- Le template email n'est plus ecrase lors des mises a jour (preserve les modifications du client)
1.0.12 Performance, credits intelligents et monitoring serveur
3 avril 2026
Nouveautes
- Monitoring de charge serveur temps reel — calcul base sur req/s, req/min, connexions concurrentes et latence moyenne
- Rate limiting dynamique — adapte automatiquement selon la charge (300 → 150 → 60 req/min)
- Throttle adaptatif cote client — le pipeline interroge
/health toutes les 30s et ralentit automatiquement ses requetes API (0.4s/req a 60-85% de charge, 1.0s/req au-dessus de 85%)
- Retry automatique sur HTTP 429 — chaque requete API est retentee une seconde fois apres le delai
Retry-After du serveur
- Indicateur de charge dans le dashboard — le badge LeadTouch passe du vert au orange fonce selon la charge serveur
- Compteurs GET/POST dans Redis — partages entre tous les workers Gunicorn, drain de 75% de la capacite max toutes les 60s, pression ponderee (45% GET / 55% POST) integree comme 5e facteur de charge
- Charge serveur exposee dans
GET /api/health (load_percent, rps, rpm, concurrent, avg_latency_ms, active_clients, get_pending, post_pending)
Ameliorations
- PagesJaunes et 118712.fr passes en HTTP pur — suppression de Playwright/Chromium headless, enrichissement parallelise sans goulot d'etranglement (~20x plus rapide)
- Credits fractionnaires — consultation API avec email trouve : -1 credit, sans resultat : -0.25 credit seulement
- Credits stockes en DECIMAL cote serveur, affiches en entier dans la GUI et le dashboard
- Version client minimum requise : 1.0.12
1.0.11 Interface amelioree, optimisation ressources
3 avril 2026
Nouveautes
- Banniere ASCII au demarrage — logo LeadTouch stylise avec version, mode d'execution et departements
- Barres de progression visuelles —
[████████░░░░] 62% — 25/40 en console et barre graphique dans la GUI
- Resume de fin de pipeline en tableau — statistiques formatees sur plusieurs lignes avec couleurs par metrique
- Barre de progression GUI — Canvas custom avec pourcentage, mise a jour en temps reel pendant l'enrichissement
- Indicateur de phase GUI — affiche la phase en cours (Phase 1, Phase 2...) dans la barre de progression et la barre de statut
- Compteurs "Envoyes" et "Erreurs" ajoutes a la barre de stats GUI
Ameliorations
- Couleurs par niveau de log — WARNING en jaune, ERROR en rouge bold, DEBUG en gris attenue (console et GUI)
- En-tetes de phase stylises — encadres avec box-drawing characters en bleu bold (console), bold accent (GUI)
- Scores eleves (★ Score 8+) affiches en vert bold, resume final en magenta bold
- Timestamp raccourci — heure seule (
10:30:00) dans la console et la GUI, le fichier de log conserve le format complet
- Separateurs visuels ameliores — tirets fins et barres verticales au lieu de
=== et ---
- Tags GUI enrichis — en-tetes de phase et scores en gras, detection des nouveaux patterns (▶, ★, ┃)
- Suppression du nom du logger en console et GUI — economie d'espace, le fichier de log conserve l'info
- PagesJaunes et 118712.fr passes en HTTP pur — suppression de Playwright/Chromium headless, enrichissement parallelise sans goulot d'etranglement (~20x plus rapide)
- Caches memoire bornes (LRU) — presence web et tracking limites en taille pour eviter les fuites memoire
- Export Excel par curseur iteratif — plus de chargement complet en memoire sur les grosses bases
- Sessions HTTP reutilisables — connection pooling sur toutes les sources d'enrichissement et les API d'IA
- Regex pre-compilees dans la GUI et l'envoi d'email — reduction de la charge CPU
- Filtres NAF et deduplication optimises — prefixes pre-calcules et set comprehensions directes
- Liberation memoire apres la phase de collecte — donnees brutes et index de deduplication supprimes
- Connexions base de donnees securisees —
try/finally sur toutes les fonctions critiques
- Protection des callbacks GUI contre la fermeture de fenetre — plus de crash
TclError a l'arret
1.0.10 Production-ready : Gunicorn, health check et securite
3 avril 2026
Nouveautes
- Gunicorn multi-workers — 9 workers par defaut (2×cores+1), fallback automatique sur uvicorn si gunicorn absent
- Health check avance
GET /api/health — ping MariaDB (SELECT 1) + Redis (PING), retourne HTTP 503 si un service est down
- Credentials externalises — secrets charges depuis
api/.env via python-dotenv, plus aucun mot de passe en clair dans le code
- Script
deploy.bat — envoi automatique du setup + latest.json sur le serveur via SCP
Securite
- Protection XSS dans le dashboard — echappement HTML (
esc()) sur toutes les donnees utilisateur injectees via innerHTML
- Thread-safety Brave Search — acces concurrent a
_brave_exhausted_keys protege par Lock
- Rate limiting tracking — maximum 10 evenements par tracking_id (anti-spam ouvertures/clics)
Ameliorations
- Pool aiomysql agrandi —
minsize=10, maxsize=50 (au lieu de 5/20) pour supporter 9 workers Gunicorn
- Documentation corrigee — MariaDB au lieu de SQLite pour l'API, dependances mises a jour, scores SMS corriges, numerotation sources corrigee
1.0.9 Optimisation serveur API et verification de version
3 avril 2026
Nouveautes
- Verification de version obligatoire au demarrage — le serveur peut exiger une version minimum du client
- Endpoint
GET /api/check-version — retourne la compatibilite et la version minimum requise
- Fichier
api/requirements.json — configure la version client minimum cote serveur
- Dialogue de mise a jour — en mode console (oui/non) et en mode GUI (popup tkinter)
Ameliorations
- Serveur API entierement async — toutes les routes converties en
async def avec aiomysql
- Pool de connexions MySQL (5-20 connexions) — remplace la creation d'une connexion par requete
- 4 workers uvicorn par defaut — capacite multipliee par 4
- 5 index MySQL ajoutes —
postal_code+created_at, category, created_at, unsubscribed, naf_checked
- Cache en memoire pour categories et departements (TTL 5 min) — plus de GROUP BY a chaque appel
- Cache du trust score (TTL 1h) — economise un SELECT par soumission
- Pagination par curseur sur
/prospects/browse — performant meme avec des milliers de prospects
- Batch submit optimise — deduplication groupee avec
IN(...) au lieu de requetes individuelles
- Backfill INSEE en
aiohttp — appels reseau non-bloquants
- Capacite serveur estimee passee de ~10 a ~200-500 utilisateurs simultanes
1.0.8 Tracking emails, detection reponses et analyse de site
3 avril 2026
Nouveautes
- Tracking des ouvertures d'emails — pixel transparent 1x1 insere dans chaque email, statistiques en temps reel
- Tracking des clics — liens rediriges via le dashboard avec comptage (lien de desinscription preserve)
- Endpoint
/api/tracking — taux d'ouverture, taux de clic et 20 derniers evenements
- Detection automatique des reponses via IMAP — scan de la boite de reception en fin de pipeline
- Nouveau flag
--check-replies — lancer la detection des reponses manuellement
- Nouveau statut
replied — les prospects ayant repondu sont identifies automatiquement
- Analyse du site web des prospects — detection HTTPS, responsive, SEO, Open Graph, plateforme, performance
- Personnalisation des emails par IA — l'analyse du site est injectee dans le prompt pour mentionner des points d'amelioration concrets
Ameliorations
- Table
email_tracking en base — historique complet des ouvertures et clics (IP, User-Agent, date)
- Colonne
tracking_id dans sent_emails — lien entre email et evenements de tracking
- Colonne
site_analysis dans prospects — resume JSON de l'analyse du site stocke en base
- Deduction automatique du serveur IMAP depuis le SMTP (Gmail, Outlook, Yahoo, Zoho, IONOS, Free, Orange, SFR...)
- Normalisation recursive des sujets d'email pour le matching des reponses (Re: Fwd: TR: imbriques)
- Template email HTML inclus dans l'installateur Windows (copie a la racine a cote du .exe)
reply_checker ajoute aux hidden imports PyInstaller
1.0.7 Corrections, nouvelles fonctionnalites et robustesse
2 avril 2026
Nouveautes
- Lien de desinscription dans chaque email — page
/unsubscribe avec blacklist locale + API partagee
- Cache d'enrichissement (SQLite, TTL 7 jours) — evite les requetes redondantes sur les reruns
- Recherche avancee de prospects dans le dashboard — filtres par statut, departement, source, email, telephone, site, score, texte libre + pagination
- Notifications desktop Windows (toast) — run termine, erreur fatale, credits bas (< 50)
- Type de service configurable (
service_type) — web, SEO, marketing, compta, etc. Le filtre "site pro → skip" ne s'applique qu'en mode web
- Source d'enrichissement Hunter.io (optionnel, desactive par defaut) — domain search + email finder par dirigeant, quota mensuel configurable (25 req/mois gratuites)
- Bot LinkedIn autonome — simule un usage humain (scroll, likes, visites) et enrichit les prospects en arriere-plan avec planning journalier aleatoire
- Lancement du bot LinkedIn depuis l'interface graphique — detection automatique de la premiere connexion
Corrections de bugs
- Connexion base de donnees utilisee apres fermeture dans le pipeline critique
- Departement "Charente (16)" code en dur dans le prompt Gemini Search — desormais extrait du code postal critique
- Fuites de connexions SMTP dans l'envoi, la verification et la devinette d'emails (3 fonctions corrigees) critique
- Double debit de credits lors de l'import depuis le dashboard critique
- Connexion DB non fermee en cas d'erreur dans l'import dashboard critique
- Log du pipeline GUESS affichait la meme metrique deux fois
- Crash si un modele IA mal configure (format sans ":")
- Champ
created_at vide par defaut au lieu de la date courante
- Crash si l'API BODACC renvoie un format inattendu dans le champ registre
Securite
- Systeme de desinscription RGPD — prospects desinscrits exclus de l'API (plus de credits perdus)
- Echappement HTML du sujet et du bouton CTA dans les emails (prevention injection)
- Validation des bornes min/max sur les parametres numeriques du dashboard (workers, delais, limites)
--once et --daemon mutuellement exclusifs (argparse enforce)
Ameliorations
- Scoring intelligent — prospects tries par score dans la file d'envoi (meilleurs en premier)
- Gestion des reponses JSON invalides sur les 5 sources de collecte (Sirene, RNA, BODACC, JOAFE, INPI)
- Lock de thread-safety sur l'etat du pipeline dashboard
- Constantes nommees pour les timeouts du client API
- Activation des couleurs ANSI Windows via l'API kernel32 (remplace
os.system(""))
- Protection contre les dates futures dans le scoring
- Nettoyage des imports inutilises et des stats mortes
1.0.6 Filtre fantome, tracking et auto-update
2 avril 2026
Nouveautes
- Tracking des sources d'emails (quelle source a trouve chaque email)
- Compteurs en direct dans l'interface (enrichis, envoyes, erreurs)
- Systeme d'auto-update integre (verification + telechargement automatique)
- Relance des anciens prospects sans email (
--retry-old)
Ameliorations
- Filtre fantome relaxe — un telephone seul laisse passer vers les sources API
1.0.5 Dashboard et API collaborative
31 mars 2026
Nouveautes
- Dashboard web local (Flask, stats temps reel, graphiques Chart.js)
- API LeadTouch collaborative — partage et consultation de prospects enrichis
- Systeme de credits (1000 offerts, +1 par partage, -1 par consultation)
- Interface graphique native (tkinter, system tray, logs en direct)
- Inscription automatique a l'API au premier lancement
1.0.4 Enrichissement Gemini Search
30 mars 2026
Nouveautes
- Source d'enrichissement Gemini Search (Google AI avec recherche web)
- Fallback automatique entre modeles Gemini
- Pipeline SMS avec scoring et envoi via OVH
- Devinette d'emails par patterns SMTP (
--guess)
1.0.0 Lancement initial
29 mars 2026
Nouveautes
- Collecte multi-sources : INSEE Sirene, RNA, BODACC, JOAFE, INPI RNE
- Cascade d'enrichissement (10+ sources : scraping, Brave, Serper, Google CSE...)
- Filtres pre-enrichissement (NAF, nom, personne physique)
- Generation d'emails par IA (Mistral / Gemini)
- Envoi email (Mailjet prioritaire, SMTP secours)
- Verification SMTP des adresses avant envoi
- Mode demon avec horloge interne
- Export Excel des prospects