La Darkvalley Show Control Suite est née d'un constat de terrain : dans un lieu immersif, chaque métier a son logiciel, chacun a sa console, son port, sa logique — et personne n'a de vue d'ensemble. L'idée était d'écrire cinq outils qui se ressemblent assez pour qu'on n'ait à apprendre qu'une seule interface.
Une architecture commune
Les cinq produits ne partagent pas seulement une charte graphique : ils partagent des invariants d'exploitation, écrits une fois et tenus partout. C'est ce qui rend la suite installable par la même personne, sur la même machine, sans documentation par produit.
Les quatre invariants
Un seul tableau de bord par logiciel, un seul port, jamais deux interfaces parallèles : les sections sont des onglets, pas des URLs.
Chaque moteur écoute sur 127.0.0.1 ; nginx sert le
frontend, filtre le LAN et injecte le jeton — le moteur n'est jamais exposé.
Les composants d'interface et les briques communes vivent dans un seul paquet : on corrige une fois, les cinq produits en bénéficient.
Chaque produit sait se mettre à jour tout seul, avec vérification de signature et redémarrage propre côté systemd.
Côté technique, la suite a convergé sur une base unique : React 18 + Vite + TypeScript pour les interfaces, Python + FastAPI pour les moteurs, services systemd, et une bibliothèque de composants partagée entre les cinq produits.
Les produits
Sentry Watch — la vigie
Hématite · supervisionObjectif — surveiller tout le reste. Sentry Watch interroge les autres produits et les machines du lieu, relève leur santé, et prévient avant que la salle ne s'en aperçoive : services tombés, latences qui dérivent, CPU qui monte, mises à jour disponibles. Il expose un mode kiosque pensé pour un écran de régie qui reste allumé — avec alerte sonore, parce qu'un écran de supervision que personne ne regarde ne sert à rien.
- Frontend
- nginx port 8080
- Agent
- Python,
127.0.0.1:3002 - Rôle
- Poll des services, alertes, uptime 24 h, kiosque régie
- Mise à jour
- Tarball signé (fail-closed)

Obsidian Forge — la forge
Obsidienne mahogany · automatismesObjectif — parler aux machines du décor. Obsidian Forge est le pont entre le monde du spectacle (OSC) et le monde industriel (Modbus) : il interroge des automates, expose leurs états, déclenche des actions, et rend tout ça lisible sur un tableau de bord temps réel. C'est le produit qui a le plus tourné en conditions réelles, et celui qui a servi de banc d'essai à tous les invariants de la suite.
- Frontend
- nginx port 80
- Moteur
- FastAPI,
127.0.0.1:8888 - Protocoles
- OSC · Modbus TCP · WebSocket temps réel
- Mise à jour
- Échange de moteur signé, sauvegarde automatique

Flint Sound Engine — le son
Silex · audio réseauObjectif — jouer le son d'un lieu, sans machine de lecture dédiée. Le moteur gère les lecteurs, les sorties, les niveaux, et sait diffuser en AES67 sur le réseau audio de l'installation. Piloté en OSC, il s'insère dans une conduite existante au lieu de la remplacer.
- Frontend
- nginx port 1881
- Moteur
- FastAPI,
127.0.0.1:8765 - Audio
- AES67 (démon local, bindé loopback)
- Mise à jour
git fetch+ vérification de signature du commit

Hyalite ArtNet — la lumière
Hyalite UV · éclairageObjectif — la même grammaire, appliquée à la lumière : univers ArtNet et DMX, patch, états, déclenchements. Le produit existe à l'état de squelette V1 — interface et authentification sont en place, la logique métier ArtNet ne l'est pas. Le développement s'est arrêté avant.
- Frontend
- nginx port 1882
- Moteur
- FastAPI,
127.0.0.1:8889 - Cible
- ArtNet / DMX512 — univers, patch, cues
- État
- Squelette V1 · métier non développé

Iolite Motion — le mouvement
Iolite · animatroniqueObjectif — le mouvement de décor : axes, servos, animatroniques, séquences. C'est le produit qui devait accueillir la brique de perception (LiDAR, vision) pour faire réagir un décor à la présence des visiteurs. Comme Hyalite, il est resté au stade du squelette V1 : la coquille est là, le moteur ne l'est pas.
- Frontend
- nginx port 1883
- Moteur
- FastAPI,
127.0.0.1:8890 - Cible
- Axes, servos, séquences · perception en V2
- État
- Squelette V1 · métier non développé

Pourquoi ça s'arrête
La suite a prouvé ce qu'elle devait prouver : qu'on peut tenir cinq produits sur une seule architecture, un seul canal de mise à jour et une seule grammaire d'interface. Elle a aussi montré ses limites — trois des cinq produits n'apportaient pas assez face à ce que fait déjà du bon matériel.
Le développement est donc arrêté : les logiciels sont en cours de remplacement par du hardware qualitatif, choisi et intégré plutôt qu'écrit. Ce qui reste de la suite n'est pas perdu pour autant — c'est même ce qui avait le plus de valeur :
- Les invariants d'exploitation — moteur local, nginx devant, mise à jour signée. Ils survivent au code qui les portait.
- La grammaire d'interface — la refonte UI et la bibliothèque de composants partagée, réemployées telles quelles sur les outils clients.
- La Mineral Heraldry — cinq sigils générés puis retouchés à la main, qui restent l'identité visuelle de la maison.
Et un sixième produit continue sa route hors de la suite : Whisperwood Narrator Engine, le narrateur invisible — synthèse vocale multi-moteur pour show control, toujours en ligne.
Voir Whisperwood › Le seul produit de la génération logicielle encore en développement.
