{
  "version": "3.1",
  "updated": "2026-04-21",
  "lfdg_vps": {
    "provider": "hetzner",
    "plan": "CX23",
    "ip": "178.104.242.89",
    "location": "Nuremberg",
    "os": "Ubuntu 24.04 LTS",
    "ssh_user": "root",
    "cost": "5.43 EUR/mois",
    "path": "/opt/lfdg",
    "domains": {
      "main": "lafrancedegilles.com",
      "booking": "booking.lafrancedegilles.com",
      "api": "api.lafrancedegilles.com"
    }
  },
  "nas": {
    "ip_local": "192.168.1.132",
    "ip_tailscale": "100.116.248.8",
    "data_path": "/mnt/usb-data",
    "ssh_user": "root"
  },
  "mac": {
    "ip_tailscale": "100.77.179.8",
    "tunnel_port": 9876,
    "tunnel_secret": "${MAC_TUNNEL_SECRET}",
    "root_path": "/Users/gillesaugereau/gillesOS",
    "legacy_path": "/Users/gillesaugereau/Projets",
    "noyau_path": "/Users/gillesaugereau/gillesOS/noyau",
    "intelligence_path": "/Users/gillesaugereau/gillesOS/intelligence",
    "cockpit_path": "/Users/gillesaugereau/gillesOS/cockpit",
    "memoire_path": "/Users/gillesaugereau/gillesOS/memoire",
    "projets_path": "/Users/gillesaugereau/gillesOS/projets",
    "skills_path": "/Users/gillesaugereau/.claude/skills"
  },
  "telegram": {
    "token": "${TELEGRAM_TOKEN}",
    "chat_id": "1405789634"
  },
  "services": {
    "auth": {
      "port": 8085,
      "path": "/health",
      "nom": "Auth",
      "projet": "laludora",
      "homepage": {
        "group": "Projets Laludora",
        "icon": "mdi-shield-key",
        "description": "Service auth central",
        "container": "laludora-auth"
      },
      "cloudflare_hostname": "auth.laludora.com"
    },
    "semanticesc": {
      "port": 8001,
      "path": "/",
      "nom": "Semanticesc",
      "projet": "laludora",
      "cloudflare_hostname": "semanticesc.laludora.com"
    },
    "litere": {
      "port": 8084,
      "path": "/",
      "nom": "Litere",
      "projet": "laludora",
      "homepage": {
        "group": "Projets Laludora",
        "icon": "mdi-alphabet-latin",
        "description": "Validation lettres RO",
        "container": "litere-ro"
      },
      "cloudflare_hostname": "litere.laludora.com"
    },
    "semantique": {
      "port": 8005,
      "path": "/",
      "nom": "Sémantique FR",
      "projet": "laludora",
      "cloudflare_hostname": "semantique.laludora.com"
    },
    "footix": {
      "port": 8086,
      "path": "/",
      "nom": "Footix",
      "projet": "laludora",
      "note": "Caddy reverse proxy. Corrige 2026-04-13 (ancien 8081 = conflit Adminer)",
      "cloudflare_hostname": "footix.laludora.com"
    },
    "lettres-fr": {
      "port": 8092,
      "path": "/health",
      "nom": "Lettres FR (jeu anagrammes FR)",
      "projet": "laludora",
      "note": "container lettres-fr, port réel 8092 (attention: conflit possible avec recruitOS)",
      "homepage": {
        "group": "Projets Laludora",
        "icon": "mdi-alphabet-greek",
        "description": "Jeu anagrammes FR",
        "container": "lettres-fr"
      }
    },
    "chiffres": {
      "port": 8089,
      "path": "/",
      "nom": "Chiffres",
      "projet": "laludora",
      "note": "network_mode:host",
      "homepage": {
        "group": "Projets Laludora",
        "icon": "mdi-calculator",
        "description": "Nombres en FR",
        "container": "chiffres"
      }
    },
    "portail": {
      "port": 0,
      "path": "/",
      "nom": "Portail Ludora",
      "projet": "laludora",
      "note": "pas deploye. 8090 est cockpit-json",
      "cloudflare_hostname": "laludora.com"
    },
    "dashboard": {
      "port": 0,
      "path": "/",
      "nom": "Dashboard",
      "projet": "systeme",
      "note": "pas deploye. 8091 est port-registry"
    },
    "dashboard-1a": {
      "port": 8102,
      "path": "/health",
      "nom": "Dashboard Phase 1A",
      "projet": "systeme",
      "note": "port reel 8102 — verifie 2026-04-11 via ss -tlnp + curl. Note precedente (2026-04-05) etait inversee.",
      "homepage": {
        "group": "Intelligence",
        "icon": "mdi-monitor-dashboard",
        "description": "Dashboard Phase 1A"
      }
    },
    "ollama": {
      "port": 11434,
      "path": "/",
      "nom": "Ollama",
      "projet": "systeme",
      "note": "localhost ONLY (127.0.0.1:11434). Pas accessible depuis le Mac",
      "homepage": {
        "group": "Systeme",
        "icon": "mdi-robot-happy",
        "description": "LLM local (localhost only)"
      }
    },
    "whisper": {
      "port": 0,
      "path": "/",
      "nom": "Whisper",
      "projet": "systeme",
      "note": "pas deploye. 9000 etait faux"
    },
    "n8n": {
      "port": 30109,
      "path": "/healthz",
      "nom": "N8N",
      "projet": "systeme",
      "homepage": {
        "group": "Systeme",
        "icon": "n8n.png",
        "description": "Automatisations",
        "container": "ix-n8n-n8n-1"
      }
    },
    "queue-worker": {
      "port": 8095,
      "path": "/health",
      "nom": "Queue Worker",
      "projet": "systeme",
      "homepage": {
        "group": "Intelligence",
        "icon": "mdi-cog-sync",
        "description": "Processeur queue.json",
        "container": "queue-worker",
        "widget": {
          "type": "customapi",
          "url": "http://{ip}:8095/status",
          "refreshInterval": 30000,
          "mappings": [
            {
              "field": "pending",
              "label": "Pending",
              "format": "number"
            },
            {
              "field": "running_count",
              "label": "Running",
              "format": "number"
            },
            {
              "field": "done",
              "label": "Done",
              "format": "number"
            },
            {
              "field": "error",
              "label": "Errors",
              "format": "number"
            }
          ]
        }
      }
    },
    "orchestrateur": {
      "port": 8096,
      "path": "/health",
      "nom": "Orchestrateur",
      "projet": "systeme",
      "homepage": {
        "group": "Intelligence",
        "icon": "mdi-robot-industrial",
        "description": "Dispatch taches NAS auto",
        "container": "orchestrateur",
        "widget": {
          "type": "customapi",
          "url": "http://{ip}:8096/status",
          "refreshInterval": 30000,
          "mappings": [
            {
              "field": "total_dispatched",
              "label": "Dispatched",
              "format": "number"
            },
            {
              "field": "budget_remaining",
              "label": "Budget /h",
              "format": "number"
            },
            {
              "field": "total_errors",
              "label": "Errors",
              "format": "number"
            }
          ]
        }
      }
    },
    "telegram-bot": {
      "port": 0,
      "path": "",
      "nom": "Telegram Bot",
      "projet": "systeme"
    },
    "jellyfin": {
      "port": 30013,
      "path": "/health",
      "nom": "Jellyfin",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "jellyfin.png",
        "description": "Films et series",
        "container": "ix-jellyfin-jellyfin-1"
      },
      "cloudflare_hostname": "jellyfin.laludora.com"
    },
    "radarr": {
      "port": 7878,
      "path": "/",
      "nom": "Radarr",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "radarr.png",
        "description": "Films",
        "container": "radarr"
      }
    },
    "sonarr": {
      "port": 8989,
      "path": "/",
      "nom": "Sonarr",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "sonarr.png",
        "description": "Series",
        "container": "sonarr"
      }
    },
    "qbittorrent": {
      "port": 8082,
      "path": "/",
      "nom": "qBittorrent",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "qbittorrent.png",
        "description": "Torrents",
        "container": "qbittorrent"
      }
    },
    "navidrome": {
      "port": 4533,
      "path": "/ping",
      "nom": "Navidrome",
      "projet": "medias",
      "deploy_path": "/mnt/usb-data/navidrome",
      "library_path": "/mnt/mnt/usb-data/media/Musique",
      "api": "subsonic",
      "clients": [
        "Feishin (Mac)",
        "Symfonium (TV, Pixel 9a)"
      ],
      "deployed": "2026-04-11",
      "homepage": {
        "group": "Medias",
        "icon": "navidrome.png",
        "description": "Musique",
        "container": "navidrome"
      }
    },
    "listmonk": {
      "port": 9009,
      "path": "/",
      "nom": "Listmonk",
      "projet": "systeme",
      "homepage": {
        "group": "Systeme",
        "icon": "listmonk.png",
        "description": "Newsletters",
        "container": "listmonk"
      }
    },
    "lfdg-calcom": {
      "port": 8110,
      "path": "/",
      "nom": "La France de Gilles (Cal.com)",
      "projet": "la-france-de-gilles",
      "tunnel": "booking.lafrancedegilles.com",
      "note": "Cal.com booking + paiement Stripe. DB PostgreSQL sur meme host."
    },
    "lfdg-jitsi": {
      "port": 8101,
      "path": "/",
      "nom": "La France de Gilles (Jitsi Meet)",
      "projet": "la-france-de-gilles",
      "tunnel": "jitsi.lafrancedegilles.com",
      "note": "Jitsi Meet self-hosted. Web sur 8101, JVB media sur UDP 10000. JVB_ADVERTISE_IPS=IP Tailscale NAS. Breakout rooms activees."
    },
    "lfdg-ghost": {
      "port": 2368,
      "path": "/ghost/api/admin/site/",
      "nom": "La France de Gilles (Ghost)",
      "projet": "la-france-de-gilles"
    },
    "lfdg": {
      "port": 8098,
      "path": "/health",
      "nom": "La France de Gilles",
      "projet": "la-france-de-gilles",
      "archived": true,
      "archived_date": "2026-04-13",
      "note": "Fantome. Aucun code/compose. Seul ghost (port 2368) existe pour LFDG. Port 8098 reserve."
    },
    "nextcloud": {
      "port": 30027,
      "path": "/",
      "nom": "Nextcloud",
      "projet": "systeme",
      "homepage": {
        "group": "Systeme",
        "icon": "nextcloud.png",
        "description": "Cloud perso",
        "container": "ix-nextcloud-nextcloud-1"
      }
    },
    "umami": {
      "port": 3001,
      "path": "/",
      "nom": "Umami Analytics",
      "projet": "systeme",
      "homepage": {
        "group": "Systeme",
        "icon": "umami.png",
        "description": "Web analytics",
        "container": "umami-umami-1"
      },
      "cloudflare_hostname": "analytics.laludora.com"
    },
    "vaultwarden": {
      "port": 3012,
      "path": "/",
      "nom": "Vaultwarden",
      "projet": "identites-numeriques",
      "note": "8087->443 (HTTPS) + 3012 (websocket). Acces via Tailscale: https://nas-domicile.tail5f6e5d.ts.net:8087",
      "homepage": {
        "group": "Systeme",
        "icon": "vaultwarden.png",
        "description": "Mots de passe",
        "container": "vaultwarden",
        "href_override": "https://nas-domicile.tail5f6e5d.ts.net:8087"
      }
    },
    "snappymail": {
      "port": 8094,
      "path": "/",
      "nom": "SnappyMail",
      "projet": "identites-numeriques"
    },
    "prowlarr": {
      "port": 9696,
      "path": "/",
      "nom": "Prowlarr",
      "projet": "medias"
    },
    "bazarr": {
      "port": 6767,
      "path": "/",
      "nom": "Bazarr",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "bazarr.png",
        "description": "Sous-titres",
        "container": "bazarr"
      }
    },
    "readarr": {
      "port": 8787,
      "path": "/",
      "nom": "Readarr",
      "projet": "medias"
    },
    "audiobookshelf": {
      "port": 13378,
      "path": "/",
      "nom": "Audiobookshelf",
      "projet": "medias"
    },
    "calibre-web": {
      "port": 0,
      "path": "/",
      "nom": "Calibre-Web",
      "projet": "medias",
      "note": "pas deploye. 8083 est FileBrowser"
    },
    "watchdog": {
      "port": 0,
      "path": "",
      "nom": "Watchdog",
      "projet": "systeme",
      "note": "Container watchdog Up depuis 8 jours (image python:3.11-slim). Code dans intelligence/watchdog/. Verifier ce qu'il monitore."
    },
    "claude-runner": {
      "port": 0,
      "path": "",
      "nom": "Claude Runner",
      "projet": "systeme",
      "note": "Container claude-runner Up depuis 5 jours. Image custom 'claude-runner'. Pipeline intelligence/claude-nas/ MORT (RAPPORT A.1.3). Container vivant fait quoi exactement = a investiguer."
    },
    "cloudflare-tunnel": {
      "port": 0,
      "path": "",
      "nom": "Cloudflare Tunnel",
      "projet": "systeme"
    },
    "cloudflare-ddns": {
      "port": 0,
      "path": "",
      "nom": "Cloudflare DDNS",
      "projet": "systeme"
    },
    "nginx-proxy": {
      "port": 8080,
      "path": "/",
      "nom": "Nginx Proxy",
      "projet": "systeme",
      "note": "Reverse proxy nginx:alpine. Up 3 days (healthy). Role precis a documenter (front laludora? autre?)."
    },
    "paris-backend": {
      "port": 0,
      "path": "/docs",
      "nom": "Paris Backend",
      "projet": "paris",
      "note": "stack paused. Port a assigner au redemarrage (pas 8000, pas 3000)"
    },
    "paris-frontend": {
      "port": 0,
      "path": "/",
      "nom": "Paris Frontend",
      "projet": "paris",
      "note": "stack paused. 3000 est Homepage"
    },
    "prefect": {
      "port": 4200,
      "path": "/api/health",
      "nom": "Prefect Server",
      "projet": "systeme",
      "archived": true,
      "archived_date": "2026-04-13",
      "note": "Jamais deploye. References dans scanner.py, monitoring_engine.py. N8N est la source unique de scheduling. Port 4200 reserve."
    },
    "mealie": {
      "port": 9925,
      "path": "/",
      "nom": "Mealie (recettes)",
      "projet": "vie-perso",
      "homepage": {
        "group": "Autres Projets",
        "icon": "mealie.png",
        "description": "Recettes",
        "container": "mealie"
      }
    },
    "obsidian-sync": {
      "port": 8103,
      "path": "/",
      "nom": "Obsidian Sync",
      "projet": "systeme",
      "homepage": {
        "group": "Intelligence",
        "icon": "mdi-notebook",
        "description": "Sync Obsidian vault",
        "container": "obsidian-sync"
      }
    },
    "slskd": {
      "port": 5030,
      "path": "/",
      "nom": "slskd (Soulseek)",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "mdi-music-note",
        "description": "Soulseek P2P"
      }
    },
    "adguard-home": {
      "port": 3333,
      "path": "/",
      "nom": "AdGuard Home (DNS)",
      "projet": "systeme",
      "note": "network_mode:host. Web UI sur 3333, DNS sur 53",
      "homepage": {
        "group": "Systeme",
        "icon": "adguard-home.png",
        "description": "DNS ad-block"
      }
    },
    "vintedbot": {
      "port": 0,
      "path": "",
      "nom": "VintedBot",
      "projet": "vintedbot"
    },
    "recruitos": {
      "port": 8093,
      "path": "/health",
      "nom": "RecruitOS",
      "projet": "recruitOS",
      "note": "port assigne 8093 (2026-04-11) pour eviter conflit futur avec lettres-fr (8092). RecruitOS pas encore deploye, a mettre a jour dans docker-compose lors du deploiement."
    },
    "homepage": {
      "port": 3000,
      "path": "/",
      "nom": "Homepage",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "homepage.png",
        "description": "Dashboard central",
        "container": "homepage"
      }
    },
    "uptime-kuma": {
      "port": 3002,
      "path": "/",
      "nom": "Uptime Kuma",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "uptime-kuma.png",
        "description": "Monitoring feu rouge/vert",
        "container": "uptime-kuma"
      }
    },
    "leantime": {
      "port": 3003,
      "path": "/",
      "nom": "Leantime",
      "projet": "cockpit",
      "homepage": {
        "group": "Strategie",
        "icon": "mdi-compass-outline",
        "description": "Ideas, goals, chantiers, roadmap",
        "container": "leantime"
      }
    },
    "dockge": {
      "port": 5001,
      "path": "/",
      "nom": "Dockge",
      "projet": "cockpit",
      "homepage": {
        "group": "Infrastructure",
        "icon": "dockge.png",
        "description": "Gestion stacks compose",
        "container": "dockge"
      }
    },
    "dozzle": {
      "port": 8084,
      "path": "/",
      "nom": "Dozzle",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "dozzle.png",
        "description": "Logs live de tous les containers",
        "container": "dozzle"
      }
    },
    "adminer": {
      "port": 8081,
      "path": "/",
      "nom": "Adminer",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "adminer.png",
        "description": "Explorer PostgreSQL gilles_os_db",
        "container": "adminer"
      }
    },
    "filebrowser": {
      "port": 8083,
      "path": "/",
      "nom": "FileBrowser",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "filebrowser.png",
        "description": "Explorer /mnt/usb-data",
        "container": "filebrowser"
      }
    },
    "cockpit-json": {
      "port": 8090,
      "path": "/",
      "nom": "Cockpit JSON Bridge",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "mdi-code-json",
        "description": "Expose queue, sessions, config en lecture seule",
        "container": "cockpit-json"
      }
    },
    "port-registry": {
      "port": 8091,
      "path": "/anomalies.json",
      "nom": "Port Registry",
      "projet": "cockpit",
      "homepage": {
        "group": "Cockpit",
        "icon": "mdi-lan",
        "description": "Registre ports temps reel + anomalies",
        "container": "port-registry-api",
        "widget": {
          "type": "customapi",
          "url": "http://{ip}:8091/anomalies.json",
          "refreshInterval": 60000,
          "mappings": [
            {
              "field": "critical_count",
              "label": "Critiques",
              "format": "number"
            },
            {
              "field": "warning_count",
              "label": "Warnings",
              "format": "number"
            },
            {
              "field": "total",
              "label": "Total",
              "format": "number"
            }
          ]
        }
      }
    },
    "portainer": {
      "port": 9443,
      "path": "/",
      "nom": "Portainer",
      "projet": "cockpit",
      "note": "HTTPS only",
      "homepage": {
        "group": "Infrastructure",
        "icon": "portainer.png",
        "description": "Gestion containers GUI",
        "container": "portainer",
        "protocol": "https"
      }
    },
    "jellyseerr": {
      "port": 5055,
      "path": "/",
      "nom": "Demander un film",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "jellyseerr.png",
        "description": "Demander un film ou une serie",
        "container": "jellyseerr"
      },
      "cloudflare_hostname": "requests.laludora.com"
    },
    "beets": {
      "port": 8337,
      "path": "/",
      "nom": "Beets",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "mdi-music",
        "description": "Music tagger",
        "container": "beets"
      }
    },
    "litellm": {
      "port": 4000,
      "path": "/health",
      "nom": "LiteLLM",
      "projet": "systeme",
      "note": "Container gilles-litellm Up depuis 8 jours sur :4000. Utilise par chef.py jusqu'au 2026-04-20 (logs llm_usage.jsonl). Errors 'No api key passed in' depuis le 19/04 — a fixer."
    },
    "syncthing": {
      "port": 20910,
      "path": "/",
      "nom": "Syncthing",
      "projet": "systeme"
    },
    "aggregator": {
      "port": 8088,
      "path": "/",
      "nom": "Aggregator",
      "projet": "systeme",
      "note": "network_mode:host",
      "homepage": {
        "group": "Intelligence",
        "icon": "mdi-rss",
        "description": "Agregateur veille",
        "container": "aggregator"
      }
    },
    "cuvantul": {
      "port": 8002,
      "path": "/",
      "nom": "Cuvantul",
      "projet": "laludora",
      "homepage": {
        "group": "Projets Laludora",
        "icon": "mdi-book-open-variant",
        "description": "Mot du jour RO",
        "container": "cuvantul-cuvantul-1"
      },
      "cloudflare_hostname": "cuvantul.laludora.com"
    },
    "agent-central": {
      "port": 8097,
      "path": "/health",
      "nom": "Agent Central",
      "projet": "systeme",
      "homepage": {
        "group": "Systeme",
        "icon": "mdi-brain",
        "description": "Cerveau Gilles OS",
        "container": "agent-central"
      }
    },
    "rugby-strength": {
      "port": 8105,
      "path": "/",
      "nom": "Rugby Strength Manager",
      "projet": "rugby-strength",
      "cloudflare_hostname": "rugby.laludora.com",
      "data_path": "/mnt/mnt/fast-data/services/rugby-strength",
      "note": "SQLite sur ZFS — synchronous=OFF obligatoire. Container: rugby-final. Port 8100+8104 = zombies (D state, reboot NAS pour purger). Credentials: rugby-strength/app/.env",
      "homepage": {
        "group": "Autres Projets",
        "icon": "mdi-rugby",
        "description": "CS Rapid Bucuresti — prépa physique"
      }
    },
    "matrix": {
      "port": 8108,
      "path": "/_matrix/client/versions",
      "nom": "Matrix Synapse",
      "projet": "matrix",
      "data_path": "/mnt/mnt/fast-data/services/matrix",
      "note": "Messagerie unifiée. PostgreSQL dédié (matrix-postgres). Bridges: WhatsApp x2, Meta (Messenger+Instagram) x2, LinkedIn, SMS/RCS. Element Web port 8109. Admin: @gilles:matrix.laludora.com",
      "homepage": {
        "group": "Systeme",
        "icon": "mdi-matrix",
        "description": "Messagerie unifiée — WhatsApp, Messenger, Instagram, LinkedIn, SMS",
        "container": "matrix-synapse"
      }
    },
    "chef-de-projet": {
      "port": 8099,
      "path": "/health",
      "nom": "Chef de Projet",
      "projet": "systeme",
      "homepage": {
        "group": "Intelligence",
        "icon": "mdi-account-tie",
        "description": "Orchestrateur projets",
        "container": "chef-de-projet",
        "path_suffix": "/docs",
        "widget": {
          "type": "customapi",
          "url": "http://{ip}:8099/status",
          "refreshInterval": 60000,
          "mappings": [
            {
              "field": "last_plan_pushed",
              "label": "Last Tasks",
              "format": "number"
            },
            {
              "field": "running",
              "label": "Running",
              "format": "text"
            }
          ]
        }
      },
      "paused": true,
      "paused_reason": "LLM indisponible (Ollama surchargé) — fix déployé 2026-04-14, relance manuelle requise",
      "paused_at": "2026-04-14T00:00:00Z"
    },
    "lidarr": {
      "port": 8686,
      "path": "/",
      "nom": "Lidarr",
      "projet": "medias",
      "homepage": {
        "group": "Medias",
        "icon": "lidarr.png",
        "description": "Musique",
        "container": "lidarr"
      }
    }
  },
  "service_groups": {
    "systeme": {
      "priority": 0,
      "policy": "always_on",
      "description": "Infrastructure critique - jamais arrete",
      "containers": [
        "gilles-os-postgres",
        "chef-de-projet",
        "queue-worker",
        "ix-n8n-n8n-1",
        "ix-n8n-postgres-1",
        "ix-n8n-redis-1",
        "adguard-home",
        "ix-tailscale-tailscale-1",
        "vaultwarden"
      ]
    },
    "paris": {
      "priority": 3,
      "policy": "on_demand",
      "status": "paused",
      "reason": "Abonnement expire - pas utilise",
      "paused_since": "2026-04-10",
      "ram_mb": 285,
      "containers": [
        "paris_backend",
        "paris_frontend",
        "paris_scheduler",
        "paris_db",
        "paris_redis"
      ]
    },
    "laludora": {
      "priority": 1,
      "policy": "always_on",
      "description": "Jeux en production - utilisateurs actifs",
      "containers": [
        "litere-ro",
        "lettres-fr",
        "cuvantul-cuvantul-1",
        "chiffres",
        "footix-backend-1",
        "laludora-auth"
      ]
    },
    "medias": {
      "priority": 2,
      "policy": "always_on",
      "description": "Musique (Navidrome), films/series (Jellyfin), torrents",
      "containers": [
        "navidrome",
        "ix-jellyfin-jellyfin-1",
        "radarr",
        "sonarr",
        "qbittorrent",
        "slskd"
      ]
    },
    "monitoring": {
      "priority": 1,
      "policy": "always_on",
      "description": "Surveillance systeme",
      "containers": [
        "aggregator"
      ]
    },
    "web": {
      "priority": 2,
      "policy": "auto_manage",
      "description": "Analytics, newsletter, recettes - arretable si RAM critique",
      "containers": [
        "umami-umami-1",
        "umami-db-1",
        "listmonk",
        "listmonk-db",
        "mealie"
      ]
    },
    "sync": {
      "priority": 2,
      "policy": "always_on",
      "description": "Synchro fichiers",
      "containers": [
        "obsidian-sync",
        "ix-syncthing-syncthing-1",
        "ix-nextcloud-nextcloud-1",
        "ix-nextcloud-postgres-1",
        "ix-nextcloud-redis-1"
      ]
    }
  },
  "paris": {
    "bookmakers_actifs": [
      "superbet",
      "efortuna",
      "unibet",
      "orbit",
      "ps3838",
      "betclic"
    ],
    "min_surebet_pct": 1.5,
    "min_valuebet_pct": 5.0,
    "kelly_fraction": 0.25,
    "max_bet_pct_bankroll": 10.0,
    "silence_start_hour_utc": 22,
    "silence_end_hour_utc": 5,
    "silence_threshold_pct": 8.0,
    "dashboard_url": "http://localhost:3000"
  },
  "obsidian": {
    "vault_mac": "/Users/gillesaugereau/Gilles OS",
    "vault_nas": "/mnt/usb-data/obsidian/Gilles OS",
    "taches_path": "GTD/Tâches",
    "suggestions_path": "Système/Suggestions/suggestions.md",
    "roadmap_path": "Système/Roadmap/roadmap.md"
  },
  "monitoring": {
    "container_ram_alert_mib": 2048,
    "container_cpu_alert_pct": 80.0,
    "json_path": "/mnt/usb-data/monitoring/container-stats.json",
    "history_days": 7
  },
  "notifications": {
    "push_matin": "08:00",
    "timezone": "Europe/Bucharest",
    "mode": "buffer",
    "buffer_path": "/mnt/usb-data/notifications/buffer.jsonl",
    "alertes_services": true,
    "alertes_queue": false,
    "resume_hebdo": "dimanche 09:00",
    "surveillance_interval_minutes": 5
  },
  "llm": {
    "ollama_url": "http://localhost:11434",
    "ollama_model": "llama3.1:8b",
    "mac_tunnel_url": "http://100.77.179.8:9876",
    "claude_model": "claude-sonnet-4-6"
  },
  "llm_routing": {
    "version": "1.3",
    "updated": "2026-03-20",
    "models": {
      "opus": "claude-opus-4-6",
      "sonnet": "claude-sonnet-4-6",
      "glm5": "glm-5:cloud",
      "llama8b": "llama3.1:8b",
      "qwen": "qwen2.5:1.5b"
    },
    "tasks": [
      {
        "tache": "audit_architecture",
        "modele": "claude-opus-4-6",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Exige reflexion profonde, vision systeme, decisions irreversibles",
        "cout_estime": "eleve",
        "frequence": "hebdo",
        "migration_phase": 3,
        "modele_cible_local": null
      },
      {
        "tache": "conception_nouveau_projet",
        "modele": "claude-opus-4-6",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Architecture, choix techniques, structure — necessite vision large",
        "cout_estime": "eleve",
        "frequence": "mensuel",
        "migration_phase": 3,
        "modele_cible_local": null
      },
      {
        "tache": "code_complexe_nouveau_service",
        "modele": "claude-sonnet-4-6",
        "fallback": "claude-opus-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Code substantiel, Sonnet excelle en generation de code",
        "cout_estime": "moyen",
        "frequence": "hebdo",
        "migration_phase": 3,
        "modele_cible_local": "llama3.1:8b"
      },
      {
        "tache": "code_simple_bugfix",
        "modele": "llama3.1:8b",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Bug fixes, petites modifications — migre sur local depuis upgrade RAM 32Go",
        "cout_estime": "zero",
        "frequence": "quotidien",
        "migration_phase": 2,
        "modele_cible_local": "llama3.1:8b",
        "modele_post_max": "llama3.1:8b"
      },
      {
        "tache": "classification_routing",
        "modele": "qwen2.5:1.5b",
        "fallback": "glm-5:cloud",
        "fallback2": "claude-sonnet-4-6",
        "modele_local_apres_upgrade": "qwen2.5:1.5b",
        "raison": "Tache legere, modele local suffit largement",
        "cout_estime": "zero",
        "frequence": "permanent",
        "migration_phase": 1,
        "modele_cible_local": "qwen2.5:1.5b",
        "modele_post_max": "qwen2.5:1.5b"
      },
      {
        "tache": "monitoring_alertes",
        "modele": "qwen2.5:1.5b",
        "fallback": "glm-5:cloud",
        "fallback2": "claude-sonnet-4-6",
        "modele_local_apres_upgrade": "qwen2.5:1.5b",
        "raison": "Verification etat services, pattern matching simple",
        "cout_estime": "zero",
        "frequence": "toutes_5min",
        "migration_phase": 1,
        "modele_cible_local": "qwen2.5:1.5b",
        "modele_post_max": "qwen2.5:1.5b"
      },
      {
        "tache": "redaction_contenu",
        "modele": "llama3.1:8b",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Migre sur local depuis upgrade RAM 32Go. Fallback Sonnet si qualite insuffisante.",
        "cout_estime": "zero",
        "frequence": "hebdo",
        "migration_phase": 2,
        "modele_cible_local": "llama3.1:8b",
        "modele_post_max": "llama3.1:8b"
      },
      {
        "tache": "analyse_donnees_paris",
        "modele": "llama3.1:8b",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Donnees sensibles, local prefere. Migre depuis upgrade RAM 32Go.",
        "cout_estime": "zero",
        "frequence": "quotidien",
        "migration_phase": 2,
        "modele_cible_local": "llama3.1:8b",
        "modele_post_max": "llama3.1:8b"
      },
      {
        "tache": "recherche_web_veille",
        "modele": "claude-sonnet-4-6",
        "fallback": "glm-5:cloud",
        "fallback2": null,
        "modele_local_apres_upgrade": "claude-sonnet-4-6",
        "raison": "Necessite web_search, pas faisable en local pur",
        "cout_estime": "moyen",
        "frequence": "hebdo",
        "migration_phase": null,
        "modele_cible_local": null
      },
      {
        "tache": "reponses_telegram",
        "modele": "llama3.1:8b",
        "fallback": "qwen2.5:1.5b",
        "fallback2": "claude-sonnet-4-6",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Reponses courtes, commandes — local ideal. Migre depuis upgrade RAM 32Go.",
        "cout_estime": "zero",
        "frequence": "permanent",
        "migration_phase": 1,
        "modele_cible_local": "llama3.1:8b",
        "modele_post_max": "llama3.1:8b"
      },
      {
        "tache": "orchestration_planification",
        "modele": "llama3.1:8b",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Migre sur local depuis upgrade RAM 32Go. Fallback Sonnet si raisonnement insuffisant.",
        "cout_estime": "zero",
        "frequence": "quotidien",
        "migration_phase": 2,
        "modele_cible_local": "llama3.1:8b",
        "modele_post_max": "llama3.1:8b"
      },
      {
        "tache": "generation_skills_prompts",
        "modele": "claude-opus-4-6",
        "fallback": "claude-sonnet-4-6",
        "fallback2": "glm-5:cloud",
        "modele_local_apres_upgrade": "llama3.1:8b",
        "raison": "Meta-tache : qualite du prompt determine la qualite de tout le reste",
        "cout_estime": "eleve",
        "frequence": "mensuel",
        "migration_phase": 3,
        "modele_cible_local": null
      }
    ],
    "fallback_rules": {
      "max_retries": 2,
      "timeout_seconds": 120,
      "fallback_on_error": true,
      "fallback_on_timeout": true,
      "log_all_fallbacks": true
    },
    "cost_limits": {
      "daily_api_eur": 1.0,
      "monthly_api_eur": 15.0,
      "alert_threshold_pct": 80
    }
  },
  "performance": {
    "tracker_path_nas": "/mnt/usb-data/performance/tracker.py",
    "tracker_path_mac": "/Users/gillesaugereau/gillesOS/projets/systeme/performance/tracker.py",
    "db_path": "/mnt/usb-data/performance/tracker.db"
  },
  "veille": {
    "watcher_path": "/mnt/usb-data/veille/watcher.py",
    "schedule": "dimanche 09:00",
    "sources": [
      "github:anthropics/claude-code",
      "github:anthropics/anthropic-sdk-python",
      "github:hesreallyhim/awesome-claude-code",
      "github:ollama/ollama"
    ]
  },
  "n8n": {
    "api_key": "${N8N_API_KEY}",
    "url": "http://192.168.1.132:30109"
  },
  "radarr": {
    "api_key": "${RADARR_API_KEY}"
  },
  "sonarr": {
    "api_key": "${SONARR_API_KEY}"
  },
  "qbittorrent": {
    "username": "admin",
    "password": "${QBITTORRENT_PASSWORD}"
  },
  "readarr": {
    "api_key": "${READARR_API_KEY}"
  },
  "homepage": {
    "group_order": [
      "Strategie",
      "Cockpit",
      "Infrastructure",
      "Systeme",
      "Medias",
      "Projets Laludora",
      "Autres Projets",
      "Intelligence"
    ],
    "extra_services": {
      "truenas": {
        "group": "Infrastructure",
        "icon": "truenas.png",
        "description": "OS et apps ix",
        "protocol": "https",
        "port": 444,
        "note": "Host OS, pas un service Docker. HTTP:8888 HTTPS:444. Change via midclt call system.general.update"
      }
    }
  },
  "tailscale_serve": {
    "note": "Tailscale Serve proxy rules. service_key → serve config. Port 443 = default HTTPS.",
    "rules": {
      "homepage": {
        "serve_port": 443,
        "note": "https://nas-domicile... → Homepage"
      },
      "uptime-kuma": {
        "serve_port": 10000,
        "note": "https://nas-domicile...:10000 → Uptime Kuma"
      },
      "leantime": {
        "serve_port": 8443,
        "note": "https://nas-domicile...:8443 → Leantime"
      }
    }
  },
  "cloudflare": {
    "config_path": "/mnt/usb-data/cloudflare-tunnel/config.yml",
    "container": "cloudflare-tunnel-cloudflared-1",
    "fallback_service": "http_status:404",
    "note": "Tunnel expose services publics via laludora.com. Config generee depuis config.json."
  },
  "uptime_kuma": {
    "container": "uptime-kuma",
    "internal_url": "http://localhost:3001",
    "username": "gilles",
    "password_env": "KUMA_PASSWORD",
    "auto_monitor": true,
    "monitor_interval": 60,
    "note": "Monitors auto-crees pour tout service avec port > 0. Password dans .env.secrets."
  },
  "devices": {
    "_doc": "Specs statiques des appareils. L'etat dynamique (RAM libre, CPU usage, ping) est calcule live par l'Agent Central, jamais stocke ici.",
    "nas": {
      "model": "Lenovo ThinkCentre M920Q",
      "role": "CORE",
      "function": "Runtime 24/7 — tout ce qui tourne en permanence",
      "ip_local": "192.168.1.132",
      "ip_tailscale": "100.116.248.8",
      "os": "TrueNAS SCALE",
      "cpu": "Intel Core i5-9500T",
      "ram_installed": "2x16GB DDR4 SODIMM",
      "ram_total_gb": 32,
      "gpu": null,
      "storage": "SSD 512GB NVMe + USB 2TB HDD",
      "status": "active"
    },
    "mac": {
      "model": "MacBook Pro M4 (Mac16,1)",
      "role": "EDGE-DEV",
      "function": "Code source, Claude Code, Ubersicht, SuperWhisper",
      "ip_tailscale": "100.77.179.8",
      "os": "macOS Sequoia",
      "cpu": "Apple M4",
      "ram_total_gb": 16,
      "gpu": "Apple M4 GPU (integre)",
      "status": "active"
    },
    "pixel": {
      "model": "Google Pixel 9a",
      "role": "INTERFACE",
      "function": "Capture voix, notifications, commandes Telegram",
      "os": "Android",
      "status": "active"
    },
    "legion": {
      "model": "Lenovo Legion Y530",
      "role": "COMPUTE",
      "function": "GPU Ollama inference lourde (quand repare)",
      "gpu": "NVIDIA GTX 1050 Ti 4GB",
      "cpu": "Intel Core i5-8300H",
      "ram_total_gb": 8,
      "status": "en_reparation",
      "note": "A reparer. Permettra d'executer des modeles >8B avec acceleration GPU."
    }
  },
  "projets": {
    "_doc": "Registre de tous les projets et chantiers. Le statut live (actif/pause/gele) est CALCULE par l'Agent Central (git log, docker ps, queue.json), pas stocke ici. Seuls les champs statiques sont declares.",
    "laludora": {
      "nom": "Laludora",
      "type": "projet",
      "description": "Plateforme multi-jeux quotidiens (Semantique, Footix, Litere, Chiffres...)",
      "objectif": "Hub de jeux en ligne deploye, utilise, monetisable",
      "priorite": "haute",
      "url_prod": "https://laludora.com"
    },
    "paris": {
      "nom": "Paris Sportifs",
      "type": "projet",
      "description": "Automatisation surebets/valuebets bookmakers RO/FR",
      "objectif": "Pipeline scraping → detection → execution profitable",
      "priorite": "haute"
    },
    "la-france-de-gilles": {
      "nom": "La France de Gilles",
      "type": "projet",
      "description": "Marque education FLE — cours, blog Ghost, newsletter, videos",
      "objectif": "Presence en ligne + revenus contenu pedagogique",
      "priorite": "haute",
      "url_prod": "https://lafrancedegilles.com"
    },
    "recruitOS": {
      "nom": "RecruitOS",
      "type": "projet",
      "description": "Automatisation recrutement — scraping LinkedIn/Google, scoring candidats",
      "objectif": "Pipeline semi-auto pour agence Claudia",
      "priorite": "moyenne"
    },
    "journalisme": {
      "nom": "Journalisme OSINT",
      "type": "projet",
      "description": "Enquetes investigatives — enfants disparus Roumanie, scraping Facebook",
      "objectif": "Collecte + analyse + publication enquetes",
      "priorite": "moyenne"
    },
    "foot-data": {
      "nom": "Foot Data",
      "type": "projet",
      "description": "Analyse predictive football — valuebetting corners/cartons/stats",
      "objectif": "Outil personnel + contenu YouTube potentiel",
      "priorite": "moyenne"
    },
    "border-games": {
      "nom": "Border Games",
      "type": "projet",
      "description": "Quiz absurdes multi-sources — MVP Pape ou Rappeur",
      "objectif": "Jeu web fun deploye",
      "priorite": "basse"
    },
    "vintedbot": {
      "nom": "VintedBot",
      "type": "projet",
      "description": "Scorer arbitrage vetements vintage Vinted.ro/OLX via Telegram + Claude Vision",
      "objectif": "Alertes automatiques niches vintage rentables",
      "priorite": "moyenne"
    },
    "lycee": {
      "nom": "Lycee Anna de Noailles",
      "type": "projet",
      "description": "Assistant pedagogique — quiz, tournois, gestion administrative",
      "objectif": "Outils pour la vie de prof",
      "priorite": "basse"
    },
    "vie-perso": {
      "nom": "Vie Perso",
      "type": "projet",
      "description": "Assistant multi-domaines — budget Revolut, sante, courses, agenda",
      "objectif": "Gestion quotidienne automatisee",
      "priorite": "moyenne"
    },
    "systeme": {
      "nom": "Gilles OS (systeme)",
      "type": "projet",
      "description": "Le systeme lui-meme — config, agents, infra, orchestration",
      "objectif": "OS personnel auto-ameliorant et quasi-autonome",
      "priorite": "critique",
      "permanent": true
    },
    "radio-gilles": {
      "nom": "Radio Gilles",
      "type": "idee",
      "description": "Web-radio personnelle hebergee — musique, interviews, podcasts",
      "source": "incubateur",
      "fichier": "intelligence/incubateur/idees/radio-gilles.md"
    },
    "orchestrateur-v2": {
      "nom": "Orchestrateur Permanent v2.0",
      "type": "idee",
      "description": "COO autonome 24/7 — router intelligent, dispatch, veille proactive",
      "source": "incubateur",
      "fichier": "intelligence/incubateur/idees/orchestrateur-design.md",
      "note": "Absorbe par l'architecture Agent Central (AGENT_CENTRAL.md)"
    },
    "universal-inbox": {
      "nom": "Universal Inbox",
      "type": "idee",
      "description": "Point d'entree unique — capture, classification, maturation, execution",
      "source": "incubateur",
      "fichier": "intelligence/incubateur/idees/universal-inbox-et-traitement.md",
      "note": "Absorbe par le module Inbox de l'Agent Central (AGENT_CENTRAL.md)"
    },
    "maturation-idees": {
      "nom": "Systeme de maturation d'idees",
      "type": "idee",
      "description": "Partenaire de pensee — capture vocale, questions auto, maturation background",
      "source": "incubateur",
      "fichier": "intelligence/incubateur/idees/systeme-maturation-idees.md",
      "note": "Absorbe par le module Proactive Engine de l'Agent Central (AGENT_CENTRAL.md)"
    }
  },
  "_last_sync": "2026-04-26T01:00:01.384344+00:00"
}