docs: refonte du README (pastilles + captures d écran à jour)
3 changed files +86 −117
modified
README.md
+86 −117
@@ -1,148 +1,117 @@ | ||
| 1 | 1 | <!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai --> |
| 2 | 2 | |
| 3 | −<div align="center"> | |
| 3 | +# Groupe·Ka | |
| 4 | 4 | |
| 5 | −# Groupe Ka — le hub de l'écosystème & le KA ID | |
| 5 | +**Le portail corporatif de l'écosystème ·Ka : la vitrine des 13 plateformes québécoises du groupe et le compte unique (KA ID) qui les relie toutes.** | |
| 6 | 6 | |
| 7 | −**Portail de l'écosystème ·Ka : le site vitrine qui fédère les 12 plateformes québécoises du groupe, et le compte unique (KA ID) qui les relie toutes.** | |
| 7 | +[](https://www.groupe-ka.com) | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 8 | 11 | |
| 9 | −[](https://www.groupe-ka.com) | |
| 10 | −[](https://nextjs.org) | |
| 11 | −[](https://react.dev) | |
| 12 | −[](https://www.typescriptlang.org) | |
| 13 | −[](https://tailwindcss.com) | |
| 14 | −[](https://sqlite.org) | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 15 | 17 | |
| 16 | −[](#-authentification) | |
| 17 | −[](#-authentification) | |
| 18 | −[-d9f26b?style=flat-square)](#-authentification) | |
| 19 | −[](#-authentification) | |
| 20 | −[](#-fonctionnalités-principales) | |
| 18 | +**Groupe·Ka** ([www.groupe-ka.com](https://www.groupe-ka.com)) est le **hub central de l'écosystème ·Ka**. Il joue trois rôles : la **vitrine du groupe** (présentation des plateformes québécoises, métriques live tirées en direct des `/api/stats` de chaque site, pages corporatives `/agents`, `/investisseurs`, `/telecharger`, `/marque`) ; le **KA ID**, l'identité centrale du groupe — un seul compte (courriel + mot de passe, Google, Apple) et un `ka_id` partagé par toutes les plateformes via un **SSO maison** ; et une **tour de contrôle publique** — pages `/status` (disponibilité des 12 sites, historique 90 jours, ticks aux 5 min) et `/stats` (tableau de bord maître consolidé). | |
| 21 | 19 | |
| 22 | −[](#-sso--un-compte-douze-plateformes) | |
| 23 | −[](#-routes) | |
| 24 | −[](#-routes) | |
| 25 | −[](#-déploiement) | |
| 26 | −[](#-auteur) | |
| 20 | +Pour qui ? Les visiteurs qui découvrent le groupe, les membres qui gèrent leur compte KA ID (profil, favoris « Mon univers Ka », carte de membre, jeton API personnel), et les investisseurs (dossier corporatif PDF). | |
| 27 | 21 | |
| 28 | −</div> | |
| 22 | +## Captures d'écran | |
| 29 | 23 | |
| 30 | − | |
| 24 | +<p align="center"> | |
| 25 | + <img src="docs/screenshots/groupe-ka-desktop.png" width="640" alt="Accueil — desktop"> | |
| 26 | + <img src="docs/screenshots/groupe-ka-mobile.png" width="200" alt="Accueil — mobile"> | |
| 27 | +</p> | |
| 31 | 28 | |
| 32 | −--- | |
| 33 | − | |
| 34 | −## 📖 Description | |
| 35 | − | |
| 36 | −**Groupe Ka** est le **hub central de l'écosystème ·Ka** — [**www.groupe-ka.com**](https://www.groupe-ka.com). Il joue trois rôles : | |
| 37 | − | |
| 38 | −1. **Vitrine du groupe** : présentation des **12 plateformes québécoises** de l'écosystème, avec **métriques live** (ticker, cartes plateformes, équation, socle) tirées en direct des `/api/stats` de chaque site (**ISR 10 min**, replis). | |
| 39 | −2. **KA ID** : l'**identité centrale** du groupe (**SSO maison**) — un seul compte (**courriel + mot de passe**, **Google**, **Apple**) et un **`ka_id` partagé** par toutes les plateformes. | |
| 40 | −3. **Tour de contrôle publique** : pages **`/status`** (disponibilité des 12 sites, historique **90 jours**, ticks aux **5 min**) et **`/stats`** (tableau de bord maître, consolidation live de l'écosystème). | |
| 29 | +## Fonctionnalités | |
| 41 | 30 | |
| 42 | −## ✨ Fonctionnalités principales | |
| 31 | +- **KA ID** — identifiant membre unique (`ka-` + 10 chiffres) créé au hub, source de vérité de tout le groupe. | |
| 32 | +- **Trois modes de connexion** : Google OAuth 2.0, Sign in with Apple, courriel + mot de passe (scrypt natif Node, zéro dépendance). | |
| 33 | +- **SSO maison** vers les 12 plateformes + l'app iOS native (`ka-ios`) — jeton JWT signé par plateforme, valide 5 min (`/sso/authorize?client=<plateforme>`). | |
| 34 | +- **Profil enrichi** (bio, ville, réseaux sociaux, rôle) affiché par toutes les plateformes, avec page publique `/u/[kaId]`. | |
| 35 | +- **Favoris unifiés « Mon univers Ka »** — magasin central ; les plateformes poussent et lisent via `/api/sso/favorites`. | |
| 36 | +- **Carte de membre** avec QR code + passe **Apple Wallet** signée (`/api/wallet/pass`). | |
| 37 | +- **Jeton API personnel** (`kapi_`) généré depuis `/compte` pour l'API·Ka. | |
| 38 | +- **Page `/status`** — état des sites vérifié en direct + historique de disponibilité 90 jours (`data/status/history.jsonl`, ticks aux 5 min), uptime 24 h / 7 j / 30 j. | |
| 39 | +- **Page `/stats`** — consolidation live des métriques de l'écosystème + rapports PDF personnalisés (`/rapports`, catalogue et ReportBuilder). | |
| 40 | +- **Pages corporatives** : `/agents` (agents gardiens ka2/ka4/ka6), `/investisseurs` (dossier PDF), `/telecharger` (apps iOS/Android/macOS), `/avis`, `/bots`, `/marque`. | |
| 41 | +- **Conformité** : `/loi-25`, `/conditions`, `/confidentialite`, `/retrait` (droit de retrait des données). | |
| 42 | +- **KA Agent** — bulle de chat IA du groupe (`public/ka-agent.js`) câblée sur toutes les pages. | |
| 43 | +- **ka-ui vendoré** (`src/ka/` + `ecosystem.json`) — design system, accents officiels et footer partagés de l'écosystème. | |
| 43 | 44 | |
| 44 | −- 🪪 **KA ID** — identifiant membre unique (**`ka-` + 10 chiffres**) créé au hub, **source de vérité** de tout le groupe. | |
| 45 | −- 🔑 **Trois modes de connexion** : **Google OAuth 2.0**, **Sign in with Apple**, **courriel + mot de passe** (**scrypt natif**, zéro dépendance). | |
| 46 | −- 🛰 **SSO maison** vers les **12 plateformes** + l'app **iOS native** (`ka-ios`) — jeton **JWT signé par plateforme, 5 min**. | |
| 47 | −- 👤 **Profil enrichi** (bio, ville, réseaux sociaux, rôle…) affiché par toutes les plateformes, avec page publique **`/u/[kaId]`**. | |
| 48 | −- ⭐ **Favoris unifiés** « Mon univers Ka » — magasin central, les plateformes poussent/lisent via **`/api/sso/favorites`**. | |
| 49 | −- 💳 **Carte de membre** avec QR code + passe **Apple Wallet** signée (**`/api/wallet/pass`**). | |
| 50 | −- 📈 **Métriques live** de l'écosystème (`src/lib/live.ts`) et **page `/stats`** — consolidation en direct des **12 plateformes**. | |
| 51 | −- 🟢 **Page `/status`** — état des sites vérifié en direct + **historique de disponibilité 90 jours** (`data/status/history.jsonl`, ticks aux **5 min** via cron PM2 **`groupe-ka-status-tick`**), uptime **24 h / 7 j / 30 j**. | |
| 52 | −- 🤖 **KA Agent** — bulle de chat IA du groupe (`public/ka-agent.js`) câblée sur toutes les pages. | |
| 53 | −- ⚖️ **Conformité** : pages **`/loi-25`**, **`/conditions`**, **`/confidentialite`**, **`/retrait`** (droit de retrait des données). | |
| 54 | −- 📱 **Menu mobile 100 % CSS** (case à cocher + `peer`, zéro JS) et icône compte directe dans le header. | |
| 55 | −- 🎨 **ka-ui vendoré** (`src/ka/` + **`ecosystem.json`**) — design system, accents officiels et footer partagés de l'écosystème. | |
| 45 | +## Architecture | |
| 56 | 46 | |
| 57 | −## 🛰 SSO — un compte, douze plateformes | |
| 47 | +- **Next.js 16 (App Router, Turbopack) + React 19 + TypeScript 5 + Tailwind CSS 4** — pages et API dans `src/app/`. | |
| 48 | +- **SQLite (better-sqlite3, mode WAL)** dans `data/` — comptes, profils, favoris ; zéro serveur de base de données. | |
| 49 | +- **jose** pour les JWT/JWKS (sessions HS256 en témoin HttpOnly `ka_session` 30 jours ; vérification des `id_token` Google par JWKS ; `client_secret` Apple signé ES256 à la volée). | |
| 50 | +- **sharp** (avatars), **qrcode** (carte de membre), **pdfkit** (rapports). | |
| 51 | +- Bibliothèques internes : `src/lib/` (`auth.ts`, `sso.ts`, `db.ts`, `live.ts`, `ecostats.ts`, `status.ts`). | |
| 58 | 52 | |
| 59 | −`/sso/authorize?client=<plateforme>` émet un **JWT (5 min)** signé avec le **secret partagé** de la plateforme. Clients enregistrés (`src/lib/sso.ts`) : | |
| 53 | +Processus PM2 sur le nœud : | |
| 60 | 54 | |
| 61 | −[**Trouve·Ka**](https://www.trouve-ka.com) · [**Lou·Ka**](https://www.lou-ka.com) · [**Immo·Ka**](https://www.immo-ka.com) · [**Vrai-Prix**](https://www.vrai-prix.com) · [**Auto·Ka**](https://www.auto-ka.com) · [**Fabri·Ka**](https://www.fabri-ka.com) · [**Food·Ka**](https://www.food-ka.com) · [**Resto·Ka**](https://www.resto-ka.com) · [**Sorti·Ka**](https://www.sorti-ka.com) · [**Créa·Ka**](https://www.crea-ka.com) · [**API·Ka**](https://www.api-ka.com) · [**Job·Ka**](https://www.job-ka.com) | |
| 62 | − | |
| 63 | −… plus le client **`ka-ios`** (app iOS native du groupe, redirection `ka-ios://auth`). | |
| 64 | − | |
| 65 | −## 🔐 Authentification | |
| 66 | − | |
| 67 | −| Mode | Détails | | |
| 68 | −|---|---| | |
| 69 | −| **Google** | OAuth 2.0 code flow, `id_token` vérifié par **JWKS** (`jose`), liaison par `google_sub` puis courriel | | |
| 70 | −| **Apple** | Sign in with Apple, retour `form_post`, `client_secret` = **JWT ES256** signé à la volée avec la clé `.p8`, liaison par `apple_sub` | | |
| 71 | −| **Courriel** | **scrypt natif** Node (`crypto.scryptSync`), comparaison à temps constant | | |
| 72 | −| **Sessions** | **JWT HS256** (`jose`) en témoin HttpOnly **`ka_session`**, **30 jours** | | |
| 73 | − | |
| 74 | −## 🗂 Routes | |
| 75 | − | |
| 76 | −**Pages (14)** : `/` · `/connexion` · `/compte` · `/compte/carte` · `/u/[kaId]` · `/m/[kaId]` · `/stats` · `/status` · `/avis` · `/bots` · `/retrait` · `/loi-25` · `/conditions` · `/confidentialite` | |
| 77 | − | |
| 78 | −**API (20 routes)** : | |
| 79 | − | |
| 80 | −| Groupe | Routes | | |
| 55 | +| Processus | Rôle | | |
| 81 | 56 | |---|---| |
| 82 | −| Auth | `/api/auth/{login,register,logout,me}` · `/api/auth/{google,apple}` · `/api/auth/callback/{google,apple}` | | |
| 83 | −| Profil | `/api/profile` · `/api/profile/{role,public,avatar}` | | |
| 84 | −| SSO | `/sso/authorize` · `/api/sso/{profile,favorites}` | | |
| 85 | −| Statut | `/api/status/tick` (cron PM2, 5 min) | | |
| 86 | −| Divers | `/api/favorites` · `/api/wallet/pass` · `/api/health` | | |
| 87 | − | |
| 88 | −## 🧱 Stack technique | |
| 57 | +| `groupe-ka` | serveur Next.js de production sur le port **8110** | | |
| 58 | +| `groupe-ka-ngrok` | tunnel ngrok vers **www.groupe-ka.com** | | |
| 89 | 59 | |
| 90 | −**Next.js 16.3** (App Router, **Turbopack**) · **React 19.2** · **TypeScript 5** · **Tailwind CSS 4** · **better-sqlite3** (SQLite **WAL**, zéro serveur) · **jose** (JWT/JWKS) · **sharp** (avatars) · **qrcode** (carte de membre) — **7 dépendances de prod** seulement. | |
| 60 | +Un cron PM2 (`groupe-ka-status-tick`, `scripts/status-tick.sh`) alimente l'historique de disponibilité toutes les 5 minutes. | |
| 91 | 61 | |
| 92 | −## 📁 Structure du projet | |
| 62 | +## Structure du repo | |
| 93 | 63 | |
| 94 | 64 | ``` |
| 95 | 65 | groupe-ka/ |
| 96 | −├── src/ | |
| 97 | −│ ├── app/ # App Router : pages + API (compte, connexion, sso, stats, status, u/[kaId]…) | |
| 98 | −│ ├── ka/ # ka-ui vendoré + ecosystem.json (13 sites, accents, footer partagé) | |
| 99 | −│ └── lib/ # auth.ts, sso.ts, db.ts, live.ts, ecostats.ts, status.ts, roles.ts | |
| 100 | −├── public/ # favicon, og.png, ka-agent.js (widget IA), documents | |
| 101 | −├── assets/ # captures d'écran historiques | |
| 102 | −├── data/ # SQLite (WAL) + status/history.jsonl (90 j) | |
| 103 | −├── scripts/ # status-tick.sh (tick de disponibilité, cron PM2) | |
| 104 | −└── docs/ # screenshot.png (aperçu du README) | |
| 105 | −``` | |
| 106 | − | |
| 107 | −## 🚀 Démarrage local | |
| 108 | − | |
| 109 | −```bash | |
| 110 | −npm install | |
| 111 | −npm run dev # développement (http://localhost:3000) | |
| 112 | −npm run build # build de production | |
| 113 | −npm start # sert le build | |
| 114 | −npm run lint # eslint | |
| 66 | +├── src/ # app/ (App Router : pages + API), ka/ (ka-ui vendoré + ecosystem.json), lib/ (auth, sso, db, live…) | |
| 67 | +├── public/ # favicon, og.png, ka-agent.js (widget IA), documents publics | |
| 68 | +├── assets/ # captures d'écran historiques | |
| 69 | +├── data/ # SQLite (WAL) + status/history.jsonl (90 jours) — gitignoré | |
| 70 | +├── scripts/ # status-tick.sh (tick de disponibilité) + rapport-quotidien | |
| 71 | +└── docs/ # captures d'écran du README | |
| 115 | 72 | ``` |
| 116 | 73 | |
| 117 | −Variables d'environnement : `BASE_URL`, `KA_AUTH_SECRET`, `GOOGLE_CLIENT_ID/SECRET`, `APPLE_CLIENT_ID/TEAM_ID/KEY_ID/PRIVATE_KEY`, `KA_SSO_SECRET_*` (une par plateforme), `KA_PASS_*` (Apple Wallet), `KA_DB_PATH`. | |
| 74 | +## Développement (remote-first) | |
| 118 | 75 | |
| 119 | −## ☁️ Déploiement | |
| 76 | +**La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/groupe-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, redémarrage, puis commit/push depuis le nœud. | |
| 120 | 77 | |
| 121 | −En production sur le nœud **M3U96b** du cluster MacLustr, **port 8110**, exposé via un tunnel **ngrok** → [**www.groupe-ka.com**](https://www.groupe-ka.com). | |
| 122 | − | |
| 123 | −Processus **PM2** (auto-restart) : | |
| 124 | − | |
| 125 | −| Processus | Rôle | | |
| 126 | −|---|---| | |
| 127 | −| **`groupe-ka`** | l'app Next.js (`next start`, port **8110**) | | |
| 128 | −| **`groupe-ka-ngrok`** | le tunnel **ngrok** vers **www.groupe-ka.com** | | |
| 129 | −| **`groupe-ka-status-tick`** | cron **5 min** — tick de disponibilité (`/api/status/tick`) | | |
| 78 | +- Remote `origin` = **spbgit** (git perso [git.spboucher.ai](https://git.spboucher.ai), bare repos sur M3U96a). **Pas GitHub.** | |
| 79 | +- L'agent forwarding SSH est actif : le `git push origin main` fonctionne pendant une session SSH depuis le laptop. | |
| 130 | 80 | |
| 131 | −## 🛠 Développement remote-first (IMPORTANT) | |
| 132 | − | |
| 133 | −La **source de vérité** est le **repo git sur le nœud M3U96b** (`~/apps/groupe-ka`), **pas** une copie laptop. Tout se fait **via SSH** : édition, build, `pm2 restart groupe-ka`, puis commit/push **sur le nœud**. | |
| 134 | − | |
| 135 | −- `origin` = **spbgit** (git perso **git.spboucher.ai**), alias SSH **`gitsrv`** → `gitsrv:srv/git/groupe-ka.git` — **pas GitHub**. | |
| 136 | −- Le push fonctionne grâce à l'**agent forwarding** pendant une session SSH depuis le laptop. | |
| 81 | +```bash | |
| 82 | +npm install | |
| 83 | +npm run dev # développement | |
| 84 | +npm run build # build de production | |
| 85 | +npm start # sert le build | |
| 86 | +npm run lint # eslint | |
| 137 | 87 | |
| 138 | −## 👤 Auteur | |
| 88 | +pm2 restart groupe-ka # après un changement en production | |
| 89 | +``` | |
| 139 | 90 | |
| 140 | −**Simon-Pierre Boucher** — [contact@spboucher.ai](mailto:contact@spboucher.ai) · © 2026 Groupe KA | |
| 91 | +## Déploiement | |
| 92 | + | |
| 93 | +- **Nœud** : M3U96b (Mac Studio, cluster MacLustr) — répertoire `~/apps/groupe-ka` | |
| 94 | +- **Port** : **8110** (local, exposé uniquement via le tunnel) | |
| 95 | +- **Processus PM2** : `groupe-ka` (serveur Next.js) + `groupe-ka-ngrok` (tunnel) | |
| 96 | +- **Domaine** : **https://www.groupe-ka.com** (tunnel ngrok) | |
| 97 | + | |
| 98 | +## Écosystème Groupe KA | |
| 99 | + | |
| 100 | +- [groupe-ka.com](https://www.groupe-ka.com) — portail du groupe et compte unique KA ID *(ce repo)* | |
| 101 | +- [lou-ka.com](https://www.lou-ka.com) — logements à louer | |
| 102 | +- [immo-ka.com](https://www.immo-ka.com) — propriétés à vendre | |
| 103 | +- [vrai-prix.com](https://www.vrai-prix.com) — estimation immobilière | |
| 104 | +- [auto-ka.com](https://www.auto-ka.com) — véhicules | |
| 105 | +- [fabri-ka.com](https://www.fabri-ka.com) — produits québécois | |
| 106 | +- [food-ka.com](https://www.food-ka.com) — épicerie et alimentation | |
| 107 | +- [resto-ka.com](https://www.resto-ka.com) — restaurants | |
| 108 | +- [sorti-ka.com](https://www.sorti-ka.com) — sorties et événements | |
| 109 | +- [job-ka.com](https://www.job-ka.com) — emplois | |
| 110 | +- [crea-ka.com](https://www.crea-ka.com) — créateurs de contenu | |
| 111 | +- [trouve-ka.com](https://www.trouve-ka.com) — petites annonces | |
| 112 | +- [api-ka.com](https://www.api-ka.com) — API de données | |
| 141 | 113 | |
| 142 | 114 | --- |
| 143 | 115 | |
| 144 | −<div align="center"> | |
| 145 | − | |
| 146 | −Un service **Groupe Ka** | |
| 147 | − | |
| 148 | −</div> | |
| 116 | +© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai | |
| 117 | +Ce repo vit sur **spbgit** ([git.spboucher.ai](https://git.spboucher.ai)). | |
added
docs/screenshots/groupe-ka-desktop.png
+0 −0
Binary file not shown.
added
docs/screenshots/groupe-ka-mobile.png
+0 −0
Binary file not shown.