{
 "updated": "2026-09-10",
 "contact": {
  "email": "contact@spboucher.ai",
  "owner": "Simon-Pierre Boucher",
  "site": "https://www.spboucher.ai",
  "git": "https://git.spboucher.ai"
 },
 "sites": {
  "staug": {
   "name": "Saint-Augustin-de-Desmaures",
   "region": "Québec, Canada",
   "lat": 46.741,
   "lon": -71.458,
   "kind": "lan",
   "operator": "MacLustr (LAN privé)",
   "note": "Le cœur du cluster : 21 Macs sur un réseau local 10 GbE, deux NAS UGREEN."
  },
  "bhs": {
   "name": "Beauharnois",
   "region": "Québec, Canada",
   "lat": 45.313,
   "lon": -73.873,
   "kind": "ovh",
   "operator": "OVHcloud BHS8",
   "note": "Passerelle principale du MacLustr Tunnel et deux serveurs de réserve. ≈ 10 ms du LAN."
  },
  "gra": {
   "name": "Gravelines",
   "region": "Hauts-de-France, France",
   "lat": 50.987,
   "lon": 2.128,
   "kind": "ovh",
   "operator": "OVHcloud GRA1",
   "note": "Passerelle secondaire : secours et présence européenne."
  },
  "ist": {
   "name": "Istanbul",
   "region": "Turquie",
   "lat": 41.008,
   "lon": 28.978,
   "kind": "rented",
   "operator": "Macly (réseau Erlion)",
   "note": "Huit Macs dédiés loués : un Mac Studio M1 Max 64 Go et sept Mac mini."
  },
  "atl": {
   "name": "Atlanta",
   "region": "Géorgie, États-Unis",
   "lat": 33.786,
   "lon": -84.406,
   "kind": "rented",
   "operator": "MacStadium",
   "note": "Mac mini M2 Pro dédié."
  },
  "dub": {
   "name": "Dublin",
   "region": "Irlande",
   "lat": 53.335,
   "lon": -6.252,
   "kind": "rented",
   "operator": "MacStadium",
   "note": "Deux Mac mini dédiés (M1, M2)."
  },
  "lim": {
   "name": "Limassol",
   "region": "Chypre",
   "lat": 34.687,
   "lon": 33.037,
   "kind": "rented",
   "operator": "rentamac",
   "note": "Mac mini M4 derrière NAT, joint par la passerelle SSH du fournisseur."
  }
 },
 "totals": {
  "macs": 33,
  "ovh": 4,
  "apps": 36,
  "sites": 35
 },
 "nodes": [
  {
   "id": "M3U96a",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M3 Ultra",
   "tier": "ultra",
   "cores": 32,
   "gpu": 80,
   "ram": 96,
   "disk": 926,
   "ip": "192.168.2.87",
   "role": "Nœud maître de calcul et d'applications",
   "desc": "Le plus gros nœud du cluster. Héberge la console Administration·Ka et une grappe d'applications Next.js/FastAPI (QC26, RareIndex, Fetcha, PolyLLM, UQO).",
   "tags": [
    "worker",
    "apps",
    "calcul"
   ]
  },
  {
   "id": "M3U96b",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M3 Ultra",
   "tier": "ultra",
   "cores": 32,
   "gpu": 80,
   "ram": 96,
   "disk": 926,
   "ip": "192.168.2.82",
   "role": "Réservé à HF Market Data",
   "desc": "Sert le lac de données FirstRate (353 Go de séries intraday, DuckDB) derrière www.hfmarketdata.io. Réservé : aucune autre app n'y est placée.",
   "tags": [
    "worker",
    "data",
    "réservé"
   ]
  },
  {
   "id": "M2U64",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M2 Ultra",
   "tier": "ultra",
   "cores": 24,
   "gpu": 76,
   "ram": 64,
   "disk": 926,
   "ip": "192.168.2.107",
   "role": "Nœud d'applications sans session graphique",
   "desc": "Tourne en LaunchDaemon (headless). Héberge SPB Cloud, vQuant, UQO Éval, Food·Ka et les consoles MacLustr.",
   "tags": [
    "worker",
    "apps",
    "headless"
   ]
  },
  {
   "id": "M4M64a",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M4 Max",
   "tier": "max",
   "cores": 16,
   "gpu": 40,
   "ram": 64,
   "disk": 926,
   "ip": "192.168.2.83",
   "role": "Applications + agent de supervision",
   "desc": "Héberge maclustr-agentd (:9210), la source des apps macOS et iOS MacLustr, ce site www.maclustr.io, ainsi que Lou·Ka, Fabri·Ka, Ka·Stats, UQO-Chat et PDB API.",
   "tags": [
    "worker",
    "apps",
    "monitoring"
   ]
  },
  {
   "id": "M4M64b",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M4 Max",
   "tier": "max",
   "cores": 16,
   "gpu": 40,
   "ram": 64,
   "disk": 926,
   "ip": "192.168.2.78",
   "role": "Applications Groupe Ka + index",
   "desc": "API·Ka (Postgres 17 + Redis), Groupe Ka, Immo·Ka, Auto·Ka, CancerIndex, WebSensor, UQO IMM1003.",
   "tags": [
    "worker",
    "apps",
    "postgres"
   ]
  },
  {
   "id": "M4BP48",
   "group": "lan",
   "site": "staug",
   "model": "MacBook Pro",
   "chip": "M4 Max",
   "tier": "max",
   "cores": 16,
   "gpu": 40,
   "ram": 48,
   "disk": 926,
   "ip": "192.168.2.80",
   "role": "Nœud de calcul",
   "desc": "Portable intégré au cluster ; disponible pour les jobs distribués (uv, Python 3.12).",
   "tags": [
    "worker",
    "calcul"
   ]
  },
  {
   "id": "M4BP36",
   "group": "lan",
   "site": "staug",
   "model": "MacBook Pro",
   "chip": "M4 Max",
   "tier": "max",
   "cores": 14,
   "gpu": 32,
   "ram": 36,
   "disk": null,
   "ip": "192.168.2.133",
   "role": "Nœud de calcul (mobile)",
   "desc": "Portable, souvent hors ligne : nœud d'appoint pour le calcul distribué.",
   "tags": [
    "worker",
    "calcul"
   ]
  },
  {
   "id": "M4M36",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M4 Max",
   "tier": "max",
   "cores": 14,
   "gpu": 40,
   "ram": 36,
   "disk": 460,
   "ip": "192.168.2.69",
   "role": "Gardiens Ka",
   "desc": "Héberge les trois agents gardiens ka2, ka4 et ka6 qui surveillent, réparent et poussent les apps Groupe Ka.",
   "tags": [
    "worker",
    "agents"
   ]
  },
  {
   "id": "M2M32",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M2 Max",
   "tier": "max",
   "cores": 12,
   "gpu": 38,
   "ram": 32,
   "disk": 460,
   "ip": "192.168.2.90",
   "role": "Nœud de calcul",
   "desc": "Docker, Node, Python : nœud générique pour le calcul et les déploiements mld.",
   "tags": [
    "worker",
    "calcul"
   ]
  },
  {
   "id": "M2M32b",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M2 Max",
   "tier": "max",
   "cores": 12,
   "gpu": 38,
   "ram": 32,
   "disk": 460,
   "ip": "192.168.2.77",
   "role": "Nœud de calcul",
   "desc": "Nœud générique, ex-flotte de scraping Trouve-Ka.",
   "tags": [
    "worker",
    "calcul"
   ]
  },
  {
   "id": "M2M32c",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M2 Max",
   "tier": "max",
   "cores": 12,
   "gpu": 30,
   "ram": 32,
   "disk": 460,
   "ip": "192.168.2.89",
   "role": "Nœud de calcul",
   "desc": "Nœud générique pour les jobs Python distribués.",
   "tags": [
    "worker",
    "calcul"
   ]
  },
  {
   "id": "m4mc",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M4 Pro",
   "tier": "pro",
   "cores": 12,
   "gpu": 16,
   "ram": 24,
   "disk": 460,
   "ip": "192.168.2.75",
   "role": "Nœud de calcul",
   "desc": "Mac mini M4 Pro, nœud générique.",
   "tags": [
    "worker",
    "calcul"
   ]
  },
  {
   "id": "M1M32",
   "group": "lan",
   "site": "staug",
   "model": "Mac Studio",
   "chip": "M1 Max",
   "tier": "max",
   "cores": 10,
   "gpu": 32,
   "ram": 32,
   "disk": 460,
   "ip": "192.168.2.76",
   "role": "Passerelle du cluster",
   "desc": "Porte d'entrée : héberge spbgit (git.spboucher.ai, dépôts bare de toutes les apps) et l'orchestrateur mld qui place, déploie, migre et répare chaque application. Aucune app métier n'y tourne.",
   "tags": [
    "gateway",
    "git",
    "orchestrateur"
   ]
  },
  {
   "id": "m4ma",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 24,
   "disk": 460,
   "ip": "192.168.2.73",
   "role": "Nœud de calcul",
   "desc": "Mac mini M4, nœud générique.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "m4mb",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "ip": "192.168.2.74",
   "role": "Nœud de calcul",
   "desc": "Mac mini M4, nœud générique.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "m4md",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "ip": "192.168.2.110",
   "role": "Nœud de calcul",
   "desc": "Mac mini M4 ajouté le 4 septembre 2026.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "m2m16",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M2 Pro",
   "tier": "pro",
   "cores": 10,
   "gpu": 16,
   "ram": 16,
   "disk": 460,
   "ip": "192.168.2.85",
   "role": "Nœud de calcul",
   "desc": "Mac mini M2 Pro, nœud générique.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "M3BA24",
   "group": "lan",
   "site": "staug",
   "model": "MacBook Air",
   "chip": "M3",
   "tier": "base",
   "cores": 8,
   "gpu": 10,
   "ram": 24,
   "disk": 460,
   "ip": "192.168.2.81",
   "role": "Nœud d'appoint",
   "desc": "MacBook Air, nœud d'appoint pour le calcul léger.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "M3BA16",
   "group": "lan",
   "site": "staug",
   "model": "MacBook Air",
   "chip": "M3",
   "tier": "base",
   "cores": 8,
   "gpu": 10,
   "ram": 16,
   "disk": 460,
   "ip": "192.168.2.70",
   "role": "Nœud d'appoint",
   "desc": "MacBook Air, nœud d'appoint.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "m2m8a",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M2",
   "tier": "base",
   "cores": 8,
   "gpu": 10,
   "ram": 8,
   "disk": 460,
   "ip": "192.168.2.84",
   "role": "Nœud léger",
   "desc": "Mac mini M2 8 Go : tâches légères et tests.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "m2m8b",
   "group": "lan",
   "site": "staug",
   "model": "Mac mini",
   "chip": "M2",
   "tier": "base",
   "cores": 8,
   "gpu": 10,
   "ram": 8,
   "disk": 228,
   "ip": "192.168.2.72",
   "role": "Nœud léger",
   "desc": "Mac mini M2 8 Go : tâches légères et tests.",
   "tags": [
    "worker"
   ]
  },
  {
   "id": "M1M64",
   "group": "rented",
   "model": "Mac Studio",
   "chip": "M1 Max",
   "tier": "max",
   "cores": 10,
   "gpu": 32,
   "ram": 64,
   "disk": 1800,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant à grande mémoire",
   "desc": "Mac Studio loué, 64 Go et 1,8 To : réservé aux déploiements explicites (mld deploy --node M1M64).",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m2m16b",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M2 Pro",
   "tier": "pro",
   "cores": 10,
   "gpu": 16,
   "ram": 16,
   "disk": 926,
   "site": "atl",
   "provider": "MacStadium",
   "location": "Atlanta, États-Unis",
   "role": "Nœud distant",
   "desc": "Mac mini M2 Pro dédié, raccordé au tunnel MacLustr.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m1m16",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M1",
   "tier": "base",
   "cores": 8,
   "gpu": 8,
   "ram": 16,
   "disk": 926,
   "site": "dub",
   "provider": "MacStadium",
   "location": "Dublin, Irlande",
   "role": "Nœud distant",
   "desc": "Mac mini M1 dédié.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m2m16c",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M2",
   "tier": "base",
   "cores": 8,
   "gpu": 10,
   "ram": 16,
   "disk": 926,
   "site": "dub",
   "provider": "MacStadium",
   "location": "Dublin, Irlande",
   "role": "Nœud distant",
   "desc": "Mac mini M2 dédié.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m4me",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Mac mini M4 dédié, amorcé à distance (DeskIn + script), PM2 en LaunchDaemon.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m4mf",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Jumeau de m4me.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m4mg",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "lim",
   "provider": "rentamac",
   "location": "Limassol, Chypre",
   "role": "Nœud distant (Méditerranée)",
   "desc": "Derrière NAT, joint par la passerelle SSH du fournisseur. Xcode complet préinstallé.",
   "tags": [
    "distant",
    "réservé",
    "europe"
   ]
  },
  {
   "id": "m4mh",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m1m16b",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M1",
   "tier": "base",
   "cores": 8,
   "gpu": 8,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Mac mini M1 dédié, ajouté le 10 septembre 2026.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m4mi",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m4mj",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "m4mk",
   "group": "rented",
   "model": "Mac mini",
   "chip": "M4",
   "tier": "base",
   "cores": 10,
   "gpu": 10,
   "ram": 16,
   "disk": 228,
   "site": "ist",
   "provider": "Macly",
   "location": "Istanbul, Turquie",
   "role": "Nœud distant",
   "desc": "Mac mini M4 dédié, ajouté le 10 septembre 2026.",
   "tags": [
    "distant",
    "réservé"
   ]
  },
  {
   "id": "BHS64",
   "group": "ovh",
   "model": "OVH ADVANCE-2",
   "chip": "AMD EPYC 4345P",
   "tier": "epyc",
   "cores": 16,
   "threads": true,
   "gpu": 0,
   "ram": 64,
   "disk": 960,
   "site": "bhs",
   "provider": "OVHcloud",
   "location": "Beauharnois, Québec",
   "role": "Passerelle principale MacLustr Tunnel",
   "desc": "Point d'entrée public de tous les sites : hub WireGuard 10.67.0.1 + Caddy (TLS Let's Encrypt automatique). EPYC 4345P 8 c/16 t, 64 Go DDR5 ECC, 2 × 960 Go NVMe RAID 1, 3 Gbit/s, Ubuntu 24.04. ≈ 10 ms depuis le cluster.",
   "tags": [
    "gateway",
    "wireguard",
    "caddy",
    "linux"
   ]
  },
  {
   "id": "BHS64b",
   "group": "ovh",
   "model": "OVH ADVANCE-2",
   "chip": "AMD EPYC 4345P",
   "tier": "epyc",
   "cores": 16,
   "threads": true,
   "gpu": 0,
   "ram": 64,
   "disk": 960,
   "site": "bhs",
   "provider": "OVHcloud",
   "location": "Beauharnois, Québec",
   "role": "Serveur de réserve",
   "desc": "Jumeau de BHS64 : EPYC 4345P 8 c/16 t, 64 Go DDR5 ECC, 2 × 960 Go NVMe RAID 1, 3 Gbit/s, Ubuntu 24.04. Réservé pour un usage à venir, hors tunnel.",
   "tags": [
    "linux",
    "réserve"
   ]
  },
  {
   "id": "BHS128",
   "group": "ovh",
   "model": "OVH ADVANCE-1",
   "chip": "AMD EPYC 4245P",
   "tier": "epyc",
   "cores": 12,
   "threads": true,
   "gpu": 0,
   "ram": 128,
   "disk": 960,
   "site": "bhs",
   "provider": "OVHcloud",
   "location": "Beauharnois, Québec",
   "role": "Serveur de réserve à grande mémoire",
   "desc": "EPYC 4245P 6 c/12 t, 128 Go DDR5, 2 × 960 Go NVMe RAID 1, 3 Gbit/s, Ubuntu 24.04. Prêt à accueillir une application ou une base de données exigeante ; hors tunnel.",
   "tags": [
    "linux",
    "réserve",
    "128 Go"
   ]
  },
  {
   "id": "R9128",
   "group": "ovh",
   "model": "OVH RISE-L",
   "chip": "AMD Ryzen 9 9950X",
   "tier": "ryzen",
   "cores": 32,
   "threads": true,
   "gpu": 0,
   "ram": 128,
   "disk": 960,
   "site": "gra",
   "provider": "OVHcloud",
   "location": "Gravelines, France",
   "role": "Passerelle secondaire (Europe)",
   "desc": "Hub WireGuard 10.66.0.1 + Caddy : secours et présence européenne du tunnel. Ryzen 9 9950X 16 c/32 t, 128 Go DDR5, 2 × 960 Go NVMe RAID 1, 1 Gbit/s, Ubuntu 24.04.",
   "tags": [
    "gateway",
    "wireguard",
    "caddy",
    "linux",
    "europe"
   ]
  }
 ],
 "appGroups": [
  {
   "id": "ka",
   "name": "Groupe Ka",
   "blurb": "L'écosystème immobilier, automobile, alimentaire et emploi du Québec : une famille de plateformes qui partagent identité (KA ID), données (API·Ka) et gardiens autonomes."
  },
  {
   "id": "data",
   "name": "Données & intelligence",
   "blurb": "Indices, marchés et infrastructures de données servis en API publiques."
  },
  {
   "id": "uqo",
   "name": "Enseignement UQO",
   "blurb": "Outils de cours interactifs, tuteur IA et ateliers d'évaluation immobilière."
  },
  {
   "id": "platform",
   "name": "Plateforme MacLustr",
   "blurb": "Les services qui font tourner le cluster lui-même."
  },
  {
   "id": "spb",
   "name": "SPB",
   "blurb": "Sites et services personnels."
  }
 ],
 "apps": [
  {
   "id": "groupe-ka",
   "group": "ka",
   "name": "Groupe Ka",
   "domain": "www.groupe-ka.com",
   "node": "M4M64b",
   "port": 8110,
   "desc": "Portail du groupe : vision, univers, dossier investisseurs."
  },
  {
   "id": "lou-ka",
   "group": "ka",
   "name": "Lou·Ka",
   "domain": "www.lou-ka.com",
   "node": "M4M64a",
   "port": 8095,
   "desc": "Location résidentielle : annonces, carte 3D, Lou-Ka Score."
  },
  {
   "id": "immo-ka",
   "group": "ka",
   "name": "Immo·Ka",
   "domain": "www.immo-ka.com",
   "node": "M4M64b",
   "port": 8096,
   "desc": "Propriétés à vendre : 70 000+ annonces, analyses de prix, KA Scores."
  },
  {
   "id": "vrai-prix",
   "group": "ka",
   "name": "Vrai-Prix",
   "domain": "www.vrai-prix.com",
   "node": "M3U96a",
   "port": 8090,
   "desc": "Évaluation hédonique, méthode du coût, statistiques de marché."
  },
  {
   "id": "auto-ka",
   "group": "ka",
   "name": "Auto·Ka",
   "domain": "www.auto-ka.com",
   "node": "M4M64b",
   "port": 8095,
   "desc": "Marché automobile : véhicules, prix, fiches v3."
  },
  {
   "id": "fabri-ka",
   "group": "ka",
   "name": "Fabri·Ka",
   "domain": "www.fabri-ka.com",
   "node": "M4M64a",
   "port": 8097,
   "desc": "Artisans, fabricants et ateliers du Québec."
  },
  {
   "id": "food-ka",
   "group": "ka",
   "name": "Food·Ka",
   "domain": "www.food-ka.com",
   "node": "M2U64",
   "port": 8097,
   "desc": "Alimentation : produits, commerces, prix."
  },
  {
   "id": "sorti-ka",
   "group": "ka",
   "name": "Sorti·Ka",
   "domain": "www.sorti-ka.com",
   "node": "M3U96a",
   "port": 8120,
   "desc": "Sorties, événements et activités."
  },
  {
   "id": "job-ka",
   "group": "ka",
   "name": "Job·Ka",
   "domain": "www.job-ka.com",
   "node": "M3U96a",
   "port": 8096,
   "desc": "Emplois et carrières."
  },
  {
   "id": "api-ka",
   "group": "ka",
   "name": "API·Ka",
   "domain": "www.api-ka.com",
   "node": "M4M64b",
   "port": 8000,
   "desc": "API unifiée du groupe : Postgres 17, Redis, 24 outils agent."
  },
  {
   "id": "ka-stats",
   "group": "ka",
   "name": "Ka·Stats",
   "domain": "www.ka-stats.com",
   "node": "M4M64a",
   "port": 8140,
   "desc": "Observatoire statistique des univers Ka."
  },
  {
   "id": "admin-ka",
   "group": "ka",
   "name": "Administration·Ka",
   "domain": "www.administration-ka.com",
   "node": "M3U96a",
   "port": 3300,
   "desc": "Console d'administration multi-sites, pilotée par le registre mld."
  },
  {
   "id": "ka2",
   "group": "ka",
   "name": "Gardien ka2",
   "domain": "www.ka2.bot",
   "node": "M4M36",
   "port": 8799,
   "desc": "Agent gardien autonome : surveillance et réparation."
  },
  {
   "id": "ka4",
   "group": "ka",
   "name": "Gardien ka4",
   "domain": "www.ka4.bot",
   "node": "M4M36",
   "port": 8899,
   "desc": "Agent gardien autonome."
  },
  {
   "id": "ka6",
   "group": "ka",
   "name": "Gardien ka6",
   "domain": "www.ka6.bot",
   "node": "M4M36",
   "port": 8999,
   "desc": "Agent gardien autonome."
  },
  {
   "id": "hfmarketdata",
   "group": "data",
   "name": "HF Market Data",
   "domain": "www.hfmarketdata.io",
   "node": "M3U96b",
   "port": 8090,
   "desc": "Données de marché haute fréquence : actions, futures, options, fondamentaux SEC. API + MCP."
  },
  {
   "id": "rareindex",
   "group": "data",
   "name": "RareIndex",
   "domain": "www.rareindex.io",
   "node": "M3U96a",
   "port": 8210,
   "desc": "Intelligence de marché des objets de collection : 212 connecteurs."
  },
  {
   "id": "cancerindex",
   "group": "data",
   "name": "CancerIndex",
   "domain": "www.cancerindex.io",
   "node": "M4M64b",
   "port": 8250,
   "desc": "Index mondial des cancers : 9 510 entités NCIt, 13 connecteurs, pgvector."
  },
  {
   "id": "websensor",
   "group": "data",
   "name": "WebSensor",
   "domain": "www.websensor.io",
   "node": "M4M64b",
   "port": 8260,
   "desc": "Détection de changements web : 4 000+ capteurs, 16 connecteurs."
  },
  {
   "id": "fetcha",
   "group": "data",
   "name": "Fetcha",
   "domain": "www.fetcha.co",
   "node": "M3U96a",
   "port": 8220,
   "desc": "Infrastructure d'accès web intelligent : scrape, crawl, map, SDK."
  },
  {
   "id": "polyllm",
   "group": "data",
   "name": "PolyLLM",
   "domain": "www.polyllm.io",
   "node": "M3U96a",
   "port": 8240,
   "desc": "Une interface, tous les modèles : 9 fournisseurs, Arena, BYOK."
  },
  {
   "id": "vquant",
   "group": "data",
   "name": "vQuant",
   "domain": "www.vquant.ai",
   "node": "M2U64",
   "port": 5000,
   "desc": "Terminal quantitatif : indices, portefeuilles, MFA."
  },
  {
   "id": "qc26",
   "group": "data",
   "name": "QC26",
   "domain": "www.qc26.ca",
   "node": "M3U96a",
   "port": 8200,
   "desc": "L'élection québécoise 2026 en données : sondages, Monte Carlo, revue de presse."
  },
  {
   "id": "pdb-api",
   "group": "data",
   "name": "PDB API",
   "domain": "www.pdb-api.co",
   "node": "M4M64a",
   "port": 8270,
   "desc": "Explorateur et API de la base SPID (FastAPI + DuckDB)."
  },
  {
   "id": "uqo-eval",
   "group": "uqo",
   "name": "UQO Éval",
   "domain": "www.uqo-eval.app",
   "node": "M2U64",
   "port": 8150,
   "desc": "Atelier d'évaluation immobilière : hédonique, coût, à vendre, marché."
  },
  {
   "id": "uqo-imm1003",
   "group": "uqo",
   "name": "UQO IMM1003",
   "domain": "www.uqo-imm1003.app",
   "node": "M4M64b",
   "port": 8160,
   "desc": "Notes de cours interactives et séances vidéo."
  },
  {
   "id": "uqo-imm1033",
   "group": "uqo",
   "name": "UQO IMM1033",
   "domain": "www.uqo-imm1033.app",
   "node": "M3U96a",
   "port": 8161,
   "desc": "Notes de cours interactives et séances vidéo."
  },
  {
   "id": "uqo-chat",
   "group": "uqo",
   "name": "UQO-Chat",
   "domain": "www.uqo-chat.app",
   "node": "M4M64a",
   "port": 8190,
   "desc": "Tuteur IA des cours IMM1003 et IMM1033, sur invitation."
  },
  {
   "id": "maclustr-www",
   "group": "platform",
   "name": "www.maclustr.io",
   "domain": "www.maclustr.io",
   "node": "M4M64a",
   "port": 8280,
   "desc": "Cette page : vitrine du cluster, inventaire et état live des nœuds et des applications."
  },
  {
   "id": "maclustr-agentd",
   "group": "platform",
   "name": "maclustr-agentd",
   "domain": null,
   "node": "M4M64a",
   "port": 9210,
   "desc": "Agent de supervision : métriques des 33 nœuds, santé des apps, état du tunnel. Alimente les apps macOS et iOS MacLustr et ce site."
  },
  {
   "id": "maclustr-console",
   "group": "platform",
   "name": "Console MacLustr",
   "domain": "console.maclustr.io",
   "node": "M2U64",
   "port": 3000,
   "desc": "Console web du cluster."
  },
  {
   "id": "maclustr-appmanager",
   "group": "platform",
   "name": "App Manager",
   "domain": "app.maclustr.io",
   "node": "M2U64",
   "port": 8787,
   "desc": "Gestionnaire d'applications."
  },
  {
   "id": "maclustr-nodepages",
   "group": "platform",
   "name": "Node Pages",
   "domain": "node.maclustr.io",
   "node": "M2U64",
   "port": 8003,
   "desc": "Pages de bord par nœud."
  },
  {
   "id": "spbgit",
   "group": "platform",
   "name": "spbgit",
   "domain": "git.spboucher.ai",
   "node": "M1M32",
   "port": 7420,
   "desc": "Forge git privée : dépôts bare de toutes les apps, source de vérité du code."
  },
  {
   "id": "spboucher-ai",
   "group": "spb",
   "name": "spboucher.ai",
   "domain": "www.spboucher.ai",
   "node": "M2U64",
   "port": 3100,
   "desc": "Site personnel."
  },
  {
   "id": "spb-cloud",
   "group": "spb",
   "name": "SPB Cloud",
   "domain": "cloud.spboucher.ai",
   "node": "M2U64",
   "port": 5001,
   "desc": "Nuage privé : fichiers, partage, OTP, réorganisation IA."
  }
 ],
 "tunnel": {
  "gateways": [
   {
    "id": "BHS64",
    "ip": "51.161.112.61",
    "site": "Beauharnois, Québec",
    "primary": true,
    "wg": "10.67.0.0/24"
   },
   {
    "id": "R9128",
    "ip": "51.255.75.61",
    "site": "Gravelines, France",
    "primary": false,
    "wg": "10.66.0.0/24"
   }
  ]
 }
}