Tout ce qu'il faut pour tenir un réseau IRC grand public : le serveur, les passerelles web, les robots de sécurité — et les pièces de musée.
Treize projets libres, écrits entre 2002 et 2026 pour des réseaux IRC francophones réels. Chacun dans son dépôt, tous rassemblés ici.
Ce dépôt ne contient aucun code : c'est la porte d'entrée vers les projets
IRC publiés sous le compte replicatorbe.
Ils ne viennent pas d'un laboratoire. Ils ont tourné sur Espace-IRC puis Baboon.fr, des tchats francophones ouverts aux visiteurs anonymes — le contexte le plus exigeant qui soit pour un réseau IRC : pas d'inscription, donc des bots, des VPN, des multi-comptes et des contenus à filtrer, en continu. Baboon.fr a fermé en 2026 ; plutôt que de laisser le code disparaître avec le réseau, il est publié, nettoyé de ce qui était propre au site.
Le fil conducteur est une idée simple : décider avant l'entrée plutôt que sanctionner après, et pour cela ne jamais perdre l'IP réelle de l'utilisateur — du navigateur jusqu'au serveur, en passant par le BNC.
| Projet | Rôle | Techno | État |
|---|---|---|---|
| IRCbook | Robot branché comme serveur lié : filtre les connexions avant le premier salon | Java 8 · MySQL | 🔵 |
| sentinel-irc | Journalise chaque connexion, corrèle les empreintes, synchronise les G-Lines | Python 3.8+ · MySQL | 🟢 |
| GlineBotApp | Repère les bannis qui reviennent par BNC et re-gline | Python | 🟢 |
| alphaBaboon | Modère un salon généraliste et redirige plutôt que de sanctionner | Python | 🟢 |
| soju-webirc-forward | Fork de BNC qui transmet la vraie IP de chaque utilisateur | Go | 🔵 |
| kiwiirc-plugins-baboon-legacy | ~30 plugins KiwiIRC : amis, modération, visio, mobile | JavaScript · Vue | 🔵 |
| cgiirc-smug | Passerelle web IRC en CGI Perl, conteneurisée | Docker · Perl | ⚪ |
| docker-unrealircd-nossl | Le serveur IRC lui-même, compilé en conteneur | Docker · C | ⚪ |
| docker-denora | Statistiques du réseau, en pseudo-serveur, vers MySQL | Docker · C · SQL | ⚪ |
| docker-eggdrop | Eggdrop 1.6 compilé depuis les sources | Docker | ⚪ |
| EggdropTCL | Le pack Tcl de modération de salon des robots du réseau | Tcl | ⚪ |
| IRCFlashClient | Client IRC en Flash, avec webcams, de l'époque des tchats | ActionScript 3 | ⚪ |
| docker-flashpolicyd | Le serveur de politique qui autorisait ce client à ouvrir sa socket | Docker · Ruby | ⚪ |
🟢 réutilisable tel quel sur un réseau UnrealIRCd · 🔵 publié comme référence, à adapter · ⚪ archive historique, ne se reconstruit plus sans effort
le visiteur
│
┌───────────────────────┼───────────────────────┐
│ │ │
KiwiIRC CGI:IRC client Flash
+ ~30 plugins cgiirc-smug IRCFlashClient
│ │ │
│ │ flashpolicyd :843
└───────────────────────┼───────────────────────┘
│
WEBIRC : l'IP réelle
ne doit jamais se perdre
│
┌─────────┴─────────┐
soju BNC ────────┤ UnrealIRCd ├──────── Eggdrop
(webirc-forward) └─────────┬─────────┘ + scripts Tcl
│
┌──────────────┬────────────┼────────────┬──────────────┐
│ │ │ │ │
IRCbook GlineBot Sentinel alphaBaboon Denora
(serveur lié) (anti-BNC) (journal + (modération (statistiques)
│ │ G-lines) de salon) │
└──────────────┴────────────┴───────────────────────────┘
│
MySQL
Le cœur du sujet. Quatre robots qui répondent à quatre questions différentes : qui entre ?, qui revient malgré un ban ?, qui était là hier ?, que se dit-il dans le salon ?
Un robot branché comme serveur IRC, qui filtre avant l'entrée.
La plupart des robots se connectent comme un utilisateur : ils ne voient que les
salons qu'ils rejoignent, arrivent après coup, et n'ont que les droits qu'on leur
donne. IRCbook s'enregistre auprès de l'IRCd comme un serveur lié
(PASS / PROTOCTL / SERVER / EAUTH). Il reçoit le flux serveur complet —
chaque connexion avec son IP réelle, avant même le premier JOIN — et décide
d'autoriser ou de gliner. Le dépôt se présente d'ailleurs comme une méthode,
illustrée par une implémentation réelle : chaque principe renvoie à la ligne de
code qui le met en œuvre.
- Filtre par liste blanche d'IP (
TKL + Z), alimentée par l'application web à l'ouverture du tchat - Liste blanche des FAI résidentiels francophones (Orange, Free, SFR, Bouygues, Proximus, Videotron…) résolue par reverse DNS, pour amortir les faux positifs
- Détection VPN/proxy via IPHub, appelée seulement sur les cas douteux restants
- Modération des messages privés par lots, via une API de modération en ligne, sans conservation du contenu
- Corrélation d'identifiants d'installation et d'appareil pour repérer les multi-comptes
- Interrupteurs à chaud depuis le salon opérateurs (
.toggle,.status)
Détail qui compte : l'empreinte du client (navigateur, OS, type d'appareil, connexion, langue) est encodée sur six caractères dans l'ident, puis décodée à la connexion — pas de canal de communication séparé avec le site web. Et les modes de panne sont assumés et documentés : le filtre MySQL échoue en mode fermé (base injoignable = personne n'entre), les contrôles web échouent en mode ouvert.
Java 8 · Ant · MySQL · MIT — code de 2008 conservé dans le style de son époque.
📦 IRCBook
Surveille les connexions, corrèle les empreintes, synchronise les G-Lines.
Sentinel écoute le salon où l'application publie les métadonnées de chaque connexion, et les stocke intégralement en MySQL : IP publique, hostname, identifiant matériel, identifiant unique, modèle, version, noyau, ville, pseudo. C'est l'outil d'investigation du réseau — retrouver toutes les connexions d'un pseudo, d'une IP ou d'une machine — doublé d'un automate de bannissement.
- Bans automatiques sur clones (même IP) et flood (connexions par minute), seuils configurables
- Critères de bannissement gérés en base : motifs regex d'IP et de hostname, identifiants matériels, villes
- Copie à jour des G-Lines du serveur, rafraîchie par
/stats gdans un thread dédié - Administration entièrement en message privé :
!searchip,!searchhardware,!userinfo,!stats… - Journalisation triple : fichier, stdout et table SQL
- Déploiement documenté par unité systemd
Python 3.8+ · MySQL · MIT
📦 sentinel-irc
Repère les bannis qui reviennent par BNC et re-gline.
Bannir une IP ne suffit pas : l'utilisateur revient derrière un BNC, son IP apparente change, et le ban ne mord plus. GlineBot compare les connexions annoncées — avec leur IP réelle — à la liste des G-Lines actives, sur trois axes : IP, hostname et pseudonyme. Quand un banni réapparaît, il repose une G-Line.
- Synchronisation périodique des G-Lines, masques
/24,/16et jokers compris !glinereal <pseudo>: double G-Line, l'une sur le pseudo, l'autre sur l'IP réelle retrouvée dans l'historique- Historique de connexions en mémoire, avec rotation automatique
- Garde-fous anti-emballement : vérification que la cible est bien bannie, cooldowns de re-ban, timeout de vérification
- Suivi en direct des notices
GLINE added/removed/expiredet destkl.TKL_ADD/TKL_DEL
Python · UnrealIRCd · MIT — aucune base de données, tout l'état vit en mémoire
et se reconstruit depuis le serveur au démarrage.
📦 GlineBotApp
Déplace poliment les conversations adultes vers le bon salon.
Sur un tchat généraliste, la conversation dérive. Plutôt que de sanctionner
sèchement, alphaBaboon déplace l'utilisateur vers le salon adapté —
SAPART puis SAJOIN — avec un message d'explication et un accueil qui varie
selon l'heure. L'analyse est en cascade, pour ne pas payer un appel réseau à
chaque phrase : liste blanche d'habitués, cache des messages déjà vus, détection
rapide par mots-clés optimisée pour le français, et seulement ensuite une API de
modération en ligne pour le contexte.
- Score de sensibilité configurable (0 à 10) et cache à durée de vie
- Filtres déterministes complémentaires : mots interdits avec exceptions, pseudonymes, numéros de téléphone (formats français et internationaux)
- Une vingtaine de commandes op/halfop :
!status,!fa,!whitelist,!phonestats,!hostinfo,!health… - Healthcheck périodique de la connexion IRC et du service d'analyse
- État persistant (compteurs, sanctions) avec sauvegarde automatique, fichier de secours et restauration au démarrage
- Analyse d'euphémismes, suivi comportemental, détection d'escalade et de motifs répétitifs
Détail qui compte : un module résout le véritable host des utilisateurs, pour que les bans portent sur la bonne cible et pas sur un masque.
Python 3.8+ · privilèges IRCop requis · MIT
📦 alphaBaboon
Comment on entre sur le réseau — et comment l'IP réelle survit au voyage.
Un bouncer IRC qui transmet la vraie IP de chaque utilisateur.
Par défaut, un BNC se connecte au serveur avec sa propre IP : tous les
utilisateurs bouncés apparaissent derrière la même adresse, et la modération par
IP s'effondre. Ce fork de soju transmet l'IP réelle du client
au serveur amont via WEBIRC — K-line, G-line, anti-flood et géolocalisation
redeviennent possibles par utilisateur. Toutes les additions sont optionnelles :
sans directive spécifique, le binaire se comporte comme un soju standard.
upstream-webirc-password: transmissionWEBIRCde l'IP réelleno-log-channels: motifs de canaux exclus du stockage des messagesdefault-network: réseau créé d'office pour tout nouvel utilisateur- Bot de contrôle IRC optionnel : OPER, commandes d'administration, événements BNC
- Passerelle HTTP
sojuctl(POST /execute, jeton porteur) pour outiller l'administration depuis l'extérieur - Docker et Docker Compose fournis
Détail qui compte : quand aucun client n'est connecté, le fork retombe sur la dernière IP connue, puis sur une IP déterministe du range privé, stable par couple (utilisateur, réseau) — les reconnexions sans client ne cassent pas le suivi. Format de configuration, schéma de base et protocole restent ceux de soju : les clients et les configurations existantes fonctionnent sans retouche.
Go 1.19+ · AGPL-3.0 — fork d'archive, figé sur soju de mars 2024.
📦 soju-webirc-forward
Une trentaine de plugins KiwiIRC issus d'un chat francophone fermé.
Tout ce qui transformait un client KiwiIRC nu en site de tchat : liste d'amis, modération au clic droit, visioconférence, confort mobile. Le code a été nettoyé avant publication — domaines et points d'accès codés en dur remplacés par des réglages, branding et logique métier propres au site retirés, journalisation de débogage supprimée.
- Liste d'amis avec présence en ligne (WATCH/WHOIS), notes et widget flottant
- Modération par menu contextuel (clic droit / appui long) et panneau complet de gestion de salon : modes, historique de topic, liste de bans
- Visio Jitsi : appels privés 1:1, et mode « radio » où le mode de canal
+Tbascule les utilisateurs dans un salon audio partagé - Partage de médias : glisser-déposer, enregistrement webcam dans le navigateur
- Sons d'interface générés par synthèse (Web Audio API) — aucun fichier audio embarqué
- Reconnexion robuste : détection de la veille mobile, des changements de réseau et des WebSockets zombies, repli exponentiel
Les 29 plugins autonomes s'installent en déposant un .js dans
static/plugins/ — aucune étape de build. Seul le sous-projet de conférence se
construit à part.
JavaScript · Vue 2 · MIT (Apache-2.0 pour le sous-projet visio)
📦 kiwiirc-plugins-baboon-legacy
Un client IRC dans le navigateur, servi en CGI Perl.
Une image Docker minimale : CGI:IRC 0.5.11 derrière Apache, pour offrir une
passerelle web vers IRC sans rien installer côté visiteur. Tout le dépôt tient
dans un Dockerfile — installation, VirtualHost, et ajustement de la
configuration au sed.
- Serveur et salon par défaut préconfigurés, limite de 40 utilisateurs simultanés
webirc_passwordetrealhost_as_passwordactivés : même logique WEBIRC que le BNC, mais côté passerelle web
password, et
access_server = .* en fait un relais ouvert vers n'importe quel serveur IRC :
à restreindre impérativement avant toute exposition.
Docker · Debian Jessie · Perl — dernier commit 2015.
📦 cgiirc-smug
Les briques d'infrastructure, conteneurisées à l'époque des --link Docker.
UnrealIRCd 3.2.10.4 compilé depuis les sources, avec ses paramètres de capacité
réglés au build (historique des pseudos, sendq, bufferpool, descripteurs). Sans
SSL, volontairement : le chiffrement est censé être terminé en amont. Ports 6667
et 7777, lancement en avant-plan (unrealircd -F) pour la supervision Docker.
Il faut fournir son propre unrealircd.conf.
📦 docker-unrealircd-nossl
Denora 1.5.0 en conteneur : un service qui se relie au serveur comme un
pseudo-serveur et enregistre l'activité (serveurs, salons, utilisateurs) en
MySQL, pour alimenter des pages de statistiques. Le dépôt embarque le schéma
générique plus un fichier SQL par IRCd (Unreal 3.2, InspIRCd, Bahamut,
Charybdis, Hybrid, Ratbox, ircu, Nefarious…). C'est le dépôt qui relie
explicitement l'infrastructure au réseau : sa configuration nomme
Denora.baboon.fr et le réseau « Espace-IRC ».
📦 docker-denora
Eggdrop 1.6.21 compilé depuis le FTP officiel, sous un utilisateur non
privilégié. L'image produit le binaire ; le eggdrop.conf et la commande de
lancement restent à fournir. C'est le support d'exécution des scripts Tcl
ci-dessous.
📦 docker-eggdrop
Le pack Tcl qui armait les robots du réseau Espace-IRC.
Les scripts de deux Eggdrop : BotAtoMic, modérateur de salons, et Unknown,
robot d'aide. Datés de 2002-2004, archivés tels quels en 2024 — accents abîmés
en ISO-8859-1 compris. C'est un témoignage d'usage réel, pas un produit
distribuable : listes de mots et noms de salons sont codés en dur.
badwords.tcl: mots interdits par salon, avertissement puis kick et ban, avec alerte au staffbadnick.tcl: sanction à l'arrivée ou au changement de pseudo, avec notice expliquant comment en changerbanflooders.tcl,norepeat.tcl,caps.tcl,noctcp.tcl: flood, répétitions, majuscules, CTCP publicsautolimit100.tcl: ajustement périodique du mode+lselon la fréquentationtapavu.tcl: base « seen » en français (!seen <nick>) alimentée par join/part/quit/kick/nick/netsplitSurveillance.tcl: utilisateurs marqués, avec alerte automatique aux opérateurs à leur arrivée
Piège documenté : les appels newchanban sont commentés au profit d'un
MODE +b direct — le ban échappe donc à la gestion d'expiration d'Eggdrop, et le
bantime configuré ne s'applique pas.
📦 EggdropTCL
Deux dépôts qui ne tourneront plus, gardés pour ce qu'ils racontent.
Client IRC complet en ActionScript 3 / Flex, développé de 2008 à 2014 sous le nom
ChatFlash et publié en 2024. Il parlait IRC directement depuis le navigateur
via une flash.net.Socket brute — pas de passerelle — et ajoutait la vidéo par
webcam en RTMFP. Multi-salons à onglets, smileys, couleurs mIRC, avatars,
répondeur, cam invisible : tout l'écosystème des tchats francophones de l'époque.
Le code explique pourquoi Socket et non XMLSocket : le protocole IRC
l'exige, XMLSocket attendant des messages terminés par un octet nul. Le tampon
est recoupé sur \r\n à la main.
Flash Player a été retiré de tous les navigateurs fin 2020 : le projet ne peut
plus tourner. CC BY-NC 4.0.
📦 IRCFlashClient
Le compagnon obligatoire du précédent. Avant d'ouvrir une socket vers un serveur
tiers, le lecteur Flash interrogeait le port 843 de l'hôte cible, envoyait
<policy-file-request/> et n'établissait la connexion que si la politique
renvoyée l'autorisait — d'où un démon dédié plutôt qu'un simple fichier servi en
HTTP. Ce conteneur ouvre les ports IRC 6667 et 7777 à tous les domaines.
Le README le dit lui-même : conservé à titre documentaire, à ne pas utiliser.
📦 docker-flashpolicyd
| L'IP réelle, de bout en bout | WEBIRC côté passerelle web, WEBIRC côté BNC, lien serveur pour le robot de filtrage : à aucun moment la véritable adresse de l'utilisateur ne doit se perdre. Sans elle, plus aucune modération par IP ne tient. |
| Décider avant, pas après | Filtrer la connexion avant le premier salon coûte infiniment moins cher que de nettoyer derrière. |
| Échouer dans le bon sens | Chaque contrôle a un mode de panne choisi et documenté : fermé quand un faux négatif est pire, ouvert quand un faux positif l'est. |
| Des garde-fous contre soi-même | Cooldowns de re-ban, vérification avant action, détections qui alertent sans bannir : un automate qui s'emballe fait plus de dégâts qu'un abus. |
| Publier plutôt que perdre | Les réseaux ferment. Le code est nettoyé de ce qui était propre au site, puis publié — y compris quand il est vieux, à condition de le dire. |
Les remontées se font dans le dépôt du projet concerné, via ses Issues. Les projets marqués ⚪ sont des archives : ils sont conservés en l'état et ne reçoivent pas de correctifs.
Les licences varient d'un dépôt à l'autre (MIT, AGPL-3.0, CC BY-NC) — la licence qui s'applique est celle du dépôt du projet, pas celle de cet index.
sMug — Jérôme Fafchamps github.com/replicatorbe · fafchamps.be
Projets indépendants, sans lien avec les équipes d'UnrealIRCd, Eggdrop, soju, KiwiIRC, Denora ou CGI:IRC. Les marques citées appartiennent à leurs propriétaires.