Input brut hermes-menagerie (github:ZakiChair/hermes-catppuccin),
module home-mac/hermes-skins qui installe les palettes dans
~/.hermes/skins, active dans la home de marc@macos.
- gerbil-wg0-ensure.nix : supprime wg0 sans adresse avant le demarrage de gerbil, sinon plus aucun trafic ne passe dans le tunnel newt.
- vaultwarden-mcp commente : son secret vit dans secrets/tower.yml, illisible sur anywhere, ce qui cassait setupSecrets a chaque activation.
- zitadel/steps retire : le secret etait chiffre en type:int, refuse par sops-install-secrets ; l'instance est deja initialisee.
- secret oidc_env (secrets/winnie.yml, chiffre pour tower) materialise par le oneshot winnie-oidc-secret dans /var/lib/winnie/oidc.env, requis par winnie-backend (EnvironmentFile non optionnel)
- PKCE : pas de client_secret cote backend
- .sops.yaml : creation_rule pour secrets/winnie.yml
Ressource proxy-resources.sonarr -> 127.0.0.1:8006, healthcheck /ping, meme schema que radarr (proxy-resources + protocol, l'ancien schema que comprend le Pangolin du VPS). SSO actif et auth de l'appli coupee : sans SSO l'UI complete et l'API v3 seraient ouvertes a Internet.
- urlbase = "localhost" (recopie de l'exemple du module nixpkgs) faisait rediriger en 307 TOUT chemin hors base, /api/v3/... compris : les clients API locaux recevaient la page de login. Radarr, Sonarr et Readarr sont servis a la racine du domaine
- settings.auth.method = "External" : l'auth de l'appli ne filtre rien derriere le tunnel newt (les requetes distantes arrivent de 127.0.0.1, donc vues comme locales) et la porte reste le SSO Pangolin. Ni Radarr 6.x ni Sonarr 4.x n'ont d'OIDC natif (arrive dans Sonarr 5)
Le 12/10/2026 le disque de 46 G est monte a 100 % : pangolin-pre-start a echoue en « No space left on device » et traefik/gerbil sont tombes en cascade (plus rien sur 80/443). --delete-older-than 30d laissait ~18 G de generations et journald montait a 4,1 G (10 % par defaut). 14 j et SystemMaxUse=500M laissent de la marge.
- services.hermes.enableAgent = false : le chat est inerte sur le VPS (aucun token Matrix/Discord, modele DirectSDK sans login claude) et tirait claude-code (unfree) dans le build. L'utilisateur hermes, sa cle SSH et le sudo nixos-rebuild restent : c'est par la que tower deploie en remote
- home-manager.users.marc : le profil marc (geminicommit, etc.) est installe sur le VPS
Politique du 13/10/2026 : le shell n'attend plus de validation avant d'executer. « off » est un bypass teste AVANT les branches cron / single_query / unattended, donc il coupe aussi les refus par defaut en contexte headless. Restent actifs malgre off : la blocklist hardline code-shippee et les regles approvals.deny (vides ici).
Le module melangeait l'acces (utilisateur hermes, cle SSH, sudo nixos-rebuild, python3 systeme pour le probe SSH de Desktop, git safe.directory) et le gateway lui-meme : couper le chat sur un hote ou il est inerte retirait aussi le moyen de s'y connecter et d'y deployer. config passe en lib.mkMerge : le bloc acces s'applique toujours, le gateway (postgres, MCP, claude-code unfree, service hermes-agent) seulement si enableAgent.
Module services.llm-steamdeck, desactive par defaut (enable a passer a true dans le profil deck, cf. README) : llama-server en Vulkan sur RADV, GGUF telecharge depuis Hugging Face au premier demarrage, web UI, limites memoire pour les 16 Go unifies. Importe par services/default.nix (donc inerte sur laptop/tower) et par profiles/deck.
- services/cage-waydroid : waydroid dans un cage HEADLESS, expose en VNC standard (wayvnc 5902, auth DES = le seul mode que macOS Screen Sharing negocie), plus un pont noVNC sur 127.0.0.1:6082
- root volontaire : waydroid-net.sh cree le bridge waydroid0 (CAP_NET_ADMIN) et la session waydroid est un SINGLETON global, c'est ce service qui la detient
- tower : virtualisation.waydroid.package = waydroid-nftables, le noyau n'a que nf_tables (le waydroid-net.sh standard sort en « iptables (legacy): can't initialize iptables table nat »)
- newt : ressource android.marcpartensky.com -> 127.0.0.1:6082 derriere le SSO Pangolin
- modules/nixos/kasmvnc-chrome-cdp.nix : lance un Chromium dans le desktop KasmVNC avec --remote-debugging-port=9222, profil persistant /home/marc/chrome-cdp-profile
- Le MCP Playwright s'y attache (--cdp-endpoint http://127.0.0.1:9222) : les actions d'automatisation se font dans CETTE fenetre, donc visibles en direct sur le bureau distant (8443 en LAN, kasm.marcpartensky.com)
- CDP reste sur 127.0.0.1 : un port CDP joignable donne le controle total du navigateur par quiconque l'atteint, donc jamais au LAN ni via Pangolin
- newt : healthcheck HTTP sur le vhost local 8288 (KasmVNC repond 200 sur "/" avec disableBasicAuth) ; sans lui la cible sortait du load-balancer
- ExecStartPre tue toute Xvnc sur le display configure puis purge lock et socket avant de demarrer (une session precedente orpheline tenait :20 apres un switch : « A VNC server is already running », exit 29, crash-loop). Le display est passe en ARGUMENT dans la meme commande : en liste, systemd executerait chaque element comme une commande separee.
- ConditionUser=marc : l'unite est installee dans /etc/systemd/user et hermes demarre aussi un user manager linger avec default.target actif ; sans ca il lançait une deuxieme instance sur :20 et son activation utilisateur echouait au switch (rc=4).
- winnie-frontend : build Vite (app/dist) servi par static-web-server sur 8888, aligne avec la ressource Pangolin winnie-frontend (un desaccord = 502, port en cache cote newt)
- newt : nouvelle ressource dioxus-frontend (dioxus.marcpartensky.com)
La chaine de secours hermes passait de inkling:free a nemotron (meme modele, pas de basculement vers un modele different). openrouter-mcp ecrit aussi le default_model nemotron dans sa config.toml.
Trois binaires dans le profil systeme, patron de services/amazon-mcp :
- hinge-auto-login chromium visible (telephone + SMS), session persistee dans /var/lib/hermes/hinge-auto/user-data
- hinge-auto-like boucle de likes headless sur Discover (HINGE_MAX_LIKES defaut 40, detection de fin de flux)
- hinge-auto-calibrate dump des boutons pour affiner les selecteurs
Profil partage hermes <-> marc via ACL tmpfiles. Garde-fous : limite ~8 likes/jour gratuite Hinge, arret sur marqueur de fin.
- Variables sans underscore (GOTIFY_OIDC_CLIENTID, ...) : les formes snake_case sont ignorees en silence par Gotify 3.x
- LISTENADDR 127.0.0.1 (exposition via newt/Pangolin uniquement), SSO Pangolin desactive : les clients natifs (appli Android, gotify-cli, scripts /message) ne suivent pas de redirection navigateur
- OIDC_LINK_BY_USERNAME + AUTOREGISTER : rattache l'identite Zitadel au compte local renomme
- after/wants newt + StartLimitIntervalSec=0 : le discovery OIDC 503 au boot si le tunnel n'est pas monte
Noyau 6.18.54 avec ANDROID_BINDER_IPC/BINDERFS/MEMFD_CREATE : pas de module out-of-tree ni reboot. waydroid-container echoue proprement tant que 'waydroid init' n'a pas ete lance une fois (root, ~1,2 Go d'images).
KasmVNC etant un serveur X, Plasma tourne en session X11 (startplasma-x11) avec une arborescence de donnees isolee (plasmaDataEnv + plasmaConfigDir) exportee uniquement dans l'unite, sans toucher a la session niri locale de marc.
- desktop = "plasma" : xstartup startplasma-x11, look-and-feel org.hermes.kasm.desktop (konsole + LibreWolf epingues)
- disableBasicAuth : le SSO Pangolin gate deja kasm.marcpartensky.com, fin du double login kasmvncpasswd
- setxkbmap ajoute au PATH (kded6 configure les claviers via ce binaire)
Rustguac : guacd en loopback (tls=false) + vhost guac.marcpartensky.com
(sans ACME, TLS par Pangolin). KasmVNC : display :20 (pas :1, session X
existe deja), desktop lxqt (lxqt-wayland refuse), mot de passe regeneré
par empreinte sops, auth HTTP 200/401 testee. Rustdesk : ports reels 1.1.16,
hbbs/hbbr corriges; nginx guac/kasm en loopback. Vault/rustguac secrets
lues par le bon user (vault, rustguac, marc) au lieu de root. WireGuard
client sur wg1 (10.100.0.3/32, endpoint VPS 104.129.12.158:443) desactive
tant que le secret sops wireguard/tower_private_key n'existe pas (evite
le blocage sops-nix sur tout le build). hermes.extraGroups += systemd-journal.
Stub HTTP + registration synapse + login unique. Registration sous
/var/lib/matrix-marc-agent-as (StateDirectory) : sous /var/lib/hermes/.matrix
(0700) synapse ne pouvait pas la lire, et ReadWritePaths sur un dossier absent
faisait echouer l'unite en 226/NAMESPACE, ce qui bloquait le switch.
sops-install-secrets échouait sur ce fichier ('Could not decrypt with
AES_GCM: cipher: message authentication failed'), ce qui bloquait TOUT
nixos-rebuild switch sur tower (pas seulement les services concernés).
Recréé avec une nouvelle valeur aléatoire pour les deux clés partagées
(hermes_discord_bridge_env, discord_bot_hermes_bridge_env) : secret
purement interne (loopback 127.0.0.1, jamais exposé), la rotation ne
casse rien côté consommateurs (discord-bot, hermes-discord-bridge, API
server par défaut) puisqu'ils relisent tous la même valeur au prochain
switch.
services/nextcloud/password.txt était committé en clair ("nextcloudpassword")
depuis le 25/11/2025, jamais référencé dans la config, exposé publiquement
sur github/codeberg depuis. Supprimé.
adminpassFile ne fixe le mot de passe QUE lors de l'install initiale (occ
maintenance:install) : sur une instance déjà installée il est ignoré, donc
juste changer le secret sops n'aurait pas suffi. Ajout d'un ExecStartPost
sur nextcloud-setup qui force le mot de passe du compte root à la valeur
sops à chaque activation (self-healing).
Vérifié sur tower : ancien mot de passe "nextcloudpassword" -> 401 après
le switch, hash oc_users.password changé.
Modules NixOS pour une gateway d'accès distant multi-protocole : rustguac
(remplacement Guacamole, OIDC, audit, enregistrement), kasmvnc (bureau
Wayland LXQt), rustdesk (relais P2P hbbs/hbbr), vault-rustguac (Vault en
mode dev pour stocker les identifiants de connexion des deux premiers),
plus les vhosts nginx associés.
Importés dans services/default.nix mais NON activés sur aucun profil
(enable reste false partout) : domaines (guac.example.com, auth.example.com),
token Vault dev et secret OIDC sont encore des placeholders TODO dans les
modules, à finir avant tout services.*.enable = true.
Le fichier secrets/discord-hermes-bridge.yml n'a pas (encore) été rekeyé côté
sops (hermes ne peut pas déchiffrer/réécrire un secret existant : pas de clé
age privée). Utilise key= pour lire la clé qui existe réellement, TODO pour
marc de renommer proprement plus tard.
Trouvé en testant le build réel (nixos-rebuild build) : sops-install-secrets
échouait avec 'the key hermes_api_server_env cannot be found'.
tmpfiles crée le dossier /var/lib/hermes/.hermes/desktop-plugins/vim-bindings ;
le service qui l'active est commenté (heredoc JS mal géré par nix pour le moment).