Tordez des pages web avec du son. WebGlitch est une extension navigateur qui transforme n'importe quelle page web en instrument visuel : le son pilote des variables CSS en temps réel, et la page glitche, pulse, se déforme au rythme de la musique.
- Le concept
- Comment ça marche
- Les bandes
- Le CSS utilisateur
- Les sources de contrĂŽle
- L'interface
- Les presets
- Architecture technique
- Philosophie : zéro dépendance externe
- Compatibilité navigateurs
- Développement
- Roadmap
- Conventions du projet
- Licence
Une page web est une matiĂšre plastique : tailles, couleurs, positions, flous, rotations â tout est pilotable par des variables CSS (custom properties). WebGlitch injecte ces variables dans la page et les fait bouger avec le son.
Le principe en une phrase :
On découpe le son en bandes de fréquences, on mesure le volume de chaque bande, on le mappe vers une valeur CSS (
px, composante RGB, booléen, nombre...), et on injecte un bout de CSS écrit par l'utilisateur qui exploite ces variables.
Cas d'usage : performances audiovisuelles live (VJing), installations artistiques, vidéoprojection d'une page web qui réagit au set d'un musicien, détournement esthétique de sites existants.
flowchart LR
subgraph Sources
A[đ Audio systĂšme<br/>via loopback] --> C
B[đč Web MIDI<br/>Ableton, contrĂŽleur...] --> D
end
subgraph Moteur["Moteur WebGlitch"]
C[Filtres par bande<br/>passe-haut / bas / bande] --> E[Mesure du volume<br/>par bande]
E --> F[Mapping<br/>bool / int / rgb / var]
D --> F
end
subgraph Page["Page web cible"]
F --> G["Variables CSS<br/>--band-a, --band-b, ..."]
G --> H[CSS utilisateur injecté]
H --> I[âš La page glitche]
end
- Capter â l'extension reçoit le son (entrĂ©e loopback = tout le son de l'ordi) et/ou des messages MIDI.
- Filtrer â chaque bande applique un filtre (passe-haut, passe-bas, passe-bande) pour isoler une zone du spectre : basses, mĂ©diums, aigus...
- Mesurer â le volume de chaque bande filtrĂ©e est suivi en continu.
- Mapper â le volume devient une valeur exploitable : un nombre entre
minetmax, une composante RGB, ou un boolĂ©en (au-dessus d'un seuil / en dessous d'un plancher). - Injecter â les valeurs sont Ă©crites dans des variables CSS (
--band-a,--band-b, ...) sur la page, et le CSS de l'utilisateur fait le reste.
La bande est l'unité de base de WebGlitch. On en crée autant qu'on veut. Chaque bande = un filtre + un mapping.
| ParamĂštre | RĂŽle | Valeurs |
|---|---|---|
type |
Type de filtre | highpass, lowpass, bandpass, none |
cutoff |
FrĂ©quence de coupure (ou centrale pour le passe-bande) | 20 Hz â 20 kHz |
q |
RĂ©sonance / largeur du passe-bande | 0.1 â 20 |
depth |
IntensitĂ© de la rĂ©ponse : combien le signal filtrĂ© pĂšse dans la mesure | 0 â 1 |
Exemples de configurations classiques :
- Kick :
bandpass, cutoff 60 Hz, Q Ă©levĂ© â la bande ne rĂ©agit qu'Ă la grosse caisse. - Voix :
bandpass, cutoff 1 kHz, Q moyen. - Hi-hats :
highpass, cutoff 8 kHz. - Ănergie globale :
noneâ volume brut du signal.
| ParamĂštre | RĂŽle |
|---|---|
type |
Type de sortie : int (nombre), float, rgb (composante 0â255), bool (seuil), var (valeur brute 0â1) |
min / max |
Bornes de la valeur de sortie â le volume filtrĂ© est interpolĂ© entre les deux |
center |
Valeur de repos quand il n'y a pas de signal |
depth |
Amplitude de la modulation autour du centre |
threshold |
(mode bool) seuil : la variable passe à 1 quand le volume le dépasse |
floor |
(mode bool) plancher : la variable passe Ă 1 quand le volume passe en dessous |
attack / release |
Lissage de la réponse (montée / descente), pour éviter le tremblement ou au contraire l'assumer |
Chaque bande expose sa valeur dans une variable CSS : --band-a, --band-b, --band-c, etc. (nom personnalisable).
L'utilisateur Ă©crit librement le CSS qui sera injectĂ© dans la page. C'est lĂ que l'art opĂšre â WebGlitch fournit les variables, vous fournissez l'esthĂ©tique :
/* La taille du texte suit les basses, la couleur suit trois bandes */
div {
font-size: calc(var(--band-a) * 1px);
color: rgb(var(--band-a), var(--band-b), var(--band-c));
}
/* Glitch : la page tremble sur le kick (bande en mode bool) */
body {
transform: translate(
calc(var(--kick) * 8px),
calc(var(--kick) * -5px)
);
filter: hue-rotate(calc(var(--band-b) * 1deg));
}
/* Les images s'inversent quand les aigus dépassent le seuil */
img {
filter: invert(var(--hats));
}Astuces :
- Les variables sont des nombres sans unitĂ© â utilisez
calc(var(--band-a) * 1px)pour typer. - Les bandes
boolvalent0ou1: parfaites dansopacity,invert(), ou multipliées dans uncalc(). transitionsur les propriétés ciblées adoucit ou stylise la réponse.
Une extension ne peut pas capter directement « tout le son de l'ordi » : on passe par un pĂ©riphĂ©rique de loopback que l'extension ouvre comme une entrĂ©e micro (getUserMedia). Une fois configurĂ©, tout ce qui sort de vos enceintes entre dans WebGlitch â y compris Ableton, un DJ set, Spotify...
| OS | Solution | Mise en place |
|---|---|---|
| Linux (PipeWire) | Monitor natif | Dans le sélecteur d'entrée de WebGlitch, choisir Monitor of .... Sinon pw-loopback ou qpwgraph pour router finement. |
| Linux (PulseAudio) | Monitor natif | Idem : chaque sortie expose un *.monitor utilisable comme entrée. |
Firefox sous Linux ne liste pas les sources
Monitor of ...(limitation connue degetUserMedia). Créez une source dédiée que Firefox verra comme un vrai micro :pactl load-module module-remap-source \ master="$(pactl get-default-sink).monitor" \ source_name=webglitch_loopback \ source_properties=device.description=WebGlitch-LoopbackLa source « WebGlitch-Loopback » apparaßt alors dans le sélecteur (à recréer aprÚs redémarrage, ou via votre config PipeWire). Autre option : démarrer la capture puis rerouter le flux Firefox vers le monitor dans
pavucontrolâ Enregistrement.
Chrome n'affiche pas la demande de permission micro dans le panneau latĂ©ral : au premier « â¶ DĂ©marrer », WebGlitch ouvre automatiquement un onglet d'autorisation. Accordez le micro, fermez l'onglet, recliquez « â¶ DĂ©marrer » â c'est acquis pour de bon. | macOS | BlackHole | CrĂ©er un Multi-Output Device (sortie physique + BlackHole), sĂ©lectionner BlackHole comme entrĂ©e dans WebGlitch. | | Windows | VB-Cable | Router la sortie systĂšme vers CABLE Input, choisir CABLE Output comme entrĂ©e dans WebGlitch. |
L'extension liste tous les pĂ©riphĂ©riques d'entrĂ©e disponibles et permet de filtrer la source â chaque bande travaille sur cette entrĂ©e commune.
En complément (ou à la place) de l'audio, WebGlitch écoute les messages MIDI CC via un adaptateur Web MIDI unique (src/ui/midi.ts + src/core/midi/). Depuis Ableton Live :
- Créer un port MIDI virtuel (Linux : natif ALSA ; macOS : IAC Driver ; Windows : loopMIDI).
- Dans Ableton, router une piste MIDI (ou des automations d'enveloppe) vers ce port.
- Dans WebGlitch, ouvrir le menu đč de la barre de transport : l'Ă©numĂ©ration des entrĂ©es ne dĂ©marre qu'Ă ce moment (init paresseuse, le prompt de permission n'apparaĂźt pas avant), choisir « Toutes les entrĂ©es » ou un port prĂ©cis â branchement Ă chaud si un contrĂŽleur arrive aprĂšs coup.
CC learn : bouton Learn dans le mĂȘme menu â les contrĂŽles assignables (cutoff, Q, depth, attack, release, mute d'une bande, ou PERF) s'illuminent d'un halo â cliquer le contrĂŽle visĂ©, puis bouger le contrĂŽleur ou le CC de la piste Ableton : l'assignation se fait toute seule, avec un badge ch1·CC74 affichĂ© Ă cĂŽtĂ© du contrĂŽle. Un mĂȘme CC peut piloter plusieurs contrĂŽles Ă la fois (macro). Le menu affiche aussi une table d'assignation (--kick · cutoff â ch1·CC74 â) pour Ă©diter ou nettoyer d'un clic.
Source CC par bande : dans le panneau de mapping, un sĂ©lecteur Source : Audio | MIDI CC (+ bouton « CC ? » pour apprendre le CC source) fait passer la bande en pilotage direct â la valeur 0â127 du CC remplace la mesure audio et traverse le mĂȘme lissage/mapping que d'habitude. Ce mode fonctionne sans capture audio : la boucle de lecture tourne dĂšs qu'une bande CC existe. Les contrĂŽles de filtre se grisent (un filtre biquad n'a pas de sens sur un CC). C'est le mode « CV » Ă©voquĂ© dans l'idĂ©e d'origine : des automations Ableton qui pilotent directement la page, avec une prĂ©cision impossible Ă obtenir par analyse audio.
Firefox : la disponibilitĂ© de Web MIDI dans les pages d'extension reste incertaine (gating « permission par site » cĂŽtĂ© add-on). WebGlitch le dĂ©tecte : si l'API est absente, le menu đč se masque proprement avec un message, sans casser le reste de l'interface.
Construite avec potard (knobs, faders, VU-mÚtres, XY pads style Ableton) et habillée par lunar-aurora. Depuis la v0.3, la console tient dans une barre de transport unique (façon DAW), enrichie en v0.4 des menus MIDI et presets :
[â¶/â ] [MIX|GRV|TML] [PERF] âââââ [đč MIDI] [đŸ presets] [đŻ cible] [â thĂšme] [ïŒ Bande]
- Transport Ă gauche : â¶ dĂ©marre la capture, â l'arrĂȘte.
- Sélecteur de vue segmenté :
MIX(Mixage),GRV(Groovebox),TML(Timeline) â la vue est globale, choisie librement. - PERF bascule le mode Performance (mis en Ă©vidence en rouge).
- đč MIDI (v0.4) : entrĂ©es disponibles, Learn, table d'assignation â voir Web MIDI.
- đŸ Presets (v0.4) : sauvegarder sous, charger, supprimer, export/import JSON â voir Les presets.
- Ă droite : le tĂ©moin de cible đŻ (suivi/verrouillĂ©/reciblage, comportement v0.2 conservĂ©), un menu thĂšme â, et le menu ïŒ Bande avec des dĂ©parts rapides â Kick (bandpass 60 Hz), Mids (bandpass 1 kHz), Hats (highpass 8 kHz), Ănergie (lowpass large) â pour ne plus repartir d'une bande vierge Ă chaque fois.
Dans l'Ă©diteur CSS, un menu {} (v0.4) insĂšre au curseur un des 7 effets intĂ©grĂ©s (pulse, shake, hue-spin, invert-flash, aberration chromatique, scanlines, blur-beat) ou un snippet perso : sĂ©lectionner du CSS dans l'Ă©diteur â « ïŒ snippet » â le nommer â il est ensuite disponible dans le menu et exportĂ© avec les presets (voir Les presets).
- Mixage â les bandes en colonnes verticales, table de mixage classique : nom, LED, filtre, VU. La tranche sĂ©lectionnĂ©e ouvre son mapping complet dans un panneau bas partagĂ© (façon channel-strip), plutĂŽt qu'un
<details>par tranche. - Groovebox â une grille de pads, un pad par bande. Le pad est le XY (cutoff/Q au doigt) et pulse visuellement avec le signal.
- Timeline â une ligne dense par bande (LED, nom, rĂ©sumĂ© du filtre, mini-knobs, VU Ă traĂźnĂ©e qui garde l'historique du signal) : pensĂ©e pour scaler Ă beaucoup de bandes visibles d'un coup.
- Ădition â tous les rĂ©glages fins accessibles (filtre, mapping, panneau bas / onglets selon la vue).
- Performance â la mĂȘme vue, rĂ©duite aux gestes de live : cibles tactiles Ă©largies, rĂ©glages fins masquĂ©s, mute par bande au premier plan. Le VU continue de vivre, mais la page ne rĂ©agit plus tant qu'une bande est coupĂ©e.
Trois peaux commutables, assignables par mode (par dĂ©faut : mat en Ădition, neon en Performance) :
| ThĂšme | Traits |
|---|---|
mat â Mat industriel |
Surfaces plates, la couleur ne dit que l'information |
relief â Relief discret |
Ombres douces, knobs bombés, VU encastrés, LED émissives |
neon â ArĂȘtes nĂ©on |
Fond quasi noir, contours luisants, signal qui irradie |
La vue courante, le mode et le choix de thĂšme par mode sont persistĂ©s (config d'interface, pas les presets â voir Les presets).
Sous le capot, deux attributs cohabitent sur <html> : data-theme="cyberpunk" (statique, le socle lunar-aurora dont hérite l'app) et data-wg-theme (dynamique, seul porteur de ces trois peaux).
Deux surfaces, inchangĂ©es depuis v0.2, toutes deux habillĂ©es par cette mĂȘme barre de transport :
- Panneau latéral (
sidePanelChrome /sidebarFirefox) â le mode « tweaking » : la console reste ouverte Ă cĂŽtĂ© de la page pendant qu'on ajuste. - FenĂȘtre dĂ©tachĂ©e â le mode « live » : la console dans une fenĂȘtre indĂ©pendante, dĂ©plaçable sur l'Ă©cran du laptop, pendant que la page glitchĂ©e part en plein Ă©cran sur le vidĂ©oprojecteur.
- Config d'interface persistĂ©e â vue courante, mode et thĂšme par mode sont dĂ©jĂ sauvegardĂ©s localement (v0.3) : on retrouve son poste de pilotage tel qu'on l'a laissĂ©.
- Contenu d'un preset â bandes (filtre + mapping), CSS utilisateur et assignations MIDI : tout ce qui fait une configuration de live tient dans un seul objet.
- Menu đŸ â sauvegarder sous (nom saisi en ligne), charger, supprimer ; le rechargement d'un preset est Ă chaud, sans couper la capture en cours.
- Rappel par site â l'Ă©tat courant s'auto-sauvegarde (debounce 500 ms) sous le hostname de l'onglet ciblĂ©, et se recharge automatiquement au dĂ©marrage ou au reciblage vers un site dĂ©jĂ connu.
- Export / Import JSON â partagez vos presets, versionnez-les, prĂ©parez vos sets ; un import fusionne avec l'existant, en suffixant les doublons de nom (
« (2) »). - Sidepanel et fenĂȘtre dĂ©tachĂ©e synchronisĂ©s â les deux surfaces partagent le mĂȘme stockage et se mettent Ă jour l'une l'autre via
storage.onChanged.
flowchart TB
subgraph UI["UI (sidepanel / fenĂȘtre dĂ©tachĂ©e)"]
MIC[getUserMedia<br/>entrée loopback] --> WA[Web Audio<br/>BiquadFilterNode + AnalyserNode<br/>par bande]
MIDI[Web MIDI<br/>CC in] --> CORE
WA --> CORE[core/ â moteur de mapping<br/>TS pur, zĂ©ro API navigateur]
POTARD[potard<br/>knobs & faders] <--> CORE
end
CORE -- "valeurs des bandes<br/>(runtime.sendMessage)" --> BG[background/<br/>service worker â routage]
BG --> CS[content/<br/>content script]
CS -- "setProperty('--band-a', v)" --> PAGE[(Page web)]
CS -- "injection <style>" --> PAGE
Trois zones d'exécution, reliées par le message passing de WebExtensions :
- UI (sidepanel ou fenĂȘtre dĂ©tachĂ©e) â c'est ici que vivent la capture audio, le graphe Web Audio, l'Ă©coute MIDI et le moteur de mapping. Un document visible a le droit d'ouvrir
getUserMediaet tourne sans ĂȘtre throttlĂ©. - Background (service worker) â pur routeur de messages, sans Ă©tat lourd (contrainte MV3 : il peut ĂȘtre tuĂ© Ă tout moment).
- Content script â minimal par design : il reçoit des paquets de valeurs et les Ă©crit (
documentElement.style.setProperty), et gÚre la balise<style>du CSS utilisateur. Aucune logique métier dans la page.
WebGlitch/
ââ src/
â ââ core/ # Moteur pur TypeScript â AUCUNE API navigateur
â â # band.ts, mapping.ts, smoothing.ts, frequency.ts, live.ts,
â â # preset.ts / snippets.ts (sĂ©rialisation JSON), starters.ts
â â ââ midi/ # assignments.ts, learn.ts, scale.ts â CC learn et mise Ă l'Ă©chelle, TS pur
â â # â 100 % testable sous Vitest, candidat Ă extraction en lib
â ââ audio/ # Graphe Web Audio : source â filtres biquad â analyseurs
â ââ ui/ # Console : composants potard, thĂšme lunar-aurora, Ă©diteur CSS,
â â # midi.ts (adaptateur Web MIDI), presets.ts (menu đŸ)
â ââ content/ # Content script : pose des variables + CSS utilisateur
â ââ background/ # Service worker : routage des messages UI â contenu
â ââ platform/ # Adaptateur browser.ts (Chrome/Firefox) Ă©crit maison
ââ tests/ # Tests Vitest (TDD)
ââ docs/ # Documentation, specs de design
ââ manifest.chrome.json # Manifest V3 Chrome
ââ manifest.firefox.json # Manifest V3 Firefox
ââ Idea.md # L'idĂ©e d'origine, conservĂ©e pour l'histoire
RÚgle d'or de core/ : aucun import d'API navigateur (ni chrome.*, ni Web Audio, ni DOM). Le moteur reçoit des nombres, rend des nombres. C'est ce qui le rend testable en TDD sans navigateur, et extractible plus tard en bibliothÚque autonome (voir Roadmap).
- L'UI capture l'audio â le graphe Web Audio produit, par bande, un niveau (0â1) mesurĂ© Ă
requestAnimationFrame. - Le MIDI arrive en événements
midimessage, normalisĂ©s en 0â1. core/applique le mapping de chaque bande (interpolation min/max, seuils bool, lissage attack/release).- Les valeurs qui ont changĂ© (et seulement elles) partent en un seul message groupĂ© par frame vers le content script.
- Le content script écrit les variables CSS. Le navigateur fait son travail : le CSS utilisateur réagit.
- Filtres natifs :
BiquadFilterNodeetAnalyserNodesont implĂ©mentĂ©s en code natif par le navigateur â aucun DSP JavaScript dans le chemin chaud. - Un message par frame maximum, valeurs groupĂ©es et dĂ©dupliquĂ©es â pas de spam du message passing.
- Variables CSS ciblées : modifier une custom property ne recalcule que les rÚgles qui l'utilisent.
- MesurĂ©, pas supposĂ© : au banc d'essai (pire cas 26 bandes â RMS 1024 Ă©chantillons, lissage, mapping, quantification, traĂźnĂ©es), le moteur JS coĂ»te ~0,5 ms par frame, soit ~3 % du budget 60 Hz. Le vrai coĂ»t d'un glitch est ailleurs : le pipeline de rendu de la page cible (prĂ©fĂ©rer
transform/opacity, compositeur seul, auxfilter/text-shadowglobaux qui repeignent tout). - TachymÚtre intégré : la barre de transport affiche en continu le coût réel du moteur par frame, le débit de messages et le framerate de la page cible (
0.42 ms · 12 msg/s · page 58 fps). - Cadence adaptative : la page cible mesure son propre framerate et le remonte à la console ; si le repaint sature (CSS lourd), l'envoi des variables est automatiquement décimé (
Ă·2âŠĂ·6, avec hystĂ©rĂ©sis) â moins de changements = moins de repaints â puis revient Ă pleine cadence dĂšs que la page respire. Le lissage, lui, reste calculĂ© Ă 60 Hz : l'enveloppe ne triche jamais. - WebAssembly : envisagĂ© dĂšs l'origine du projet, volontairement repoussĂ© en phase 2. Il ne deviendra pertinent que pour du DSP custom (dĂ©tection d'attaques, suivi de pitch, FFT exotique) que les nĆuds natifs ne couvrent pas â pas pour un chemin chaud qui consomme 3 % du budget.
WebGlitch ne dépend d'aucune bibliothÚque tierce en production. Les deux seules dépendances runtime sont des projets maison, maßtrisés de bout en bout et co-évolutifs :
| Dépendance | RÎle | Pourquoi |
|---|---|---|
| potard | ContrĂŽles audio (Web Components, canvas, zĂ©ro dĂ©pendance) | Knobs, faders, crossfaders, VU-mĂštres, XY pads â exactement l'UI d'une console |
| lunar-aurora | Framework CSS (OKLCH, @property, @layer, thÚmes) | Habillage de l'interface, thÚmes sombres adaptés au live |
CĂŽtĂ© outillage (dev uniquement) : typescript, vite, vitest â la mĂȘme chaĂźne que potard. Pas de framework d'extension (WXT...), pas de webextension-polyfill : l'adaptateur cross-browser (src/platform/browser.ts) est Ă©crit maison (~50 lignes), parce qu'un code qu'on maĂźtrise vaut mieux qu'une dĂ©pendance qu'on subit.
| Chrome / Chromium | Firefox | |
|---|---|---|
| Manifest | V3 (manifest.chrome.json) |
V3 (manifest.firefox.json) |
| Panneau latéral | chrome.sidePanel |
sidebar_action |
| FenĂȘtre dĂ©tachĂ©e | chrome.windows.create({type:"popup"}) |
idem |
| EntrĂ©e audio | getUserMedia â
|
getUserMedia â
|
| Web MIDI | â |
Les différences d'API sont absorbées par src/platform/, seul endroit du code autorisé à connaßtre le navigateur qui l'exécute.
git clone git@github.com:yrbane/WebGlitch.git
cd WebGlitch
pnpm install
pnpm test # Vitest â le projet est dĂ©veloppĂ© en TDD
pnpm dev # build rapide (sans vérification des types) ; recharger l'extension à la main
pnpm build # build de production (Chrome + Firefox)Chargement de l'extension en dev :
- Chrome :
chrome://extensionsâ mode dĂ©veloppeur â « Charger l'extension non empaquetĂ©e » âdist/chrome/ - Firefox :
about:debuggingâ « Ce Firefox » â « Charger un module complĂ©mentaire temporaire » âdist/firefox/manifest.json
- Moteur
core/: bande, filtre, mapping, lissage â en TDD - Graphe Web Audio : entrĂ©e loopback â filtres â mesures
- Content script : injection des variables et du CSS utilisateur
- UI sidepanel minimale : une bande, un knob, un textarea CSS
- Multi-bandes dynamique (ajout/suppression/duplication)
- Tranches de console complĂštes avec potard (VU-mĂštres, XY pad filtre)
- FenĂȘtre dĂ©tachĂ©e (mode vidĂ©oprojecteur)
- ThĂšme lunar-aurora
- Barre de transport unique (transport, sĂ©lecteur de vue, mode Performance, cible, thĂšme, ïŒ Bande avec dĂ©parts rapides)
- Trois vues commutables : Mixage (panneau de mapping bas partagé), Groovebox (pads-XY pulsés par le signal), Timeline (lignes denses à VU à traßnée)
- Deux modes Ădition/Performance, avec mute par bande et cibles Ă©largies en Performance
- Trois thĂšmes (
mat/relief/neon) assignables par mode, config d'interface persistée
- Entrée Web MIDI + apprentissage CC (« MIDI learn »), table d'assignation, source CC par bande (mode CV)
- Presets nommés, auto-rappel par site, export/import JSON
- BibliothÚque de snippets CSS de départ (glitch pack) + snippets perso
- Extraction de
core/en bibliothĂšque autonome (yrbane/âŠ) : moteur audioâvaleurs rĂ©utilisable hors extension (sites, installations, Node) - Pont Ableton : patch Max for Live envoyant OSC/WebSocket vers l'extension (automations « CV » haute prĂ©cision)
- WebAssembly pour DSP custom (dĂ©tection d'attaques, suivi de pitch) â si les mesures le justifient
- Publication des stores (Chrome Web Store, AMO)
- TDD : le test d'abord, toujours.
core/vise une couverture complÚte. - SOLID / DRY / KISS : des unités petites, une responsabilité chacune, des interfaces claires entre
core/,audio/,ui/etcontent/. - Langue : code et identifiants en anglais, commentaires et messages de commit en français.
- ZĂ©ro dĂ©pendance : toute nouvelle dĂ©pendance runtime externe doit ĂȘtre refusĂ©e par dĂ©faut ; on Ă©crit, ou on fait Ă©voluer un repo maison.
MIT â comme potard et le reste de l'Ă©cosystĂšme.
WebGlitch fait partie de l'écosystÚme yrbane : potard · lunar-aurora