docs: README à jour avec screenshot
2 changed files +85 −47
modified
README.md
+85 −47
@@ -2,9 +2,9 @@ | ||
| 2 | 2 | |
| 3 | 3 | <div align="center"> |
| 4 | 4 | |
| 5 | −# Groupe KA — le hub & le KA ID | |
| 5 | +# Groupe Ka — le hub de l'écosystème & le KA ID | |
| 6 | 6 | |
| 7 | −**Site vitrine du holding + compte unique (KA ID) pour les sept plateformes du groupe.** | |
| 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.** | |
| 8 | 8 | |
| 9 | 9 | [](https://www.groupe-ka.com) |
| 10 | 10 | [](https://nextjs.org) |
@@ -17,94 +17,132 @@ | ||
| 17 | 17 | [](#-authentification) |
| 18 | 18 | [-d9f26b?style=flat-square)](#-authentification) |
| 19 | 19 | [](#-authentification) |
| 20 | −[](#-fonctionnalités) | |
| 20 | +[](#-fonctionnalités-principales) | |
| 21 | 21 | |
| 22 | −[](#-sso--un-compte-sept-plateformes) | |
| 23 | −[](#-routes) | |
| 24 | −[](#-routes) | |
| 25 | −[](#-métriques) | |
| 22 | +[](#-sso--un-compte-douze-plateformes) | |
| 23 | +[](#-routes) | |
| 24 | +[](#-routes) | |
| 26 | 25 | [](#-déploiement) |
| 27 | 26 | [](#-auteur) |
| 28 | 27 | |
| 29 | 28 | </div> |
| 30 | 29 | |
| 30 | + | |
| 31 | + | |
| 31 | 32 | --- |
| 32 | 33 | |
| 33 | −## 📸 Aperçu | |
| 34 | +## 📖 Description | |
| 34 | 35 | |
| 35 | −| Accueil | Connexion (KA ID) | | |
| 36 | −|:---:|:---:| | |
| 37 | −|  |  | | |
| 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 : | |
| 38 | 37 | |
| 39 | −<div align="center"> | |
| 40 | −<img src="assets/screenshots/mobile.png" alt="Vue mobile — icône compte directement dans le header" width="260"> | |
| 41 | −</div> | |
| 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). | |
| 42 | 41 | |
| 43 | −## ✨ Fonctionnalités | |
| 42 | +## ✨ Fonctionnalités principales | |
| 44 | 43 | |
| 45 | −- 🪪 **KA ID** — identifiant membre unique (`ka-` + 10 chiffres) créé au hub, source de vérité du groupe. | |
| 46 | −- 🔑 **Trois modes de connexion** : Google OAuth 2.0, Sign in with Apple, courriel + mot de passe (scrypt natif, zéro dépendance). | |
| 47 | −- 🛰 **SSO maison** vers les 7 plateformes (jeton JWT signé par plateforme, 5 min). | |
| 48 | −- 👤 **Profil enrichi** (bio, ville, réseaux sociaux, rôle…) affiché par toutes les plateformes, avec page publique `/u/[kaId]`. | |
| 49 | −- ⭐ **Favoris unifiés** « Mon univers Ka » — magasin central, les plateformes poussent/lisent via `/api/sso/favorites`. | |
| 50 | −- 💳 **Carte de membre** avec QR code + passe **Apple Wallet** signée (`/api/wallet/pass`). | |
| 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). | |
| 51 | 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. | |
| 56 | + | |
| 57 | +## 🛰 SSO — un compte, douze plateformes | |
| 52 | 58 | |
| 53 | −## 📊 Métriques | |
| 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`) : | |
| 54 | 60 | |
| 55 | −| Métrique | Valeur | | |
| 56 | −|---|---:| | |
| 57 | −| Lignes TypeScript / TSX | ~5 400 | | |
| 58 | −| CSS (design system maison) | ~850 lignes | | |
| 59 | −| Routes API | **17** | | |
| 60 | −| Pages | **8** | | |
| 61 | −| Plateformes SSO servies | **7** | | |
| 62 | −| Dépendances de prod | **7** seulement | | |
| 63 | −| Base de données | SQLite (WAL), zéro serveur | | |
| 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 | 64 | |
| 65 | 65 | ## 🔐 Authentification |
| 66 | 66 | |
| 67 | 67 | | Mode | Détails | |
| 68 | 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 | −## 🛰 SSO — un compte, sept plateformes | |
| 75 | − | |
| 76 | −`/sso/authorize?client=<plateforme>` émet un JWT (5 min) signé avec le secret partagé de la plateforme : | |
| 77 | −[Lou·Ka](https://www.lou-ka.com) · [Immo·Ka](https://www.immo-ka.com) · [Vrai-Prix](https://www.vrai-prix.com) · [ValoPlex](https://www.valoplex.com) · [Auto·Ka](https://www.auto-ka.com) · [Fabri·Ka](https://www.fabri-ka.com) · [Food·Ka](https://www.food-ka.com) | |
| 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** | | |
| 78 | 73 | |
| 79 | 74 | ## 🗂 Routes |
| 80 | 75 | |
| 81 | −**Pages** : `/` · `/connexion` · `/compte` · `/compte/carte` · `/u/[kaId]` · `/m/[kaId]` · `/conditions` · `/confidentialite` | |
| 76 | +**Pages (14)** : `/` · `/connexion` · `/compte` · `/compte/carte` · `/u/[kaId]` · `/m/[kaId]` · `/stats` · `/status` · `/avis` · `/bots` · `/retrait` · `/loi-25` · `/conditions` · `/confidentialite` | |
| 82 | 77 | |
| 83 | −**API** : | |
| 78 | +**API (20 routes)** : | |
| 84 | 79 | |
| 85 | 80 | | Groupe | Routes | |
| 86 | 81 | |---|---| |
| 87 | 82 | | Auth | `/api/auth/{login,register,logout,me}` · `/api/auth/{google,apple}` · `/api/auth/callback/{google,apple}` | |
| 88 | 83 | | Profil | `/api/profile` · `/api/profile/{role,public,avatar}` | |
| 89 | 84 | | SSO | `/sso/authorize` · `/api/sso/{profile,favorites}` | |
| 85 | +| Statut | `/api/status/tick` (cron PM2, 5 min) | | |
| 90 | 86 | | Divers | `/api/favorites` · `/api/wallet/pass` · `/api/health` | |
| 91 | 87 | |
| 92 | −## 🧱 Stack | |
| 88 | +## 🧱 Stack technique | |
| 93 | 89 | |
| 94 | −**Next.js 16 (App Router, Turbopack)** · **React 19** · **TypeScript 5** · **Tailwind CSS 4** · **better-sqlite3** (WAL) · **jose** (JWT/JWKS) · **sharp** (avatars) · **qrcode** (carte de membre) | |
| 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. | |
| 95 | 91 | |
| 96 | −## 🚀 Déploiement | |
| 92 | +## 📁 Structure du projet | |
| 93 | + | |
| 94 | +``` | |
| 95 | +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 | |
| 97 | 108 | |
| 98 | 109 | ```bash |
| 110 | +npm install | |
| 99 | 111 | npm run dev # développement (http://localhost:3000) |
| 100 | 112 | npm run build # build de production |
| 101 | 113 | npm start # sert le build |
| 114 | +npm run lint # eslint | |
| 102 | 115 | ``` |
| 103 | 116 | |
| 104 | −En production : nœud **M3U96b** du cluster MacLustr, **PM2** (auto-restart) + tunnel **ngrok** → [www.groupe-ka.com](https://www.groupe-ka.com). | |
| 105 | − | |
| 106 | 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`. |
| 107 | 118 | |
| 119 | +## ☁️ Déploiement | |
| 120 | + | |
| 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`) | | |
| 130 | + | |
| 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. | |
| 137 | + | |
| 108 | 138 | ## 👤 Auteur |
| 109 | 139 | |
| 110 | 140 | **Simon-Pierre Boucher** — [contact@spboucher.ai](mailto:contact@spboucher.ai) · © 2026 Groupe KA |
| 141 | + | |
| 142 | +--- | |
| 143 | + | |
| 144 | +<div align="center"> | |
| 145 | + | |
| 146 | +Un service **Groupe Ka** | |
| 147 | + | |
| 148 | +</div> | |
added
docs/screenshot.png
+0 −0
Binary file not shown.