SPB Git forge

spb/groupe-ka

Public

Groupe KA — site du holding + KA ID (compte unique & SSO des 7 plateformes). Next.js 16, SQLite, Google & Apple login.

81commits 1branches 0releases
89.2 MBsize
maindefault branch
22 days agolast push
TypeScript 70.4% HTML 18.4% JavaScript 4% Python 3.8% CSS 3.4%

docs: refonte du README (pastilles + captures d écran à jour)

Simon-Pierre Boucher committed 1 mo ago (Aug 24, 2026) parent 8ecd86a

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 +[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.groupe-ka.com&style=flat-square&label=www.groupe-ka.com)](https://www.groupe-ka.com)
8 +![Nœud](https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square)
9 +![Port](https://img.shields.io/badge/port-8110-141814?style=flat-square)
10 +![PM2](https://img.shields.io/badge/process-PM2-2b037a?style=flat-square)
8 11
9 −[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.groupe-ka.com&up_message=en%20ligne&down_message=hors%20ligne&label=groupe-ka.com&style=flat-square)](https://www.groupe-ka.com)
10 −[![Next.js](https://img.shields.io/badge/Next.js-16.3-000000?style=flat-square&logo=nextdotjs&logoColor=white)](https://nextjs.org)
11 −[![React](https://img.shields.io/badge/React-19.2-087EA4?style=flat-square&logo=react&logoColor=white)](https://react.dev)
12 −[![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org)
13 −[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
14 −[![SQLite](https://img.shields.io/badge/SQLite-WAL-003B57?style=flat-square&logo=sqlite&logoColor=white)](https://sqlite.org)
12 +![Next.js](https://img.shields.io/badge/Next.js-16-000000?style=flat-square&logo=nextdotjs&logoColor=white)
13 +![React](https://img.shields.io/badge/React-19-087EA4?style=flat-square&logo=react&logoColor=white)
14 +![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?style=flat-square&logo=typescript&logoColor=white)
15 +![SQLite](https://img.shields.io/badge/SQLite-WAL-003B57?style=flat-square&logo=sqlite&logoColor=white)
16 +![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square)
15 17
16 −[![Google OAuth](https://img.shields.io/badge/Connexion-Google_OAuth_2.0-4285F4?style=flat-square&logo=google&logoColor=white)](#-authentification)
17 −[![Sign in with Apple](https://img.shields.io/badge/Connexion-Sign_in_with_Apple-000000?style=flat-square&logo=apple&logoColor=white)](#-authentification)
18 −[![JWT](https://img.shields.io/badge/Sessions-JWT_HS256_(jose)-d9f26b?style=flat-square)](#-authentification)
19 −[![scrypt](https://img.shields.io/badge/Mots_de_passe-scrypt_natif-1c5c41?style=flat-square)](#-authentification)
20 −[![Apple Wallet](https://img.shields.io/badge/Carte_membre-Apple_Wallet-999999?style=flat-square&logo=apple&logoColor=white)](#-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 −[![Plateformes SSO](https://img.shields.io/badge/SSO-12_plateformes_+_iOS-1c5c41?style=flat-square)](#-sso--un-compte-douze-plateformes)
23 −[![Routes API](https://img.shields.io/badge/API-20_routes-141814?style=flat-square)](#-routes)
24 −[![Pages](https://img.shields.io/badge/Pages-14-141814?style=flat-square)](#-routes)
25 −[![PM2](https://img.shields.io/badge/Prod-PM2_+_ngrok-2B037A?style=flat-square&logo=pm2&logoColor=white)](#-déploiement)
26 −[![Licence](https://img.shields.io/badge/©_2026-Simon--Pierre_Boucher-d9f26b?style=flat-square)](#-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 −![Aperçu de Groupe Ka](docs/screenshot.png)
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.