287 Commits
Author SHA1 Message Date
Hermes Agent ecdc94eec1 feat(android-capture): emulateur AVD en service, installation des APK deposes
L'emulateur etait le maillon manquant : la capture tournait deja en service, mais la cible
avd ne vivait que si une session interactive la lancait.

- android-emulator : AVD headless avec -tcpdump vers pcap/avd/. JAVA_HOME force au JDK 17
  qu'androidenv utilise lui-meme, parce que le runner appelle la version non encapsulee du
  SDK, celle qui reclame JAVA_HOME et sans laquelle l'AVD n'est jamais cree.
- android-avd-install : timer qui installe au boot les APK deposes dans apks/.
- aucune unite bloquante : ni wantedBy sur une oneshot d'installation, ni ExecStartPost qui
  attend le boot Android. Une unite laissee en cours de demarrage bloque toute activation
  nixos-rebuild, qui sort en « unit already loaded ».
- le dossier apks/ est cree par le service, une regle tmpfiles ne suffisait pas.

Verifie sur tower : switch code 0, qemu actif sous le service, emu.pcap ecrit et croissant
sous l'utilisateur de capture, co.hinge.app installe dans l'AVD du service.
2026-11-03 10:32:23 -05:00
Hermes Agent 8870cafdf9 feat(android-capture): capture reseau isolee par instance Android ; pcaps qui tournent et digest par cible
Une cible = une instance Android, donc une interface et ses propres fichiers : c'est la
seule isolation franche du trafic par appli, et elle ne demande aucun root.

- waydroid : capture sur le bridge waydroid0.
- avd : alimentee par le -tcpdump de l'emulateur, qui sort par la pile reseau de l'hote.
- rotation de 10 min, 72 fichiers conserves (12 h), digest d'hotes par cible.

Pas de root : CAP_NET_RAW et CAP_NET_ADMIN en capacites ambiantes, donc NoNewPrivileges
reste a false (systemd refuse la combinaison). Utilisateur statique et non DynamicUser,
plusieurs unites partageant le meme arbre d'etat. marc et hermes sont ajoutes au groupe
pour lire les captures sans root.

Verifie sur tower : tcpdump a l'ecoute sur waydroid0, deux jeux de pcaps distincts, digests
ecrits par les timers (avd : connectivitycheck.gstatic.com ; waydroid : play.googleapis.com).
2026-11-03 00:58:45 -05:00
Hermes Agent b2878b05dd feat(macos): Firefox quotidien pilotable par Hermes (launchd + MCP connectExisting) 2026-11-02 21:38:13 -05:00
Hermes Agent 7128ce5dec feat(hermes): paquet anthropic dans le venv (provider natif claude)
Les lignes du sélecteur de modèle SANS suffixe [1m] (claude-opus-5-5, claude-opus-5, claude-sonnet-5) passent par le provider natif anthropic, pas par claude-subscription-directsdk. Sans le paquet python anthropic dans le venv scellé, une session ouverte sur une de ces lignes meurt en agent_init_failed : "The 'anthropic' package is required for the Anthropic provider" (lazy installs désactivés par le packaging nix).

Auth du provider natif : aucune clé API à poser, agent/anthropic_credentials.py prend l'OAuth de l'abonnement dans ~/.claude/.credentials.json (refresh et réécriture gérés par Hermes), ou un grant Hermes via hermes auth add anthropic --type oauth.

Les lignes AVEC [1m] (provider claude-subscription-directsdk, CLI claude) ne changent pas. Supprime aussi la ligne commentée devenue doublon : extraDependencyGroups n'est défini qu'une fois.
2026-11-01 13:00:43 -05:00
Hermes Agent 59b41c48f0 feat(mcp): serveur MCP "mac" pour piloter le Mac (builds Winnie)
MCP stdio lancé par hermes-agent sur tower ; parle au Mac en ssh (alias
maclan puis mac, clé hermes). Tools : status (winnie-doctor + révisions),
sync, doctor_fix, xcode_fix (3 opérations root via la règle sudo
NOPASSWD xcode-select/xcodebuild/xcrun), runtime_install et les builds
(arrière-plan, suivi par log_tail) : ios_init, ios_build_sim,
macos_build.

Vérifié : pycodestyle/pyflakes, build de la dérivation, sonde stdio
(tools/list + appels réels sur le Mac), éval du toplevel avant commit.
2026-10-24 15:54:34 -04:00
Hermes Agent eb71f8ae64 fix(gitea): OIDC Zitadel réellement fonctionnel (source OAuth2, app Web)
L'ancien câblage ne pouvait pas marcher : client_id littéral "gitea"
(impossible, Zitadel génère les client_id) et oneshot qui échouait à chaque
boot sur --enabled (flag inexistant en Gitea 1.27.x), avalé par `|| true`.

- App Zitadel "Gitea" (projet marcpartensky) : appId 396570385799184684,
  clientId 396570385799250220, type Web, redirect
  https://git.marcpartensky.com/user/oauth2/zitadel/callback
- oneshot gitea-oidc-init : add-or-update (id de login_source via psql),
  secret lu depuis sops à chaque exécution, idempotent même en dérive
- [openid] d'app.ini : OpenID 2.0 legacy, désactivé (sans rapport avec OIDC,
  échouait en "rel=openid2.provider not found" avec une URL Zitadel)
- [oauth2_client] : ENABLE_AUTO_REGISTRATION, USERNAME=email,
  ACCOUNT_LINKING=login (page de liaison unique pour le compte local marc)
- ressource Pangolin : auth.sso-enabled=false (auth Gitea seule, une seule
  couche, clients git/API à token non bloqués par un redirect SSO)
- secrets/gitea-oidc.yml : vrai oidc_client_secret (chiffré, clé tower)
2026-10-24 15:44:57 -04:00
Hermes Agent 037c49265e fix(winnie): reinit. unique du layout Garage et ingest en Type=exec
Le premier bootstrap avait laisse un layout Garage a zero noeud (quorum de 0, inapplicable) : purge unique de meta/data avant le demarrage du service, winnie-bucket reprovisionne bucket, cle et s3.env. L'ingest passe de Type=oneshot a Type=exec pour que RuntimeMaxSec s'applique, et S3_ENV_FILE force le redemarrage du backend quand Garage est provisionne apres son premier demarrage.
2026-10-24 15:08:22 -04:00
Hermes Agent ffee0792c1 fix(vaultwarden): initialiser le mot de passe apres postgresql
postgresql.service est Type=notify : sans after et requires, le oneshot qui pose le mot de passe de la base partait en parallele et mourait sur « connection to server on socket /run/postgresql/.s.PGSQL.5432 failed » (boots du 22/10 20:29 et du 23/10 09:37).
2026-10-24 15:08:22 -04:00
Hermes Agent 68a5c3fb55 fix(hermes): refus explicite de la telemetrie shared_metrics
enabled=false, send=false et offer_version=2 ecrits dans config.yaml : la question de partage des stats ne revient plus a chaque session (le defaut ne compte pas comme reponse) et rien n'est collecte.
2026-10-24 15:08:22 -04:00
Hermes Agent bcb7eb43d5 feat(hermes-guests): agents anna et yves pour l'appli mobile
Deux agents separes au niveau OS (utilisateurs anna et yves, HERMES_HOME dedie, tmpfiles + ExecStartPre qui recree le squelette du home en mode managed), outils dangereux desactives et /api/pty comme /api/files bloques par nginx. Exposes en hermes-anna et hermes-yves.marcpartensky.com ; identifiants hors store nix sous /var/lib/hermes/guests.
2026-10-24 15:08:22 -04:00
Hermes Agent f875aaf9de feat(hermes-mobile): backend de l'appli mobile sur le profil default
services/hermes-pocket devient services/hermes-mobile : le backend de l'appli F-Droid sert le profil default (meme historique, memoire, skills et modele que le gateway Matrix et le dashboard) au lieu du profil isole pocket, en gardant la porte d'auth native (mobile-serve.env). Le nom de ressource Pangolin reste hermes-pocket : le renommer recreerait une ressource sur un domaine deja pris.
2026-10-24 15:08:11 -04:00
Hermes Agent 030332d4a3 feat(tower): route le LAN dans wg1 (routeur + NAT)
tower fait routeur pour son LAN : ip_forward et NAT wg1 -> wlan0 (sortie avec l'IP LAN 192.168.1.44), et le pair tower cote VPS declare desormais 192.168.1.0/24 dans ses allowedIPs. Le Steam Deck et le reste du LAN deviennent joignables depuis rack sans dependre d'un forward de la box.
2026-10-24 15:08:11 -04:00
Hermes Agent 69dd5cae6c feat(pangolin): garde runtime de wg0 (adresse + exception pare-feu)
Timer de 5 minutes qui remet 100.89.128.1/24 et la route du 100.89.128.0/24 sur wg0, et reinsere l'exception iptables INPUT pour 100.89.128.0/24 : tailscaled jette cette source recue sur une interface autre que tailscale0, ce qui avait coupe le tunnel Pangolin 6h40 le 23/10. Complement de gerbil-wg0-ensure.nix, qui ne couvre que le demarrage de gerbil.
2026-10-24 15:08:03 -04:00
Hermes Agent 932e3bc83d feat(mesh): headscale durci (DERP embarque) et noeuds tailscale
Le controleur headscale du VPS passe en mode durci : flotte DERP de Tailscale retiree (derp.urls vide), DERP embarque sur le VPS (region 900, verify_clients) et STUN en UDP 3478 ; route Traefik headscale.marcpartensky.com -> 127.0.0.1:8090. Cote clients, services/tailscale remplace l'ancien secret tailscale/auth_key (absent) par headscale/preauth_key, coupe l'envoi de logs vers Tailscale Inc (disableUpstreamLogging) et est importe sur tower, le deck et anywhere.
2026-10-24 15:08:03 -04:00
Hermes Agent 1435174674 feat(ygg-mesh): client macOS (nix-darwin)
Paquets yggdrasil + tor et deux launchd.daemons (tor SOCKS 127.0.0.1:9050,
yggdrasil sur /etc/yggdrasil.conf) pour faire entrer le Mac dans le mesh.
/etc/yggdrasil.conf (mot de passe partagé) reste hors du store, à créer
une fois à la main ; le torrc ne contient aucun secret.
2026-10-23 10:31:36 -04:00
Hermes Agent ab03b394a0 feat(ygg-mesh): réseau privé Yggdrasil entre tower, deck et anywhere
Module services/ygg-mesh : Yggdrasil en réseau privé (mot de passe partagé,
clés publiques épinglées), liens Tor via une instance tor dédiée (onion
service par machine) et lien direct multicast prioritaire sur le LAN.
Chaque machine garde une adresse IPv6 stable et un nom <host>.ygg.

Secret dans secrets/ygg-mesh.yml (règle .sops.yaml dédiée) ; config rendue
à chaud au démarrage (ExecStartPre + credential systemd), le mot de passe
ne touche jamais le store. Identités et clés dans la table `nodes`.
2026-10-23 10:31:36 -04:00
Hermes Agent 2f51bb8d49 chore(newt): 1.17.0 (unstable) pour le P2P 2026-10-23 10:24:12 -04:00
Hermes Agent 1ca4f0b070 feat(nextcloud): domaine trusted cloud.p2p.marcpartensky.com 2026-10-23 10:24:12 -04:00
Hermes Agent d73b7c5d7d feat(pangolin): API d'integration pilotable par MCP
enable_integration_api + route traefik int-api (127.0.0.1:3003).
MCP hermes: cle sops pangolin_api_key, binaire nix, outils
private-resource completes (domainId/subdomain/scheme).
Stub de licence patche localement (AdvancedPrivateResources).
2026-10-23 10:24:12 -04:00
Hermes Agent 1bf853a56a fix(deck): secret monero dedie et planning sans CalDAV 2026-10-19 02:38:26 -04:00
Hermes Agent 7615d98b36 feat(stalwart-mcp): serveur MCP JMAP pour tower
stalwart-mcp (Rust) parle JMAP au Stalwart du VPS, patche pour l'URL
API et l'envoi depuis l'identite marc. Mot de passe dedie dans
secrets/stalwart-mcp.yml ; importe par tower seulement, pour eviter
le conflit de cle sops avec services/stalwart sur anywhere.
2026-10-19 02:07:33 -04:00
Hermes Agent 4f5acfaf61 feat(monero): minage planifie selon le calendrier Nextcloud
Le mineur ne tourne que 01:00-09:00, plus en semaine 09:00-18:00
quand un evenement du calendrier sg est actif. Le wallet vient de
secrets/monero.yml via LoadCredential (plus dans la ligne de
commande) ; meme planning sur le Deck.
2026-10-19 02:07:32 -04:00
Hermes Agent de94c3e4bf feat(wireguard): tower rejoint le wg1 du VPS en pair 10.100.0.3
Le forward de box 77.207.176.170:42070 est mort : tower devient pair
client du hub wg1 avec persistentKeepalive. L'alias ssh tower pointe
sur 10.100.0.3 et la cle root du VPS est autorisee sur tower. Cle
privee dans secrets/wireguard.yml (recipient tower).
2026-10-19 02:07:32 -04:00
Hermes Agent 8e604e3f8f fix(stalwart): cles de secrets explicites, allowed-ip, meetup
Renomme stalwart_mail_pw2/pw3, spam_pw, noreply_pw, admin_pw, bob_pw
et acme_secret en stalwart_*_password / stalwart_acme_secret, un
fichier sops par usage.
66.108.44.154 passe en allowed-ip : l'auto-ban persiste en base et
bloquait le domicile sur 25/465/993.
meetup@marcpartensky.com partage la boite de marc.

Les blobs common.yml et anywhere.yml sont re-chiffres dans le meme
commit (renommage des cles Stalwart, rotation, postgres_crt/key).
2026-10-19 02:07:32 -04:00
Hermes Agent 7655391102 feat(zitadel): secret SMTP + PAT admin lisible par hermes
secrets/zitadel-smtp.yml porte le mot de passe du compte d'envoi pour
le provisioning SMTP par API (v2 ignore la config runtime). Le PAT
admin est materialise en 0400 pour hermes et rotate.
2026-10-19 02:07:32 -04:00
Hermes Agent f859ddb8e5 fix(hermes-pocket): active la porte d'auth du serve headless
dashboard.public_url engage auth_required : la racine ne sert plus le
token de session en clair derriere Pangolin. Le flux client passe par
/auth/password-login puis un ws-ticket a usage unique. nginx annonce
https et la sonde devient /api/status.
2026-10-19 02:07:20 -04:00
Hermes Agent 25a4da39af fix(hermes-webui): OIDC Zitadel a la place du SSO Pangolin
App Zitadel publique en PKCE (client_id 395733475048620332), claim
preferred_username limite a marc@marcpartensky.com, redirect explicite
car nginx reecrit le Host. SSO Pangolin coupe pour eviter le double
login.
2026-10-19 02:07:20 -04:00
Hermes Agent 0d03aa3a83 feat(hermes): DeepSeek v4.1 Flash par defaut, MCP beeper declare
DeepSeek v4.1 Flash devient le modele par defaut ; chaine de secours
DeepSeek puis Nemotron 3 Ultra gratuit ; le salon de Zoe (Matrix) y
passe aussi.
Beeper est declare dans les mcpServers avec le token lu depuis
l'environnement (plus de token en dur dans config.yaml) et l'URL LAN
pour etre cliquable depuis Hermes Desktop. Le timeout du MCP gitea
est complete.
2026-10-19 02:07:19 -04:00
Hermes Agent dbf57bcb74 feat(mcp): Anki headless + acces LAN filtre aux MCP
anki-mcp : Anki sans bureau et addon AnkiMCP, HTTP MCP sur 3141,
connecte a la collection du serveur de sync.
mcp-lan-access republie sur l'adresse LAN de tower les endpoints
loopback (3141, 8710, 6060, 23373), firewall limite au Mac ; l'addon
Anki autorise ce Host (anti DNS-rebinding).
arr-mcp ne publie plus 6060 sur 0.0.0.0. Le module mcp-lan-access
est importe par services/default.nix avec anki-mcp, wise-mcp et
bank-mcp.
2026-10-19 02:07:19 -04:00
Hermes Agent c427110b4b feat(mcp): serveurs MCP Wise et Bank
wise-mcp passe par le CLI officiel, token dans secrets/wise.yml.
bank-mcp lit une config locale 0600 (pas de secret nix).
2026-10-19 02:07:19 -04:00
Hermes Agent 76ac59eed0 fix(monero): pool Stratum MoneroOcean et seuil thermique du Deck 2026-10-19 01:31:22 -04:00
Hermes Agent 093cc8dd55 feat(deck): mineur Monero XMRig avec garde thermique 2026-10-19 01:24:50 -04:00
Hermes Agent 0ef3a16fd9 fix(anywhere): upstream les correctifs faits en local sur le VPS
- 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.
2026-10-18 15:00:14 -04:00
Hermes Agent aadebcc0fd feat(winnie): OIDC Zitadel en PKCE via un secret sops oidc_env
- 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
2026-10-17 16:56:17 -04:00
Hermes Agent 5cab1712a7 feat(newt): expose sonarr.marcpartensky.com derriere le SSO Pangolin
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.
2026-10-17 16:56:17 -04:00
Hermes Agent a41dd0b5ff fix(arr): supprime urlbase et coupe l'auth interne derriere le SSO Pangolin
- 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)
2026-10-17 16:56:17 -04:00
Hermes Agent 2363d673c0 chore(hermes): approbations de commandes en mode off (plus de validation humaine)
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).
2026-10-17 16:56:15 -04:00
Hermes Agent a43e96d9b5 feat(hermes): option services.hermes.enableAgent (couper le gateway par hote)
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.
2026-10-17 16:56:15 -04:00
Hermes Agent 2ece11d430 feat(llm-steamdeck): serveur llama.cpp Vulkan OpenAI-compatible (Steam Deck)
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.
2026-10-17 16:56:13 -04:00
Hermes Agent fac87cc291 feat(waydroid): conteneur cage-waydroid + client noVNC Android
- 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
2026-10-17 16:56:12 -04:00
Hermes Agent 8294a123a6 feat(kasmvnc): Chrome CDP visible pour Playwright MCP
- 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
2026-10-17 16:56:10 -04:00
Hermes Agent ce2b91fae4 fix(services): anki healthcheck explicite /health (la cible sortait du load-balancer) 2026-10-11 19:38:42 -04:00
Hermes Agent ca72d76cbd feat(winnie,newt): front Svelte 5 sur 8888 + ressource dioxus-frontend
- 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)
2026-10-11 19:33:30 -04:00
Hermes Agent 0fac189847 fix(hermes,openrouter-mcp): default_model nemotron meme famille partout
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.
2026-10-11 19:33:23 -04:00
Hermes Agent a4cc76163b feat(hinge-auto): auto-like Hinge web (Playwright + Chromium, profil persistant)
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.
2026-10-11 19:33:17 -04:00
Hermes Agent 0973d87f41 feat(gotify): OIDC Zitadel + exposition loopback via newt sans SSO Pangolin
- 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
2026-10-11 19:33:07 -04:00
Hermes Agent 9ec071dd67 fix(services): anki page de statut + proxy nginx (interface navigateur sur le domaine) 2026-10-09 17:59:00 -04:00
Hermes Agent 917ebe40d3 feat(services): serveur de sync Anki auto-hébergé (anki.marcpartensky.com) 2026-10-09 17:38:38 -04:00
Hermes Agent 727dd5ad31 chore(zitadel-mcp): versionner package-lock.json (cp dans le build npm) 2026-10-06 23:04:32 -04:00
Hermes Agent 2c660d8b5d feat(zitadel-mcp): upstream npm zitadel-mcp-server 34 tools ; nginx-matrix + matrix-conduit modules 2026-10-06 21:42:11 -04:00