Back to sh0
sh0

Construire un tableau de bord de production avec Svelte 5 en 48 heures

Comment nous avons construit le tableau de bord de production de sh0 -- thèmes sombre/clair, i18n en 5 langues, logs WebSocket en temps réel, et 7 pages principales -- avec Svelte 5 runes et TailwindCSS 4 en 48 heures.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min sh0
EN/ FR/ ES
sveltesvelte-5dashboardtailwindcsstypescriptuifrontend

Chaque PaaS a un tableau de bord. La plupart ressemblent à des interfaces construites en 2018 et jamais mises à jour. Nous voulions que le nôtre donne l'impression d'un produit qu'on prendrait plaisir à utiliser -- mode sombre, cinq langues, logs en temps réel, responsive jusqu'au mobile -- et nous voulions qu'il soit compilé dans le binaire Rust pour que sh0 soit livré comme un seul exécutable avec zéro dépendance externe.

Le 12 mars 2026, nous sommes passés d'un dossier dashboard/ vide à une SPA SvelteKit entièrement fonctionnelle avec 7 pages, 8 composants UI partagés, un système i18n couvrant cinq langues, et un client API typé gérant l'authentification, les états d'erreur et la reconnexion WebSocket. Puis nous avons embarqué le tout dans notre binaire Rust avec include_dir. Quarante-huit heures plus tard, chaque page avait de vraies données.

Pourquoi Svelte 5 et pas React

La décision a pris environ trente secondes. Les Runes ($state, $derived, $effect, $props) ont éliminé la cérémonie de stores que React exige. Pas de danse useState / useEffect / useCallback / useMemo. Pas de bugs de tableau de dépendances. Déclarez votre état et utilisez-le.

SvelteKit 2 avec adapter-static nous a donné le routage basé sur les fichiers et une étape de build qui produit du HTML, CSS et JavaScript brut -- exactement ce dont nous avions besoin pour embarquer dans un binaire Rust.

L'échafaudage de la Phase 12

L'échafaudage a livré huit éléments en une seule session : TailwindCSS 4 avec thème personnalisé, le système i18n en 5 langues, le store d'auth et le flux de connexion, le client API, le client WebSocket avec reconnexion automatique, huit composants UI partagés, la mise en page sidebar responsive, et sept pages placeholder.

La Phase 13 : les pages principales prennent vie

Le tableau de bord d'accueil montre quatre cartes de statistiques et une liste de déploiements récents. La liste d'applications est un grille de cartes avec recherche, filtrage et un modal « Créer une application ». La page de détail d'application est la plus complexe : une seule route avec six onglets (Vue d'ensemble, Déploiements, Logs, Domaines, Environnement, Paramètres).

Le LogViewer mérite une mention spéciale. Il ouvre une connexion WebSocket, affiche les lignes entrantes dans un conteneur monospace avec défilement automatique, et maintient un buffer de 1 000 lignes pour empêcher la croissance mémoire.

La Phase 14 : pages étendues

La poussée finale a remplacé les quatre pages placeholder restantes par des implémentations de production : Bases de données, Sauvegardes, Monitoring et Paramètres (avec configuration TOTP et gestion des clés API).

Embarquer le tableau de bord dans un binaire Rust

La crate include_dir a permis d'embarquer le répertoire dashboard/build entier dans le binaire compilé au moment du build. Le handler static_files.rs sert les fichiers depuis le répertoire embarqué, avec un repli SPA vers index.html.

Le résultat : sh0 est un binaire unique. Téléchargez-le, lancez-le, ouvrez un navigateur. Le tableau de bord est déjà là. Pas de npm install. Pas de serveur frontend séparé.

Ce que nous avons appris

Les runes Svelte 5 sont un vrai bond en avant. Le modèle $state / $derived / $effect correspond directement à la façon dont on pense l'interface. TailwindCSS 4 avec propriétés CSS personnalisées est la bonne approche de thème. L'i18n dès le premier jour ne coûte presque rien. Embarquer une SPA dans un binaire Rust se fait étonnamment bien.

En 48 heures, nous sommes passés d'un répertoire vide à un tableau de bord avec 11 pages fonctionnelles, 19 composants personnalisés, 5 langues, thèmes sombre/clair, streaming de logs en temps réel, et variables d'environnement chiffrées -- le tout compilé dans un seul binaire Rust.


Prochain dans la série : Des listes plates aux Stacks : repenser toute notre UX.

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15