Tous les épisodes
l'architecture

l'architecture

Bienvenue sur le podcast dédié à Badal, la solution d'hébergement de podcasts ultra-légère et indépendante.

26/03/2026 7:47

Bienvenue sur le podcast dédié à Badal, la solution d'hébergement de podcasts ultra-légère et indépendante.
L'objectif de Badal est simple : permettre à chaque podcasteur de reprendre le contrôle de son contenu sans dépendre de plateformes coûteuses ou d'infrastructures complexes. Dans ce flux, nous explorons l'architecture technique du projet — une approche "zéro dépendance" basée sur PHP et Markdown — ainsi que ses fonctionnalités innovantes :

Indépendance totale : Pas de base de données, pas de framework, juste vos fichiers.
Podcasting 2.0 : Support natif des chapitres et des transcriptions cliquables.
Respect de la vie privée : Statistiques d'écoute intégrées sans traçage ni cookies.
Personnalisation : Système de thèmes dynamiques via JSON.

Que vous soyez développeur curieux ou podcasteur à la recherche d'une alternative libre et auto-hébergée, suivez-nous pour découvrir les coulisses du développement de Badal.

Site officiel : robotetdragon.com/badal/
Git : github.com/robotetdragon/badal-cms

[00:00:00] CHRIS : Salut, c'est Chris. Aujourd'hui, on va parler de l'architecture de Badal et de quelques fonctionnalités. Alors, il y a beaucoup de choses, donc je me suis pris quelques notes pour rien oublier. L'idée, c'est d'expliquer comment c'est construit et pourquoi ces choix-là. Alors, je suis pas un pro dans tout ça, donc j'ai vraiment, vraiment beaucoup appris et j'apprends encore énormément.

[00:00:28] CHRIS : Alors, le point de départ. Badal, ça part du constat que pour héberger aujourd'hui, soit tu payes un abonnement mensuel sur une plateforme, soit tu te retrouves avec une usine à gaz, un WordPress avec 12 plugins qui marchent dessus. Et moi je voulais un truc simple, qui marche sur n'importe quel hébergement PHP à 3 € et c'est parti. Du coup, la règle, c'était zéro dépendance en production, pas de framework, pas de Composer, pas de base de données, rien. Tu uploades, tu lances le setup et c'est en ligne.

[00:01:02] CHRIS : Alors, donc un épisode, c'est un fichier Markdown avec la durée, date, description... toutes les infos sont là-dedans, lisibles avec n'importe quel éditeur de texte. Le nom du fichier, en fait, c'est le slug de l'URL. Donc si ton fichier s'appelle "mon premier épisode.md", bah l'URL ce sera "mon premier épisode". Voilà, simple. Pour la configuration, c'est du JSON : thèmes, couleurs, réseaux sociaux, l'ordre des épisodes... voilà, chaque aspect a son petit JSON qui sont dans un dossier "config". Et c'est lisible, donc c'est versionnable. Donc pour la migration, ça se met à jour, voilà, c'est très simple.

[00:01:45] CHRIS : Alors, comment c'est organisé. Le projet, il est découpé en trois zones. Il y a le dossier "core" avec une quinzaine de classes PHP, voilà, ça c'est le moteur. Tu as l'EpisodeParser qui lit et écrit les fichiers Markdown, le RSSGenerator qui fabrique le flux RSS, le ThemeManager pour les thèmes, Auth pour les connexions, Security pour tout ce qui est le CSRF, le Rate Limit... voilà, chaque classe fait un truc. Ensuite, il y a "public". Ça, c'est ce que les visiteurs voient : c'est la page d'accueil, la page épisode, le flux, le sitemap, le proxy audio, mais j'y reviendrai. Et enfin, il y a l'"admin", qui est l'interface d'administration avec une vingtaine de pages : dashboard, liste d'épisodes, l'éditeur, l'apparence, les stats, la sécurité... Et tout est relié par un index.php à la racine qui fait le routeur, avec l'.htaccess où toutes les URLs propres sont redirigées vers le fichier, et ça dispatche vers la bonne page.

[00:02:42] CHRIS : Donc pour la sécurité, à laquelle je fais un peu attention quand même même si c'est un projet fait maison : les mots de passe, ils sont hachés, et chaque formulaire, il a un token généré côté serveur. La session, elle est protégée par du fingerprinting, et à chaque requête, ça vérifie que l'IP et l'User-Agent correspondent à ce qui est enregistré dans la connexion. Donc si quelqu'un vole un cookie de session, ça passera pas. Et pour les uploads, c'est strict aussi, il y a que certains formats audio et image qui sont acceptés avec une vérification du type réel, pas juste de l'extension.

[00:03:18] CHRIS : Après, il y a les thèmes. Ça, c'est un truc que j'aime bien : les thèmes, c'est des fichiers JSON. Chaque thème définit une couleur, police, les graisses de caractères, un style de layout. Et côté PHP, la classe ThemeManager, elle transforme ça en variables CSS qui sont injectées dans la page. Du coup, chaque apparence du site, tu modifies juste un JSON ou tu choisis un preset dans l'admin et tout suit. Les Google Fonts, elles sont chargées dynamiquement. Il y a 5 presets que j'ai faits, mais on peut tout personnaliser.

[00:03:52] CHRIS : Ensuite, le flux. Alors, le flux, il est généré en PHP pur. Donc c'est compatible Apple Podcasts, Spotify, voilà, tous les lecteurs classiques. Et j'ai aussi ajouté quelques trucs de Podcasting 2.0 : les chapitrages. Donc tu saisis tes chapitres dans l'admin avec un format assez simple, c'est un timestamp et le titre par ligne, et après Badal génère le JSON et les lecteurs compatibles peuvent l'utiliser. Et pareil pour les transcriptions : tu colles ta transcription avec le nom de l'intervenant, les timestamps, et côté public, ça fait des timestamps cliquables.

[00:04:30] CHRIS : Après, il y a un petit détail que j'aime bien, qui est bien pratique : c'est le fichier audio PHP quand on lance la lecture de l'épisode. En fait, il pointe pas directement vers le fichier, ça passe par un proxy, ce qui permet d'enregistrer l'écoute et de générer des stats sans traquer les gens, sans cookies, sans JavaScript, juste un compteur par épisode simple et ça respecte la vie privée.

[00:04:58] CHRIS : Autre truc que j'ai fait dès le départ, c'est gérer l'internationalisation du projet. En fait, Badal, il est traduit en 4 langues : français, anglais, espagnol, portugais. Et c'est un système basique, on peut générer plein d'autres langues. Chaque langue, en fait, c'est un fichier PHP qui retourne une valeur clé, et donc ça appelle une clé, ça renvoie la traduction vers le texte long.

[00:05:25] CHRIS : Un truc que j'ai ajouté ce matin aussi, c'est des brouillons. Parce que je voulais pas forcément de planification et je trouvais qu'un brouillon, c'était un système intermédiaire qui était pas mal. Donc en fait, quand on crée un épisode, on a le choix soit de le publier directement, soit de le sauvegarder pour plus tard. Et techniquement, en fait, c'est juste un champ statut. Côté public, les brouillons ils sont filtrés, donc ils apparaissent pas sur le site ou dans le flux, et dans l'admin, on voit juste un petit champ où on peut le publier plus tard.

[00:05:58] CHRIS : Alors, pour ceux qui veulent s'intéresser au développement, pour participer, en fait j'ai mis un Docker Compose en PHP 8.2, Apache, FFmpeg. Le FFmpeg, ça sert juste à détecter automatiquement la durée de l'épisode pour qu'on n'ait pas à la rentrer manuellement, même si on peut. Mais en production, on n'a rien besoin de tout ça, en fait on prend juste les fichiers, on les met sur son hébergement, on ouvre setup.php dans le navigateur, tu remplis ton nom, ton mot de passe et c'est en ligne. Il n'y a pas de terminal, il n'y a pas de commande, il n'y a pas de build.

[00:06:38] CHRIS : Donc pour conclure, l'idée que j'ai essayé de maintenir dans Badal, c'est que la technique ne soit pas un obstacle. Un podcasteur indépendant, il veut publier un épisode, il veut avoir un site propre, il veut juste posséder son flux RSS et dépendre de personne, pas d'infrastructures complexes, juste un petit hébergeur PHP et quelques fichiers et c'est tout. C'était le tour d'horizon, donc si ça vous intéresse, le code il est open source, il est sur GitHub, n'hésitez pas à jeter un œil, à me donner des conseils, merci et à demain !

Autres épisodes
🎙️
l'architecture
0:00 7:47