SPB Git forge

spb/ka-stats

Public
8commits 1branches 0releases
2.2 MBsize
maindefault branch
26 days agolast push
JavaScript 73.4% CSS 25.3% HTML 1.3%
20.4 KB · 414 lines markdown
Rendered Raw Blame History
1# Ka·Stats — l'explorateur de statistiques du Québec23**www.ka-stats.com** · Un service **Groupe KA**45Ka·Stats est l'**observatoire de données** de l'écosystème Groupe KA : un6serveur Node **zéro dépendance** qui agrège **en direct** les tableaux de bord7`GET /api/stats/dashboard` (contrat **ka-stats v2**) des **14 plateformes8publiques** du groupe — Lou·Ka, Immo·Ka, House·Ka, Vrai-Prix, Auto·Ka, Job·Ka,9Food·Ka, Resto·Ka, Fabri·Ka, Sorti·Ka, Créa·Ka, Trouve·Ka, Rent·Ka, API·Ka —10et les rend explorables dans une seule interface : graphiques interactifs,11indicateurs du Québec par thème, comparateur base 100, studio d'indicateurs12sur mesure et palmarès des records.1314Au moment d'écrire ces lignes, l'observatoire suit **plus de 5,8 millions15d'éléments** (annonces, propriétés, produits, offres d'emploi, événements,16créateurs, pages indexées…), **434 graphiques** rendus depuis les dashboards17satellites et un catalogue de **248 métriques** combinables dans le Studio —18le tout mis à jour en continu, sans base de données propre.1920**Identité visuelle** : accent **#095797** (le bleu officiel du Québec),21wordmark « Ka·Stats » dont le segment **« Stats » est posé en boîte inversée**22sur l'accent (le motif signature ka-ui), typographies Space Grotesk (titres) et23JetBrains Mono (chiffres), design system `tokens.css` de ka-ui vendorisé.2425---2627## Sommaire2829- [Visite guidée](#visite-guidée)30- [Aperçu mobile & desktop](#aperçu-mobile--desktop)31- [Les 14 plateformes agrégées](#les-14-plateformes-agrégées)32- [Pages & fonctionnalités](#pages--fonctionnalités)33- [Le contrat ka-stats v2 et son rendu générique](#le-contrat-ka-stats-v2-et-son-rendu-générique)34- [QCharts — graphiques SVG maison](#qcharts--graphiques-svg-maison)35- [API](#api)36- [Architecture](#architecture)37- [Structure du dépôt](#structure-du-dépôt)38- [Exploitation & déploiement](#exploitation--déploiement)39- [Développement remote-first](#développement-remote-first)40- [Écosystème & contact](#écosystème--contact)4142---4344## Visite guidée4546*Captures du 2026-08-28, prises sur le site en production47(www.ka-stats.com) — desktop 1440×900, mobile 390×844.*4849### 1 · Vue d'ensemble — le pouls de l'écosystème5051![Vue d'ensemble](docs/screenshots/01-accueil.jpg)5253La page d'accueil (`/`) donne le pouls du Québec en un coup d'œil : total54d'éléments suivis, plateformes en direct, courbe de la somme quotidienne des55indicateurs principaux des 14 plateformes, grille des plateformes (chacune56avec son accent officiel, ses KPI et sa sparkline), prix du Québec en direct57et premiers records. Le sélecteur de période global (aujourd'hui → tout,58plus plage libre) est relayé à toutes les plateformes satellites. Le bouton59« ✦ Construire un indicateur sur mesure » mène directement au Studio.6061### 2 · Indicateurs — les chiffres du Québec par thème6263![Indicateurs](docs/screenshots/02-indicateurs.jpg)6465`/indicateurs` regroupe les chiffres du Québec par grand thème — habitation,66mobilité, emploi, consommation, culture, infrastructure : loyer moyen, prix67des propriétés, valeur foncière, prix des voitures usagées, salaires affichés,68prix d'épicerie… Chaque carte affiche la valeur en direct, son unité et son69delta (▲/▼ %) sur la période choisie, avec les graphiques associés en70deux colonnes sous chaque thème.7172### 3 · Comparer — la croissance sur un seul axe7374![Comparer](docs/screenshots/03-comparer.jpg)7576`/comparer` met jusqu'à **4 plateformes sur un seul axe** en **indice77base 100** (100 = début de période) : des univers aux unités hétérogènes78(annonces, produits, pages indexées…) deviennent directement comparables,79sans jamais recourir à une double échelle. Un mode « valeurs brutes » existe80mais affiche un avertissement — l'indice est la lecture recommandée.8182### 4 · Studio — construisez votre indicateur sur mesure8384![Studio](docs/screenshots/04-studio.jpg)8586`/studio` est le **constructeur d'indicateurs** : recherche floue parmi les87**248 métriques** du catalogue (14 plateformes), sélection de **jusqu'à884 métriques**, **transformations** (valeurs brutes, indice 100, variation %89jour, moyenne mobile 7 j, cumul), **combinaisons** de 2 métriques (ratio90A ÷ B, écart A − B, somme A + B), choix du type de graphique (ligne, aire,91barres), titre personnalisé, **enregistrement local** de ses indicateurs et92**lien partageable** (`/studio?c=…`, la configuration complète encodée dans93l'URL). Chaque graphique du site propose d'ailleurs un bouton « Ouvrir dans94le Studio » pour repartir de n'importe quelle courbe.9596### 5 · Palmarès — records et faits marquants9798![Palmarès](docs/screenshots/05-palmares.jpg)99100`/palmares` agrège les faits saillants détectés dans les données : jours101records de chaque plateforme, classement des **plus fortes croissances**102(variation de l'indicateur principal entre le début et la fin de la période)103et la grille de tous les records de l'écosystème.104105### 6 · Fiche plateforme — le dashboard complet de Lou·Ka106107![Fiche Lou·Ka](docs/screenshots/06-site-lou-ka.jpg)108109`/site/:id` (ici `/site/lou-ka`) rend **génériquement et intégralement** le110contrat ka-stats v2 de la plateforme, aux couleurs de son accent officiel :111KPI + sparklines, jauges, séries temporelles (crosshair + infobulles +112comparaison à la période précédente), multi-courbes, aires empilées, anneaux,113histogrammes, répartitions géographiques, heatmaps calendrier et horaire,114tableaux triables/filtrables/paginés, records — et les liens vers les115**5 rapports PDF** générés par la plateforme elle-même.116117### 7 · Fiche plateforme — Vrai-Prix, la valeur foncière en direct118119![Fiche Vrai-Prix](docs/screenshots/07-site-vrai-prix.jpg)120121`/site/vrai-prix` : même moteur de rendu, tout autre univers. Le dashboard de122Vrai-Prix (la valeur réelle de chaque propriété) s'affiche dans le rouge123signature de la plateforme — indicateurs fonciers, évolutions quotidiennes,124répartitions et records, avec le sélecteur de période et les exports CSV/PNG125sur chaque graphique. C'est la démonstration du contrat v2 : Ka·Stats ne126connaît pas Vrai-Prix en particulier, il rend ce que son dashboard déclare.127128### 8 · Fiche plateforme — Trouve·Ka, le moteur de recherche québécois129130![Fiche Trouve·Ka](docs/screenshots/08-site-trouve-ka.jpg)131132`/site/trouve-ka` : le tableau de bord d'une plateforme d'infrastructure de133recherche — pages indexées, domaines couverts, activité d'indexation — rendu134en bleu Trouve·Ka. Les unités changent (pages, domaines), la mécanique reste135la même : KPI + sparklines, séries interactives, tableaux triables et records.136137### 9 · Le pouls de l'écosystème — la somme quotidienne138139![Pouls de l'écosystème](docs/screenshots/09-accueil-pouls.jpg)140141La section « pouls » de l'accueil trace la **somme quotidienne des142indicateurs principaux des 14 plateformes** (annonces + produits + offres +143événements + créateurs + pages…) : une seule courbe qui raconte la croissance144de tout l'écosystème, avec crosshair, infobulle, zoom par sélection et vue145tableau jumelle — plus de 5,8 M d'éléments au dernier point.146147### 10 · Mobile — l'observatoire dans la poche148149![Accueil mobile](docs/screenshots/10-accueil-mobile.jpg)150151La vue d'ensemble en 390 px : la SPA est entièrement responsive (socle mobile152ka-ui — zones sûres, cibles tactiles, panneau de navigation plein écran), les153graphiques SVG se recomposent à la largeur du téléphone et le sélecteur de154période reste accessible en tête de page.155156---157158## Aperçu mobile & desktop159160*Captures du 2026-08-25 (mobile 390×844 · desktop 1440×900).*161162### Mobile163164<table>165  <tr>166    <td align="center"><img src="docs/screenshots/mobile/home.webp" width="240" alt="Vue d'ensemble mobile"><br><sub><b>Vue d'ensemble — l'observatoire de données</b></sub></td>167    <td align="center"><img src="docs/screenshots/mobile/indicateurs.webp" width="240" alt="Indicateurs mobile"><br><sub><b>Indicateurs — les chiffres du Québec par thème</b></sub></td>168    <td align="center"><img src="docs/screenshots/mobile/menu-mobile.webp" width="240" alt="Menu mobile"><br><sub><b>Nav v2 — panneau plein écran</b></sub></td>169  </tr>170</table>171172### Desktop173174<table>175  <tr>176    <td align="center"><img src="docs/screenshots/desktop/home.webp" width="420" alt="Vue d'ensemble"><br><sub><b>Vue d'ensemble — période ajustable (jour → tout)</b></sub></td>177    <td align="center"><img src="docs/screenshots/desktop/indicateurs.webp" width="420" alt="Indicateurs"><br><sub><b>Indicateurs — prix, salaires, loyers, volumes des plateformes KA</b></sub></td>178  </tr>179  <tr>180    <td align="center"><img src="docs/screenshots/desktop/comparer.webp" width="420" alt="Comparer"><br><sub><b>Comparer — métriques croisées entre plateformes</b></sub></td>181    <td align="center"><img src="docs/screenshots/desktop/palmares.webp" width="420" alt="Palmarès"><br><sub><b>Palmarès — records et faits marquants détectés</b></sub></td>182  </tr>183  <tr>184    <td align="center" colspan="2"><img src="docs/screenshots/desktop/studio.webp" width="640" alt="Studio"><br><sub><b>Studio — construisez votre indicateur : 248 métriques, 14 plateformes, transformations (indice 100, variation, moyenne mobile, cumul), partage par lien</b></sub></td>185  </tr>186</table>187188---189190## Les 14 plateformes agrégées191192Chaque plateforme expose `GET /api/stats/dashboard` (contrat ka-stats v2) ;193Ka·Stats les interroge en parallèle avec la période demandée. Les accents194proviennent de l'`ecosystem.json` de ka-ui.195196| Plateforme | Domaine | Thème | Mission |197|---|---|---|---|198| Lou·Ka | www.lou-ka.com | habitation | Tous les logements à louer |199| Immo·Ka | www.immo-ka.com | habitation | Toutes les propriétés à vendre |200| House·Ka | www.house-ka.com | habitation | Maisons à vendre — Canada hors Québec (EN) |201| Vrai-Prix | www.vrai-prix.com | habitation | La valeur réelle de chaque propriété |202| Rent·Ka | www.rent-ka.com | habitation | Locations résidentielles — Canada hors Québec |203| Auto·Ka | www.auto-ka.com | mobilité | Les voitures usagées du Québec |204| Job·Ka | www.job-ka.com | emploi | Tous les emplois des employeurs québécois |205| Food·Ka | www.food-ka.com | consommation | Les prix d'épicerie, suivis à la source |206| Resto·Ka | www.resto-ka.com | consommation | Chaque resto, chaque plat, chaque prix |207| Fabri·Ka | www.fabri-ka.com | consommation | Les produits fabriqués au Québec |208| Sorti·Ka | www.sorti-ka.com | culture | Toutes les sorties, dans les 17 régions |209| Créa·Ka | www.crea-ka.com | culture | Les créateurs d'ici, tous leurs liens |210| Trouve·Ka | www.trouve-ka.com | culture | Le moteur de recherche du web québécois |211| API·Ka | www.api-ka.com | infrastructure | La donnée de l'écosystème, par API |212213---214215## Pages & fonctionnalités216217| Route | Page | Contenu |218|---|---|---|219| `/` | Vue d'ensemble | Pouls de l'écosystème (somme quotidienne des indicateurs principaux), grille des 14 plateformes (accents officiels, KPI, sparklines), prix du Québec en direct, records, CTA vers le Studio |220| `/site/:id` | Fiche plateforme | Rendu générique complet du dashboard v2 de la plateforme + liens vers ses 5 rapports PDF (`/api/stats/report?mode=…` sur le domaine satellite) |221| `/indicateurs` | Indicateurs | Les chiffres du Québec par thème (habitation, mobilité, emploi, consommation, culture, infrastructure) avec deltas ▲/▼ % |222| `/comparer` | Comparateur | Jusqu'à 4 plateformes sur un seul axe, indice base 100 (mode brut disponible mais déconseillé — avertissement affiché) |223| `/studio` | Studio | Constructeur d'indicateurs : 248 métriques, transformations, combinaisons, types de graphique, sauvegarde locale, liens partageables |224| `/palmares` | Palmarès | Jours records, classement de croissance, grille des faits marquants |225226Fonctions transversales :227228- **Sélecteur de période global** — `auj / 7j / 30j / 3m / 6m / 12m / annee /229  tout` + plage libre `from/to` (AAAA-MM-JJ), relayé tel quel aux satellites,230  persistant à travers les pages.231- **Routeur History API** — SPA vanilla sans framework ; navigation interne232  interceptée (`a[data-link]`), scroll remis à zéro à chaque page.233- **Exports** — chaque graphique offre **CSV** (données exactes) et **PNG**234  (rendu du SVG), plus « Ouvrir dans le Studio » pour les séries temporelles.235- **Footer d'écosystème** — avis d'agrégateur (« nous ne vendons rien, ne236  louons rien »), liens vers toutes les plateformes et Groupe-KA.com.237- **Analytics maison** — beacon `ka-a.js` d'administration-ka.com238  (`__kaSite = "ka-stats"`), trafic humain seulement.239240---241242## Le contrat ka-stats v2 et son rendu générique243244La fiche `/site/:id` ne connaît **aucune plateforme en particulier** : elle245rend ce que le dashboard v2 déclare, bloc par bloc. Types de blocs pris en246charge :247248| Bloc v2 | Rendu Ka·Stats |249|---|---|250| `kpis[]` | Cartes KPI (valeur, unité, delta %) + **sparkline** si fournie |251| `gauges[]` | **Jauges** (arc SVG) |252| `series[]` | Séries temporelles — ligne/aire/barres commutables, courbe fantôme « période précédente » en tireté si `compare` est fourni |253| `multiseries[]` | **Multi-courbes** (≤ 4 sous-séries, motifs de trait distincts pour l'accessibilité) |254| `stacked[]` | Aires/barres **empilées** |255| `breakdowns[]` | Répartitions — **barres horizontales ↔ anneau** commutables |256| `histograms[]` | **Histogrammes** de distribution |257| `geo[]` | Répartitions **géographiques** (barres par région) |258| `heatmap_calendar` / `heatmap_hours` | **Heatmaps** calendrier (jour × semaine) et horaire (heure × jour) |259| `tables[]` | Tableaux **triables, filtrables, paginés** |260| `records[]` | Cartes de records / faits marquants |261262L'enveloppe `{success, data}` propre à API·Ka est **dépliée automatiquement**263côté serveur — le front ne voit qu'un seul format.264265---266267## QCharts — graphiques SVG maison268269`public/charts.js` (~1 000 lignes) : bibliothèque de graphiques **SVG270vanilla**, zéro dépendance, conforme au design system ka-ui et aux règles271dataviz du groupe :272273- marques fines (traits 2 px), grilles *hairline*, texte toujours en encre,274  palette catégorielle validée en ordre fixe (`Q.CAT`), rampes mono-teinte,275  motifs de trait (`Q.DASHES`) pour distinguer les séries sans dépendre de la276  couleur seule ;277- **crosshair + infobulle toutes-séries** sur les lignes, infobulle par-marque278  sur barres et cellules ;279- **zoom par sélection horizontale** (glisser sur le graphique), bandeau de280  zoom avec bouton « Réinitialiser », **double-clic = réinitialiser** ;281- **légende cliquable** dès 2 séries pour masquer/afficher chaque série ;282- **vue tableau jumelle sur chaque graphique** (l'infobulle ne « garde »283  jamais une valeur : les données exactes sont toujours à un clic) ;284- exports **CSV** et **PNG** intégrés à la coquille de carte (`switchableChart`),285  types commutables (ligne ↔ aire ↔ barres, barres ↔ anneau) ;286- primitives : `sparkline`, `lineChart`, `vBarChart`, `hBarChart`, `donut`,287  `stackedBar`, `gauge`, `calendarHeatmap`, `hourHeatmap`.288289---290291## API292293Toutes les routes acceptent `?period=` (`auj|7j|30j|3m|6m|12m|annee|tout`,294défaut `30j`) et, pour une plage libre, `?from=AAAA-MM-JJ&to=AAAA-MM-JJ`.295296| Route | Rôle |297|---|---|298| `GET /healthz` (alias `/api/health`) | Healthcheck : `{ok, app, sites, uptime}` |299| `GET /api/sites` | Les 14 plateformes (id, wordmark, domaine, accents, tagline, thème) |300| `GET /api/overview` | Agrégat global : totaux (éléments, plateformes en vie, graphiques), pouls quotidien, KPI et records par plateforme |301| `GET /api/dashboard/:id` | Dashboard v2 complet d'une plateforme (proxy avec cache ; `stale: true` si copie de secours) |302| `GET /api/catalog` | Catalogue des métriques combinables du Studio (248 refs : `site\|kpi\|id`, `site\|series\|id`, `site\|multi\|id\|i`, `site\|stacked\|id\|i`) |303| `GET /api/metric?refs=a,b,…` | Points normalisés de 1 à 4 métriques (label, unité, série `{t,v}`) — le moteur du Studio |304305Exemple :306307```bash308curl -s "https://www.ka-stats.com/api/overview?period=30j" | jq .totals309curl -s "https://www.ka-stats.com/api/metric?refs=lou-ka|kpi|active,food-ka|series|avg_price&period=12m"310```311312---313314## Architecture315316```317navigateur ── SPA vanilla (app.js + charts.js + tokens.css)318    │319server.mjs (Node ≥ 18, zéro dépendance, ~400 lignes)320    │   statique + SSR des metas SEO + API agrégatrice321    ├── cache mémoire par (site, période) — TTL 10 min322    ├── cache disque data/cache.json (périodes standard seulement)323    └── fan-out HTTPS parallèle vers les 14 satellites324        https://<plateforme>/api/stats/dashboard?period=…325```326327- **Zéro dépendance** : `node:http`, `node:fs`, `node:path` — pas de328  `node_modules`, pas de build, pas de base de données.329- **Cache 10 min + *stale-while-error*** : chaque couple (site, période) est330  mis en cache 10 minutes (mémoire + disque). Si un satellite est injoignable,331  Ka·Stats sert **la dernière bonne copie** (marquée `stale: true`) au lieu332  d'échouer ; les requêtes concurrentes vers un même satellite sont333  dédupliquées (map *inflight*). Les plages libres (`from/to`) ne sont jamais334  persistées sur disque (cardinalité illimitée).335- **SEO** : SSR léger des metas — title/description/canonical/OpenGraph +336  **JSON-LD** (schema.org) injectés par route dans `index.html` (la SPA rend337  le contenu, le serveur rend les metas — même approche que les autres sites338  Ka). `sitemap.xml` et `robots.txt` servis statiquement. Routes `/site/:id`339  titrées dynamiquement d'après la plateforme.340- **Sécurité/robustesse** : id de plateforme assaini (`[^a-z0-9-]` retiré),341  périodes validées par liste blanche, dates par regex stricte ; en-têtes342  `Cache-Control` différenciés (HTML `no-cache`, assets 1 h).343344---345346## Structure du dépôt347348```349ka-stats/350├── server.mjs              # serveur Node zéro-dép : statique + API + SEO SSR351├── package.json            # aucune dépendance — script start seulement352├── public/353│   ├── index.html          # coquille SPA (metas remplacées par le serveur)354│   ├── app.js              # SPA vanilla : routeur, 6 pages, Studio, header/footer355│   ├── charts.js           # QCharts — graphiques SVG maison (voir plus haut)356│   ├── styles.css          # styles Ka·Stats (sur les tokens ka-ui)357│   ├── tokens.css          # design system ka-ui vendorisé + accent #095797358│   ├── fonts/              # Space Grotesk + JetBrains Mono (auto-hébergées)359│   ├── favicon.svg · og.png · apple-touch-icon.png360│   └── sitemap.xml · robots.txt361├── data/362│   └── cache.json          # cache disque (généré — ignoré par git)363└── docs/364    └── screenshots/        # visite guidée (JPG) + mobile/ + desktop/ (webp)365```366367---368369## Exploitation & déploiement370371```bash372node server.mjs 8140          # défaut 8140 — healthcheck : /healthz373```374375- **Production** : nœud **M1M32** du cluster MacLustr, `~/apps/ka-stats`,376  port **8140**, sous **PM2** (`ka-stats` pour le serveur, `ka-stats-ngrok`377  pour le tunnel) → **https://www.ka-stats.com**.378- PM2 est configuré en service de démarrage (launchd) : l'app survit aux379  redémarrages du nœud.380- Registre des déploiements du cluster :381  `~/Desktop/cluster-skill/cluster-deployments.json`.382- Aucune clé, aucun secret : Ka·Stats ne consomme que les endpoints publics383  des plateformes.384385---386387## Développement remote-first388389La **source de vérité est le repo git sur le nœud de déploiement**390(M1M32 `~/apps/ka-stats`), pas une copie locale. Le remote `origin` est391**spbgit**, le serveur git personnel du groupe (bare repo392`srv/git/ka-stats.git` sur M3U96a, alias SSH `gitsrv`) — pas GitHub.393394Cycle type : éditer sur le nœud via SSH → tester (`curl localhost:8140/healthz`)395→ `pm2 restart ka-stats` → `git add/commit/push origin main` **sur le nœud**396(agent forwarding actif). Référence complète du flux remote-first :397`~/Desktop/cluster-skill/KA-REMOTE-DEV.md`.398399---400401## Écosystème & contact402403Ka·Stats est l'observatoire transversal du **Groupe KA**, l'écosystème de404plateformes de données du Québec (et, pour House·Ka et Rent·Ka, du Canada405hors Québec). **Avis** : Groupe KA est un agrégateur de contenu — nous ne406vendons rien, ne louons rien et ne sommes partie à aucune transaction ; les407statistiques reflètent les données collectées par nos plateformes.408409- Hub : **https://www.groupe-ka.com**410- Données par API : **https://www.api-ka.com**411- Auteur : Simon-Pierre Boucher · contact@spboucher.ai412413© Groupe KA. Tous droits réservés.414