12 KiB
Prompt Claude Code — MQTT Web Explorer (Go backend persistant + UI Monokai)
Tu es Claude Code. Tu dois générer un projet complet (code + fichiers + docker) pour un client web MQTT avancé, inspiré de MQTT Explorer, avec un backend Go persistant (toujours connecté au broker même si aucune page web n’est ouverte) et une UI moderne responsive (laptop + smartphone/tablette) avec thèmes Dark Monokai / Light séparés en fichiers.
Le résultat doit être prêt à builder et lancer via Docker. tu me parlera en francais et les commentaire de code en francais egalement effectue une analyse globale du projet et tu me proposera en detail de l architecture, un dessin ascii draww de l interface web. un plan de devellopement, un structure des dossier. les fichiers de documentation seront stocker dans un dossier doc et doc/analyse. recherche des icones et images a utiliser dans le projet avec des propositions
0) Principes d’architecture (non négociables)
Backend persistant
- Le backend Go doit se connecter au(x) broker(s) et rester connecté en continu.
- Les messages doivent continuer d’être reçus et stockés même si :
- aucun navigateur n’est ouvert,
- aucune session WebSocket n’est active.
- Le frontend n’est qu’un client de visualisation (il ne parle jamais directement au broker MQTT).
Perf / ressources
- Priorité à la sobriété CPU/RAM côté serveur.
- Éviter les dépendances lourdes.
- UI fluide même avec beaucoup de topics.
1) Objectif fonctionnel
Créer une application web permettant de :
- Explorer les topics MQTT sous forme d’arbre hiérarchique (type “CLI tree” pliable/dépliable).
- Filtrer / rechercher efficacement (pour lisibilité).
- Inspecter les messages : raw, JSON lisible, JSON tree, diff dernier/précédent.
- Historiser les messages en SQLite avec auto-purge (TTL).
- Afficher des images dans le payload (base64 data URL, base64 brut, champ JSONPath).
- Publier des messages (topic/payload/qos/retain).
- Tracer des valeurs numériques (payload brut ou JSONPath) via un graphe léger.
- Gérer plusieurs brokers depuis l’UI (profils), avec test réseau (DNS/TCP/TLS/MQTT).
- Être utilisable sur laptop et mobile/tablette (layout adaptatif).
- Avoir un onglet Paramètres complet.
- Être dockerisé (Dockerfile multi-stage + docker-compose).
2) Stack imposée
Backend
- Langage : Go
- Framework : Fiber ou Gin (choisis-en un)
- MQTT client : lib robuste Go (ex: paho)
- WebSocket : natif Go + hub
- Stockage : SQLite obligatoire
- Configuration : variables d’environnement + fichiers optionnels
Frontend
- TypeScript + Vite
- React (préféré)
- UI : CSS variables + composants simples
- Icônes : Lucide (ou équivalent SVG, via
currentColor) - Graphe : uPlot (léger)
- Police monospace : JetBrains Mono (topics/payload) + option UI sans-serif (Inter)
3) Arborescence attendue (monorepo)
/
├─ backend/
│ ├─ cmd/server/main.go
│ ├─ internal/
│ │ ├─ api/ # routes HTTP
│ │ ├─ ws/ # hub websocket + events
│ │ ├─ mqtt/ # connexion, subscribe, reconnexion
│ │ ├─ storage/ # sqlite, migrations, purge TTL
│ │ ├─ topics/ # index/arbre, stats
│ │ ├─ images/ # helpers détection (optionnel)
│ │ └─ config/ # parsing env + validation
│ ├─ migrations/
│ └─ go.mod
│
├─ frontend/
│ ├─ public/
│ │ ├─ favicon/
│ │ │ ├─ favicon.svg
│ │ │ ├─ favicon-32.png
│ │ │ ├─ favicon-16.png
│ │ │ └─ apple-touch-icon.png
│ │ └─ site.webmanifest
│ ├─ src/
│ │ ├─ themes/
│ │ │ ├─ theme-dark-monokai.css
│ │ │ ├─ theme-light.css
│ │ │ ├─ index.ts
│ │ │ └─ types.ts (optionnel)
│ │ ├─ styles/
│ │ │ ├─ base.css
│ │ │ ├─ typography.css
│ │ │ └─ components.css
│ │ ├─ utils/
│ │ │ ├─ theme.ts
│ │ │ ├─ api.ts
│ │ │ └─ format.ts
│ │ ├─ components/
│ │ │ ├─ TopicTreeCli.tsx
│ │ │ ├─ TopicDetails.tsx
│ │ │ ├─ PayloadViewer.tsx
│ │ │ ├─ PublishPanel.tsx
│ │ │ ├─ ChartsDock.tsx
│ │ │ ├─ SettingsPanel.tsx
│ │ │ └─ Icons.tsx
│ │ ├─ pages/
│ │ │ └─ App.tsx
│ │ └─ main.tsx
│ ├─ index.html
│ └─ package.json
│
├─ docker/
│ └─ mosquitto/
│ └─ mosquitto.conf
│
├─ docker-compose.yml
├─ Dockerfile
└─ README.md
4) UI/UX — exigences de design (Monokai + responsive + CLI tree)
4.1 Thèmes séparés (obligatoire)
- Chaque thème dans un fichier CSS séparé (chargement dynamique).
- Thèmes requis :
dark-monokai(fond principal #272822, palette Monokai officielle)light(clair neutre, accents cohérents)
- Stocker le choix utilisateur (localStorage) + respecter
prefers-color-schemeau premier chargement.
Variables minimales dans chaque thème (au moins) :
--bg-main,--bg-panel,--bg-code,--border--text-main,--text-secondary,--text-muted- Accents :
--accent-blue,--accent-green,--accent-yellow,--accent-orange,--accent-red,--accent-purple - JSON :
--json-key,--json-string,--json-number,--json-boolean,--json-null - Tree :
--tree-guide,--selected-bg,--hover-bg --focus-ring,--icon
4.2 Polices
JetBrains Monopour topics, payload, diff, timestamps.- Option :
Interpour UI générale.
4.3 Layout responsive
- Desktop : 3 zones (TopicTree / Details / Graph dock).
- Tablet : tree en drawer + details plein, graphs en dessous.
- Mobile : navigation par onglets :
- Topics | Details | Publish | Graphs | Settings
- Zones tactiles larges, barres collantes (sticky) quand utile.
4.4 “CLI Topic Tree” (forte valeur ajoutée)
- Rendu monospace type terminal + glyphes :
▾ouvert,▸fermé,│guides.
- Actions :
- clic: toggle
- Alt+clic: expand récursif
- Shift+clic: collapse récursif
- clavier: flèches ↑↓←→
- Boutons globaux :
- Collapse all
- Expand all (profondeur max)
- Expand to selection
- Performance :
- éviter re-render complet
- mémoriser open/closed par profil
- virtualisation si trop de topics (si faisable simplement)
4.5 Icônes
Utiliser des icônes SVG (Lucide) :
- copier topic, copier payload
- clear history topic
- delete retained
- publish
- afficher image (preview)
- graph
- settings
- search/focus
Tooltips obligatoires sur desktop.
5) Recherche / filtres (efficacité et lisibilité)
Zone de recherche + filtres qui doit permettre :
- Filtre topic : texte + wildcard + mode regex
- Filtre payload : contains + regex
- Toggles rapides :
- retained-only
- json-only
- numeric-only
- image-only
- active-only (activité < X secondes)
- Mode Focus : masque tout sauf résultats
- Tri :
- activité récente
- alphabétique
- taille payload
- fréquence msgs/s
Option : auto-collapse des branches non matchées pendant filtre.
6) Payload viewer (optimisé JSON lisible + diff)
Dans TopicDetails :
- Onglets : Raw | Pretty JSON | JSON Tree | Diff
- JSON Pretty :
- indentation configurable
- wrap/nowrap
- erreurs JSON visibles
- JSON Tree :
- expand/collapse
- recherche interne
- copy value
- copy JSONPath
- Diff :
- dernier vs précédent
- diff texte (ligne à ligne)
- diff JSON si valide
Limiter le rendu si payload énorme (max bytes) + bouton “charger complet”.
7) Détection & affichage images (base64 + brut)
Détecter et afficher des images si :
- payload commence par
data:image/...;base64, - base64 pur décodable contenant signature PNG/JPEG/GIF/WEBP
- JSON contenant champ image via liste JSONPath configurable (ex:
$.image,$.snapshot,$.payload.image)
Afficher :
- thumbnail dans details
- modal zoom (fit-to-panel)
- lazy-load + taille max preview configurable
8) Historique SQLite (obligatoire) + auto purge TTL
Stockage
- Tous les messages reçus sont insérés en SQLite (asynchrone, queue).
- Ring buffer RAM optionnel pour ultra-réactivité UI.
Auto-purge
- TTL configurable (ex: 7 jours)
- Job périodique (toutes les 5–15 min) :
DELETE FROM messages WHERE ts < now - ttl
VACUUM: pas trop fréquent (1/jour max ou bouton manuel).
Purge par topic
- Endpoint + bouton UI : “Clear topic history”
- Efface l’historique complet du topic en base.
Indexation
- Index indispensable :
(topic, ts).
9) Multi-serveurs MQTT (profils) + test réseau
Profils depuis l’UI
CRUD profils :
- name
- host / port
- TLS (on/off)
- username / password
- clientId (stable)
- keepalive
- default subscribe (ex
#) - qos default
- reconnect policy
Sauvegarde :
- au minimum localStorage
- idéalement SQLite côté backend (si multi-user envisagé)
Test réseau (obligatoire)
Depuis l’UI, bouton “Test” → backend :
- DNS resolve
- TCP connect (latence + timeout)
- TLS handshake (si TLS)
- MQTT connect/auth (CONNACK) Retour UI : statut + détails d’erreur.
10) Paramètres (onglet Settings) — options à afficher
L’onglet Paramètres doit contenir ces sections :
- Profils MQTT
- liste + CRUD + import/export JSON
- bouton Test
- bouton Connect/Disconnect
- Souscriptions & filtrage global
- topic root subscribe (ex
#) - filtres par défaut + Focus mode par défaut
- tri par défaut
- topic root subscribe (ex
- Historique & rétention SQLite
- TTL (durée conservation)
- fréquence purge
- stats DB (taille, nb lignes)
- boutons : Purge now, Vacuum now (warning)
- Affichage payload
- mode par défaut (Raw/JSON/Tree)
- indentation, wrap
- diff auto (on/off)
- max bytes rendu
- Détection images
- activer (on/off)
- JSONPath list
- taille max preview
- Graphiques
- activer auto-plot
- JSONPath numeric list
- fenêtre (N points / X minutes)
- Topics tree
- profondeur expand-all
- auto-collapse pendant filtre
- mémoriser open/closed
- Thème & UI
- sélecteur de thème (dark-monokai / light)
- Sécurité
- mode lecture seule (désactive publish/delete)
- masque secrets dans logs
- Diagnostic
- niveau logs
- stats runtime (ws clients, msgs/s)
11) Endpoints backend requis
HTTP
GET /api/healthPOST /api/test-connectionGET /api/topics(snapshot arbre + last message + stats)GET /api/topic/:topic/history?limit=&from=&to=POST /api/topic/:topic/clear-historyPOST /api/publishPOST /api/retained/delete(optionnel)GET/POST /api/settings(optionnel si stockage serveur)GET/POST /api/profiles(optionnel si stockage serveur)
WebSocket
GET /ws/events- push des events :
- message reçu (topic, ts, qos, retain, payloadPreview, type hint json/image/numeric)
- stats périodiques
- push des events :
12) Docker (obligatoire) + Mosquitto de test
docker-compose
- Service
mosquittoavec config fournie (websockets activés pour tests). - Service
mqtt-web-explorer:- build multi-stage
- expose
http://localhost:8088 - volume persistant pour SQLite (ex:
./data:/data) - restart: unless-stopped
Dockerfile multi-stage
- build frontend → fichiers statiques
- build backend → binaire Go
- image finale minimale
13) Favicon / manifest / PWA basique
Prévoir :
public/favicon/favicon.svgfavicon-16.png,favicon-32.pngapple-touch-icon.pngsite.webmanifest(name, icons, theme_color, background_color)
Icône simple lisible : ondes MQTT + node.
14) Qualité attendue
- Code propre, structuré, commenté (là où ça aide)
- Erreurs affichées clairement dans l’UI
- Pas de dépendances inutiles
- Le projet doit fonctionner après :
docker compose up -d --build
15) Sortie attendue de Claude Code
- Génère l’arborescence complète.
- Génère le contenu complet de chaque fichier.
- Fournis un
README.mdclair :- configuration env
- lancement docker
- description features
- limites connues
- Assure-toi que le projet compile et démarre.
Fin.