__        ________        _______   __        ______    ______  
|  \      |        \      |       \ |  \      /      \  /      \ 
| $$      | $$$$$$$$      | $$$$$$$\| $$     |  $$$$$$\|  $$$$$$\
| $$      | $$__          | $$__/ $$| $$     | $$  | $$| $$ __\$$
| $$      | $$  \         | $$    $$| $$     | $$  | $$| $$|    \
| $$      | $$$$$         | $$$$$$$\| $$     | $$  | $$| $$ \$$$$
| $$_____ | $$_____       | $$__/ $$| $$_____| $$__/ $$| $$__| $$
| $$     \| $$     \      | $$    $$| $$     \\$$    $$ \$$    $$
 \$$$$$$$$ \$$$$$$$$       \$$$$$$$  \$$$$$$$$ \$$$$$$   \$$$$$$ 
                                                                 
                                                                 
                                                                 
       _______   ________        __    __   ______   _______     
      |       \ |        \      |  \  /  \ /      \ |       \    
      | $$$$$$$\| $$$$$$$$      | $$ /  $$|  $$$$$$\| $$$$$$$\   
      | $$  | $$| $$__          | $$/  $$ | $$$\| $$| $$  | $$   
      | $$  | $$| $$  \         | $$  $$  | $$$$\ $$| $$  | $$   
      | $$  | $$| $$$$$         | $$$$$\  | $$\$$\$$| $$  | $$   
      | $$__/ $$| $$_____       | $$ \$$\ | $$_\$$$$| $$__/ $$   
      | $$    $$| $$     \      | $$  \$$\ \$$  \$$$| $$    $$   
       \$$$$$$$  \$$$$$$$$       \$$   \$$  \$$$$$$  \$$$$$$$    

Bienvenue dans mon terminal numérique

Système initialisé. Chargement des modules audio, code et streaming...

En ligne • 15/12/2025 19:22

Bienvenue sur Terminal de Kod — le hub où se croisent développement web, Linux, musique et streaming. Je suis Michaël David, alias K0d / Mycki, développeur full-stack, administrateur systèmes Linux, formateur, DJ et streamer basé à Saint-Nazaire. Passionné par l’open source, l’auto-hébergement, la création musicale et le rétro-gaming, je partage ici mes projets, mes outils, mes expérimentations techniques et mes sets DJ. Entre code, musique et bidouille, ce blog est le reflet de ce que j’aime : créer, optimiser, transmettre et faire vibrer.

DERNIÈRES ACTUALITÉS

Les dernières publications de toutes les sections

Projets Tech
10/12/2025

La Vélorution avec WebRTC et LiveKit !

Lors de nos dernières vélorutions, un besoin revenait systématiquement : diffuser de la musique depuis le char tout en permettant aux participant·es d'utiliser leurs propres enceintes Bluetooth. L'objectif était simple : obtenir une ambiance sonore homogène, sans échos, sans décalages, et surtout sans avoir à trimballer une sono trop lourde.
Voir l'article
Projets Tech
08/12/2025

PasseMonTruc Connector : le lien entre ta playlist et tes fichiers audio

Après avoir présenté Passe Mon Truc, voici un autre élément clé de l’écosystème : PasseMonTruc_Connector, un plugin open source conçu pour automatiser la récupération des morceaux validés sur ta playlist.
Voir l'article
Mixs & Podcasts
08/12/2025

Daft Punk the game has changed (expect us remix)

2011 – Je remixe Daft Punk et transforme l’ouverture de mes sets en véritable montée d’adrénaline.
Voir l'article
Streams
06/12/2025

Mixtape for Lilie

1h de House pur jus, pensée comme une lettre d’amour en rythme et en basses. Pour elle. Pour nous. Pour tout ce chemin parcouru.
Voir l'article

Blog TECH

Développements open-source, outils et expérimentations

La Vélorution avec WebRTC et LiveKit !

Retour d'expérience et guide technique

Lors de nos dernières vélorutions, un besoin revenait systématiquement : diffuser de la musique depuis le char tout en permettant aux participant·es d'utiliser leurs propres enceintes Bluetooth. L'objectif était simple : obtenir une ambiance sonore homogène, sans échos, sans décalages, et surtout sans avoir à trimballer une sono trop lourde.

Après avoir testé plusieurs pistes, comme le Bluetooth ou la diffusion FM, j'ai finalement opté pour une solution WebRTC basée sur LiveKit, qui semble étonnamment efficace.

Ce qui suit est le récit technique du montage, accompagné de notes, pièges évités et résultats concrets après plusieurs jours de tests, avant de passer aux tests sur le terrain.

1. Principe général

L'idée :

  • Diffuser l'audio dans une Room LiveKit
  • Laisser les participant·es se connecter via une simple page web
  • Synchroniser la lecture sur tous les appareils via une mécanique maison utilisant playbackRate

Contrairement à un live classique (HLS, Icecast ou autre), l'objectif n'est pas seulement de réduire la latence, mais de garantir la même latence pour tout le monde.

WebRTC, aidé d'un SFU comme LiveKit, est parfait pour ça.

2. Architecture technique

L'architecture se découpe en trois blocs :

LiveKit Server

Service principal qui gère :

  • les Rooms
  • les pistes audio
  • la transmission en temps réel
  • le modèle SFU (Selective Forwarding Unit), qui évite la surcharge du serveur

LiveKit tourne chez moi sous Linux, avec un accès WebSocket exposé via proxy Apache.

Serveur de tokens

Micro-service simple (en Node.js) chargé de créer :

  • des "join tokens" pour les clients
  • des autorisations limitées dans le temps

Il est volontairement séparé de LiveKit pour une meilleure sécurité et un déploiement plus flexible.

Page web "listener"

Une page très légère contenant :

  • le client LiveKit
  • un player audio HTML5
  • une boucle de synchronisation basée sur un signal partagé (via DataChannel ou via un timestamp commun)

Chaque téléphone se contente :

  • de récupérer le flux audio WebRTC
  • de l'envoyer vers son enceinte Bluetooth
  • de s'auto-corriger en permanence pour rester parfaitement calé sur le tempo

3. Ce qui surprend quand on monte ce système

WebRTC n'aime pas l'audio pur

La plupart des tutos LiveKit concernent la vidéo. Pour l'audio pur, il faut désactiver plusieurs optimisations inutiles (AEC, AGC, etc.) pour éviter que le son soit transformé.

Bluetooth ajoute un décalage… mais stable

Les enceintes Bluetooth ont en général une latence fixe 200ms (mais legerement différente d'un modèle à l'autre).
C'est justement cette constance qui permet de compenser de manière fiable via playbackRate.

La synchro demande de la finesse

J'ai testé plusieurs stratégies :

  • lecture par timestamp WebRTC → trop imprécis
  • ajustement continu du currentTime → provoque des sauts audibles
  • micro-ajustement du playbackRate → la solution la plus propre

Avec un ajustement de ±2 %, tout reste audible et la synchronisation est parfaite.

4. Déploiement : rôle crucial du proxy

Le proxy Apache assure :

  • la redirection WebSocket (/livekit)
  • l'accès HTTPS
  • l'isolation des ports internes

5. Prêt à mettre les mains dans le cambouis ?

Mes prérequis

  • Un site qui tourne (perso sous Apache2, mais ça fonctionne aussi avec Nginx)
  • NodeJS pour le serveur de tokens

Installation de LiveKit

Côté serveur, j'ai installé LiveKit assez simplement grâce à la documentation officielle :
https://github.com/livekit/livekit J'ai utilisé la commande :

curl -sSL https://get.livekit.io

J'ai ensuite créé un dossier livekit dans mon /home Dans ce dossier, j'ai d'abord créé le fichier de configuration livekit.yaml :

bind_addresses:
  - "0.0.0.0"

rtc:
  tcp_port: 8443
  udp_port: 7880

keys:
  clé-api: "ma-clé-super-secrete"

log_level: info  


Service Systemd pour LiveKit

Puis j'ai créé un fichier de service dans /etc/systemd/system/livekit.service :

Description=LiveKit Server
After=network.target

[Service]
ExecStart=/usr/local/bin/livekit-server --config /home/K0d/livekit/livekit.yaml
Restart=on-failure
User=k0d
WorkingDirectory=/home/k0d/livekit/

[Install]
WantedBy=multi-user.target


Je rafraîchis systemd pour prendre en compte ce service :

sudo systemctl daemon-reload

Puis je démarre le service :

sudo systemctl start livekit


Serveur de tokens

Pour les connexions, j'ai aussi besoin d'un serveur de tokens, indispensable pour accéder à ma room LiveKit.
J'ai donc créé un mini-serveur Node.js pour générer dynamiquement les tokens sans exposer ma clé.
Dans mon dossier /home/k0d/livekit, j'ai créé un fichier server.mjs :

import express from 'express';
import cors from 'cors';
import { AccessToken } from 'livekit-server-sdk';

const app = express();
app.use(cors());

const API_KEY = 'clé-api';
const API_SECRET = 'ma-clé-super-secrete';

app.get('/token', async (req, res) => {
  const roomName = req.query.room ?? 'room1';
  const identity = req.query.identity ?? 'user';

  const at = new AccessToken(API_KEY, API_SECRET, { identity });
  at.addGrant({
    roomJoin: true,
    room: roomName,
    canPublish: true,
    canSubscribe: true,
    audio: true,
    video: false
  });

  const jwt = await at.toJwt();
  res.json({ token: jwt });
});

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Token server listening on http://localhost:${PORT}`);
});


Je crée ensuite un service systemd

sudo nano /etc/systemd/system/livekit-token.service

et j'y entre :

Description=LiveKit Token Server
After=network.target

[Service]
Type=simple
User=k0d
WorkingDirectory=/home/k0d/livekit
ExecStart=/usr/bin/node /home/k0d/livekit/server.mjs
Restart=on-failure
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

je recharche systemd:

sudo systemctl daemon-reload

puis lance mon service:

sudo systemctl start livekit-token

Pour le moment, je préfère séparer mes services pour faciliter le debug, mais je pourrai les réunir plus tard dans un seul service.

Je ne les active pas non plus par défaut (systemctl enable), car je veux pouvoir les lancer uniquement lors des vélorutions.

Exposition au Web via Apache2

Pour rendre mes services accessibles sur Internet, j'ai édité la config de mon site Apache2 dans /etc/apache2/sites-available.

J'y ai ajouté, avant </VirtualHost> :

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule ^/livekit/(.*) ws://127.0.0.1:7880/$1 [P,L]

ProxyPass /livekit/ http://127.0.0.1:7880/
ProxyPassReverse /livekit/ http://127.0.0.1:7880/

# Proxy vers Node.js token server
ProxyPass /token http://127.0.0.1:3000/token
ProxyPassReverse /token http://127.0.0.1:3000/token


et rechargé Apache2:

sudo systemctl reload apache2

Ainsi :

Page d'émission : emit.html

La page emit.html, qui servira, comme son nom l’indique, à émettre le son, permet, en deux ou trois clics, de lancer l’émission et de choisir la source sonore.

la page est sur mon github ici.

Avec cette page, j’utilise un CDN pour inclure le client. Cependant, vous pouvez — et devriez — le mettre en local.

Vous remarquerez qu’il y a énormément de lignes commentées : je les laisse volontairement, car elles sont utiles pour le traitement du son (« source → EQ → gain → destination »).
Ici, je contourne l’EQ pour faire simplement « source → gain → destination ». Mon gain étant à 1, son utilité reste limitée, mais je pense augmenter un peu le volume de la source, car le son est assez faible en l’état.
Bien sûr, je vous recommande de personnaliser votre page à l’aide de CSS.

Page d'écoute : listen.html

La page listen.html est ici sur mon github.
Là encore j'utilise LiveKit côté client, via CDN.

La partie la plus importante est la synchronisation du flux audio :

const maxDrift = 0.01; // 10ms de drift max (ne pas descendre plus bas 30 voir plus est bien plus raisonnable)
const smoothFactor = 0.05; // correction progressive via playbackRate

Ce système ajuste la vitesse du son pour rattraper un retard ou un décalage réseau. L'effet est surprenant : le flux accélère ou ralentit légèrement, exactement comme un DJ qui rattrape un tempo.

Conclusion

Ce système fonctionne très bien en situation réelle : latence faible, synchronisation correcte, compatibilité totale avec des enceintes Bluetooth, simples smartphones, etc.

J'espère que ça pourra vous être utile. À bientôt sur les vélorutions,

Kod.

Lien direct :

PasseMonTruc Connector : le lien entre ta playlist et tes fichiers audio

Après avoir présenté Passe Mon Truc — la playlist collaborative simple et efficace — dans l’article dédié
👉 Projet Passe Mon Truc : la playlist collaborative simple, rapide et fun
voici un autre élément clé de l’écosystème : PasseMonTruc_Connector, un plugin open source conçu pour automatiser la récupération des morceaux validés sur ta playlist.

Ce connecteur, utilisé avec Nicotine+, permet de chercher et télécharger automatiquement les titres ajoutés et approuvés depuis ton espace Passe Mon Truc. Une fois l’URL de la playlist renseignée, il récupère chaque morceau en tenant compte des critères de qualité et de format que tu définis. Il évite également les fichiers marqués comme privés, afin d’assurer un téléchargement propre et sécurisé.

L’objectif est simple : transformer rapidement une playlist validée en un lot de fichiers audio prêts à l’emploi, que ce soit pour un DJ set, une soirée, un événement ou un besoin plus technique. Le tout en conservant la philosophie du projet : simplicité, fun, collaboration… mais aussi contrôle total sur le contenu.

Parce qu’il est open source, tout le monde peut l’améliorer, l’adapter ou l’intégrer dans un workflow plus large. Il complète parfaitement Passe Mon Truc, en rendant l’étape “après validation” aussi fluide que la collecte des suggestions — comme expliqué dans l’article principal
👉 Projet Passe Mon Truc : la playlist collaborative simple, rapide et fun.

Tu peux découvrir le code et les détails techniques directement sur GitHub :
👉 https://github.com/kodcast/PasseMonTruc_Connector


K0d

Lien direct :

MIXS / PODCASTS

Sélection de sets audio - Téléchargement et streaming

Daft Punk the game has changed (expect us remix)

2025-12-08
2011 – Je remixe Daft Punk et transforme l’ouverture de mes sets en véritable montée d’adrénaline.
#electro
3.08 MB 08/12/2025

Hold

2025-12-06
Un anciens mix (2012) retrouvé dans mes archives.
#electro #Mix
81.15 MB 06/12/2025

Vague

2025-12-06
Un anciens morceau (2012) retrouvé dans mes archives.
#electro #live
10.35 MB 06/12/2025

Mixtape for Lilie

2025-12-06
1h de House old school pur jus, pensée comme une lettre d’amour en rythme et en basses.
#house #mix #kod
348.97 MB 06/12/2025

Mix au VIP de Saint-Nazaire

2025-12-01
Mix réalisé lors de ma prestation à la première party du groupe The Subs au VIP de Saint-Nazaire, le 10/11/2011.
#electro #The Subs
46.77 MB 06/12/2025

Stranger KØd

2024-04-22
Stranger KØd
Remaster hardtek/speed bass
Musique et clip réalisé par KØd, pas de sample la dedans, que des synthé virtuel pour reproduire la mélodie original.

outils utilisés:
Jack - serveur son
LMMS - compo
Ardour - mastering
#techno #speed bass
36.29 MB 06/12/2025

STREAMS / CONTENU VIDÉO

Retransmissions, tutoriels et gaming retro

Mixtape for Lilie

20 ans de mariage, 25 ans de vie commune, presque 30 ans à avancer côte à côte… et pourtant, je n’avais jamais pris le temps de créer une mixtape pour celle qui fait battre mon cœur depuis toutes ces années.

Aujourd’hui, je répare cet oubli avec Mixtape for Lilie : une parenthèse musicale, un retour doux et vibrant vers nos premières nuits de clubbeurs, quand tout était nouveau, léger, évident… et quand on ne m’appelait pas encore K0d, mais Mycki.

1h de House pur jus, pensée comme une lettre d’amour en rythme et en basses. Pour elle. Pour nous. Pour tout ce chemin parcouru.

Bonne écoute ❤️🎶

Playlist :
Michael Gray – The Weekend (Original 12" Mix)
Armand Van Helden feat. Tara McDonald – My My My (Original Club Mix)
Alan Braxe & Fred Falke – Intro (Original Club Mix)
Junior Jack – Thrill Me (Original Version)
Soul Grabber – Motocross Madness
Fake Blood – I Think I Like It
Mochakk – Jealous (Extended Mix)
Chloé Caillet – NYWTF ft. Mikhail Beltran (Extended)
Junior Jack – My Feeling (Kick ’N’ Deep Mix)
Stardust – Music Sounds Better With You (12" Club Mix)
Skream & FLETCH – Lost Without You (Extended Mix) Demon – You Are My High

Logiciels utilisés :
Linux
Mixxx
Audacity
ProjectM
OBS

Lien direct :

REPLAY MIX ELECTRO

🌌 Au programme :

Une sélection pointue, entre classiques intemporels et pépites underground. Une performance live, immersive et 100% open source.

🔧 Les logiciels open source qui rendent ce live possible :

🎚️ Mixxx pour un DJing de haute qualité.
🎛️ Jack Audio pour une gestion optimale du son.
🌌 ProjectM pour des visualisations hypnotiques en direct.
🔊 VLC pour diffuser le flux audio.
🎥 OBS Studio pour le mixage vidéo et l’envoi du flux en direct.

Lien direct :

Kod - set Drum'n Bass de la fête de la musique live sur LGT

Ma prestation Drm'n Bass réalisée à l’occasion de la fête de la musique 2024 sur https://lagrossetambouille.com. Enjoy.

pour le son :
Jack et Jack Audio Connection Kit
Mixxx
Vlc

pour l'image et le stream :
Obs
projectM
Butt

Lien direct :

Frag Party sur OpenArena

Bienvenue dans une après midi de frags endiablés sur OpenArena, le FPS libre inspiré de Quake 3 Arena ! 🕹️ Plongez avec moi, K0d, dans cet univers rétro pour des combats frénétiques, des duels épiques et des moments fun en live. 🔥

Lien direct :

Le Mix Electro dont vous êtes le héros

Le mix Electro dont vous etes le héros du 03/11/2023. Après une tempête et une coupure d'électricité m'ayant obligé a reporter, un bug de réseau ayant coupé le flux, le voici.
Le Mix live electro dont vous avez choisit chaque morceau . Mixer par K0d live de kodstud. Enjoy!

logiciels utilisés (tous open source) :

pour la playlist:
Djheros
Djheros_connector

pour le son : Jack et Jack Audio Connection Kit
Mixxx
Vlc

pour l'image et le stream :
Obs
projectM

Lien direct :

Dépasse les bornes vol 1

Dépasse les bornes vol 1 :

Dans ce premier tuto, je vous explique comment installer Lakka sur un ordi de récup' .

Liens utiles :

http://lakka.tv/

https://www.balena.io/etcher/

Lien direct :

CONTACT / RÉSEAUX

Restons en contact - N'hésitez pas à me joindre

Formulaire

Pour les questions professionnelles et collaborations

Contactez-moi

Mastodon

Me contacter sur Mastodon

Profil Mastodon

Bluesky

Me contacter sur Bluesky

Profil Bluesky

Open Source

Projets, contributions et code source

Voir GitHub

Streaming

Jeux vidéos, bidouilles, Djing ...

Suivre sur Peertube

Réponse généralement sous 48h

Pour une réponse plus rapide, mentionnez @K0d sur les réseaux sociaux