Le hub de mon homelab en une seule interface : etat des services, taches de fond,
mediatheque, domotique et sessions Claude Code, pilotees par Lyra.
PWA React + coque Android (Capacitor), servie par lyra-control-api et accessible depuis le telephone via Tailscale.
English summary. neutroncore is the PWA hub of a self-hosted homelab: services, background tasks, media library, home automation, tracked projects and Claude Code sessions, driven by the Lyra assistant. React 19 + Vite + TypeScript, no UI library, served by the (not yet published) lyra-control-api backend. See ARCHITECTURE.md.
Captures reelles de l'application servie par lyra-control-api, prises par docs/demo/record.py (Chrome sans fenetre via Playwright, assemblage Pillow). La cle API est lue dans ~/.lyra-control.env et n'apparait jamais a l'ecran.
| Ecran | Contenu |
|---|---|
| accueil | "etat du reacteur" (sante globale), alertes a traiter, mascottes des modeles Lyra, sessions Claude Code en cours |
| taches | tracking temps reel (sessions Lyra, conversions DV, scripts), journal, timers systemd |
| projets / lanceur | ouvrir un dossier ou lancer Claude Code sur le PC depuis le telephone, suivre et repondre aux sessions |
| films & series | mediatheque, calendrier des sorties, espace disque, demandes |
| pipeline media | telechargement, sous-titres, conversion : avancement en direct |
| ambiance | lumieres Hue, TV, ampli |
| outils & vms | services, ressources (CPU/RAM/VRAM/disques), VMs KVM, backups Borg/Timeshift, journaux |
| tests | batterie de tests Lyra |
| parametres | 7 themes, densite, notifications, mascottes, mode tele |
Vue détaillée dans ARCHITECTURE.md.
telephone (APK Capacitor) --Tailscale--> lyra-control-api (:9876) --> Lyra, MCP, systemd, stack media...
navigateur (PWA) ---------------> sert dist/ sur /app/
ntfy (docker, IP Tailscale uniquement) <-- notifications push (Claude attend / a fini, alertes)
- Frontend : React 19 + Vite + TypeScript, design system maison dans
src/styles.css, aucune lib UI. - Backend :
lyra-control-api(Python), depot separe. Sans lui, l'interface affiche l'ecran de connexion et rien d'autre. - Auth : cle Bearer saisie au premier lancement (localStorage) ; actions destructives protegees par un jeton HMAC 30 s a usage unique (
X-Confirm). - Android : la coque charge directement l'URL du backend sur le tailnet, donc
npm run buildsuffit pour mettre a jour le telephone, sans recompiler l'APK.
npm install
cp .env.example .env.local # hote media, IP Tailscale, tailnet
npm run dev # proxy /api -> http://127.0.0.1:9876
npm run build # dist/ servi par lyra-control-api sur /app/
./neutroncore-app.sh # fenetre bureau flottante (chrome --app)./build-apk.sh # genere AndroidManifest.xml et network_security_config.xml
./build-apk.sh --install # depuis les templates .in + .env.local, puis gradle + adbLes fichiers Android qui contiennent des adresses (manifest, config reseau) ne sont pas versionnes :
ils sont regeneres a chaque build depuis les templates *.in et ton .env.local.
ntfy/ contient un docker-compose.yml.example et un server.yml.example : ntfy auto-heberge,
ecoute uniquement sur l'IP Tailscale du PC, acces refuse par defaut, un utilisateur + jeton.
Voir ntfy/README.md.
Aucun secret dans le depot : cle API cote client en localStorage, jetons ntfy et cles des services
lus par le backend depuis ~/.lyra-control.env et systemd-creds. Les IP/tailnet sont dans .env.local (gitignore).
MIT
| Dépôt | Rôle |
|---|---|
| lyra | assistant DevOps vocal, local par défaut (AGPL-3.0) |
| fedora-agents | MCP : machines virtuelles KVM et sauvegardes |
| mcp-tracking | MCP + API + tableau de bord des tâches longues |
| neutroncore | hub PWA du homelab |
| hue-mcp | MCP Philips Hue (fork de ThomasRohde/hue-mcp) |
| pylips-mcp | MCP TV Philips |
| denon-mcp | MCP ampli Denon |
| catt-mcp | MCP Chromecast et DLNA |




