SPB Git forge

spb/crea-ka

Public

Créa·Ka — annuaire public cross-plateforme des créateurs de contenu québécois (crea-ka.com)

52commits 1branches 0releases
11.3 MBsize
maindefault branch
19 days agolast push
Python 73.6% HTML 13.2% TypeScript 6% JavaScript 4.5% CSS 1.7% Dockerfile 0.6%

docs: README v3 — chiffres live vérifiés, pastilles dynamiques, sections complètes

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

1 changed file +131 −51

modified README.md +131 −51
@@ -6,23 +6,46 @@
6 6 <h1 align="center">Créa·Ka</h1>
7 7 <p align="center"><b>Les créateurs d'ici, tous leurs liens</b></p>
8 8
9 −<p align="center">
10 − <a href="https://www.crea-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.crea-ka.com&style=flat-square&label=www.crea-ka.com&up_color=7048e8&up_message=en%20ligne" alt="Site"></a>
11 − <a href="https://www.crea-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-7048e8?style=flat-square" alt="Documentation"></a>
12 − <a href="https://www.crea-ka.com/doc/crea-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-7048e8?style=flat-square" alt="PDF"></a>
13 − <img src="https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square" alt="Nœud">
14 − <img src="https://img.shields.io/badge/port-8160-141814?style=flat-square" alt="Port">
15 − <img src="https://img.shields.io/badge/process-PM2-2b037a?style=flat-square" alt="PM2">
16 −</p>
17 −<p align="center">
18 − <img src="https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python">
19 − <img src="https://img.shields.io/badge/FastAPI-API-009688?style=flat-square&logo=fastapi&logoColor=white" alt="FastAPI">
20 − <img src="https://img.shields.io/badge/SQLite-WAL-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite">
21 − <img src="https://img.shields.io/badge/SPA-z%C3%A9ro_build-c9a3ff?style=flat-square" alt="Frontend">
22 − <img src="https://img.shields.io/badge/Groupe-KA-7048e8?style=flat-square" alt="Groupe KA">
23 −</p>
9 +<div align="center">
10 +
11 +<a href="https://www.crea-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.crea-ka.com&style=flat-square&label=www.crea-ka.com&up_color=7048e8&up_message=en%20ligne" alt="Site"></a>
12 +<a href="https://www.crea-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-7048e8?style=flat-square" alt="Documentation"></a>
13 +<a href="https://www.crea-ka.com/doc/crea-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-7048e8?style=flat-square" alt="PDF"></a>
14 +<img src="https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square" alt="Nœud">
15 +<img src="https://img.shields.io/badge/port-8160-141814?style=flat-square" alt="Port">
16 +<img src="https://img.shields.io/badge/PM2-3_processus-2b037a?style=flat-square" alt="PM2">
17 +
18 +</div>
19 +
20 +<div align="center">
21 +
22 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.creators&label=cr%C3%A9ateurs&color=7048e8&style=flat-square" alt="Créateurs (live)">
23 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.accounts&label=comptes%20reli%C3%A9s&color=7048e8&style=flat-square" alt="Comptes reliés (live)">
24 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.by_platform.youtube&label=YouTube&color=7048e8&style=flat-square&logo=youtube&logoColor=white" alt="YouTube (live)">
25 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.by_platform.instagram&label=Instagram&color=7048e8&style=flat-square&logo=instagram&logoColor=white" alt="Instagram (live)">
26 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.by_platform.tiktok&label=TikTok&color=7048e8&style=flat-square&logo=tiktok&logoColor=white" alt="TikTok (live)">
27 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.by_platform.twitch&label=Twitch&color=7048e8&style=flat-square&logo=twitch&logoColor=white" alt="Twitch (live)">
28 +<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.crea-ka.com%2Fapi%2Fstats&query=%24.by_platform.podcast&label=balados&color=7048e8&style=flat-square" alt="Balados (live)">
29 +
30 +</div>
24 31
25 −**Créa·Ka** ([www.crea-ka.com](https://www.crea-ka.com)) est l'**annuaire public, québécois et cross-plateforme des créateurs de contenu** — croisement entre un annuaire cherchable et un « Linktree collectif ». Chaque créateur québécois a **une fiche canonique** qui regroupe **tous ses comptes publics** — Instagram, TikTok, YouTube, Twitch, X, Facebook, Snapchat, Kick, Substack, Patreon, OnlyFans, balado… — chacun avec son URL canonique, ses métriques (abonnés, publications, j'aime, vues, épisodes) et son **score de confiance de rattachement**.
32 +<div align="center">
33 +
34 +<img src="https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python">
35 +<img src="https://img.shields.io/badge/FastAPI-API-009688?style=flat-square&logo=fastapi&logoColor=white" alt="FastAPI">
36 +<img src="https://img.shields.io/badge/SQLite-WAL-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite">
37 +<img src="https://img.shields.io/badge/SPA-z%C3%A9ro_build-c9a3ff?style=flat-square" alt="Frontend">
38 +<img src="https://img.shields.io/badge/pytest-51_tests-0A9EDC?style=flat-square&logo=pytest&logoColor=white" alt="pytest">
39 +<img src="https://img.shields.io/badge/Apify-13_acteurs-97D700?style=flat-square" alt="Apify">
40 +<img src="https://img.shields.io/badge/ngrok-tunnel-1F1E37?style=flat-square&logo=ngrok&logoColor=white" alt="ngrok">
41 +<img src="https://img.shields.io/badge/Groupe-KA-7048e8?style=flat-square" alt="Groupe KA">
42 +<img src="https://img.shields.io/badge/remote--first-spbgit-141814?style=flat-square&logo=git&logoColor=white" alt="remote-first spbgit">
43 +
44 +</div>
45 +
46 +> Les pastilles de la deuxième rangée sont **dynamiques** : elles interrogent en direct `GET /api/stats` du site via shields.io.
47 +
48 +**Créa·Ka** ([www.crea-ka.com](https://www.crea-ka.com)) est l'**annuaire public, québécois et cross-plateforme des créateurs de contenu** — croisement entre un annuaire cherchable et un « Linktree collectif ». **12 791 créateurs** et **18 942 comptes reliés** sur **19 plateformes** (au 2026-08-24). Chaque créateur québécois a **une fiche canonique** qui regroupe **tous ses comptes publics** — Instagram, TikTok, YouTube, Twitch, X, Facebook, Snapchat, Kick, Substack, Patreon, OnlyFans, balado… — chacun avec son URL canonique, ses métriques (abonnés, publications, j'aime, vues, épisodes) et son **score de confiance de rattachement**.
26 49
27 50 Pour qui ? Le public qui découvre des créateurs par niche, région, langue ou taille d'audience ; les créateurs eux-mêmes (fiche, opt-out) ; les marques et médias qui cherchent un annuaire public là où les bases existantes sont payantes, généralistes et anglophones. L'**éthique prime sur tout** : profils publics et professionnels seulement, purge des données privées, opt-out immédiat et persistant, régime restreint des mineurs, conformité Loi 25.
28 51
@@ -51,15 +74,29 @@ Pour qui ? Le public qui découvre des créateurs par niche, région, langue ou
51 74 </tr>
52 75 </table>
53 76
77 +## Chiffres clés (live, au 2026-08-24)
78 +
79 +| Métrique | Valeur | Source |
80 +|---|---|---|
81 +| Créateurs publiés | **12 791** | `GET /api/stats` → `creators` |
82 +| Comptes reliés | **18 942** | `GET /api/stats` → `accounts` |
83 +| Plateformes avec comptes | **19** (YouTube 9 990 · Instagram 3 374 · Facebook 1 543 · TikTok 995 · X 854 · Twitch 612 · balados 273 · OnlyFans 260 · Discord 235 · Spotify 205…) | `by_platform` |
84 +| Niches | **20** | `GET /api/taxonomies` |
85 +| Régions administratives | **17** | `GET /api/taxonomies` |
86 +| Tiers d'audience | nano 11 644 · micro 842 · macro 242 · méga 63 | `by_tier` |
87 +| Connecteurs | **22** (comptés dans `creaka/connectors/`) | code |
88 +| Acteurs Apify maison | **13** (`actors/ka-*`) | code |
89 +| Tests pytest | **51** | `pytest --collect-only` |
90 +
54 91 ## Fonctionnalités
55 92
56 −- **Annuaire filtrable** par niche (20), région (17 régions administratives), langue, plateforme et taille d'audience (nano/micro/macro/méga).
57 −- **Page dédiée par créateur** — `/createur/{id}` avec tous ses liens et métriques.
58 −- **Pages SEO programmatiques** — `/plateformes` + `/plateforme/{p}` rendues en HTML.
93 +- **Annuaire filtrable** par niche (20), région (17 régions administratives), langue (fr/en/bilingue), plateforme et taille d'audience (nano/micro/macro/méga).
94 +- **Page dédiée par créateur** — `/createur/{id}` avec tous ses liens et métriques, bannière héro, **Ka Score /100**, sparkline d'audience et bloc live.
95 +- **Pages SEO programmatiques** — `/plateformes` + `/plateforme/{p}` rendues en HTML, SSR léger des fiches créateur, robots/sitemaps.
59 96 - **Tableau de bord analytique** `/stats` + rapports PDF aux couleurs Groupe KA (catalogue + ReportBuilder).
60 97 - **API publique** — `GET /api/creators` (filtres q/niche/region/langue/plateforme/tier), `/api/creators/{id}`, `/api/stats`, `/api/taxonomies`, `/api/sources`, `POST /api/optout`, `/healthz`.
61 98 - **Connexion « Se connecter avec KA ID »** (SSO du hub groupe-ka.com) + favoris unifiés « Mon univers Ka ».
62 −- **Widget KA Agent** — bulle de chat IA du Groupe KA câblée sur le site.
99 +- **Widget KA Agent** — bulle de chat IA du Groupe KA câblée sur le site (v3 : bulle déplaçable, position mémorisée).
63 100 - **Couverture cumulative** — un watch quotidien relance découverte + enrichissement : nouveaux créateurs, métriques rafraîchies, comptes croisés révélés via les liens de bio et les pages link-in-bio.
64 101 - **Score de confiance** sur chaque rattachement de compte — sous 0.50 → « à vérifier », jamais publié ; fusion des doublons uniquement sur compte fort partagé, **jamais sur le nom** (homonymes).
65 102 - **Opt-out immédiat et persistant** (`/retrait`) : fiche masquée sur-le-champ, liste de suppression `data/optout.json`, jamais ré-agrégée.
@@ -68,21 +105,23 @@ Pour qui ? Le public qui découvre des créateurs par niche, région, langue ou
68 105
69 106 Servis par `creaka/web.py` (FastAPI) sur le port 8160.
70 107
71 −| Endpoint | Rôle |
72 −|---|---|
73 −| `GET /api/creators` | annuaire filtrable (q, niche, region, langue, plateforme, tier) |
74 −| `GET /api/creators/{cid}` | fiche canonique d'un créateur (comptes, métriques, scores) |
75 −| `GET /api/taxonomies` | niches, régions, plateformes, tiers d'audience |
76 −| `GET /api/sources` | registre des connecteurs et leur dernière synchro |
77 −| `GET /api/stats` · `/api/stats/dashboard` · `/report` · `/catalog` · `POST /api/stats/report/custom` | statistiques + rapports PDF (catalogue et personnalisés) |
78 −| `POST /api/optout` | retrait immédiat et persistant d'un créateur |
79 −| `GET /api/favorites` · `POST /api/favorites/toggle` | favoris « Mon univers Ka » (session KA ID) |
80 −| `GET /healthz` · `GET /api/health` | santé du service |
81 −| `GET /doc/` | guide d'utilisation en ligne |
108 +| Méthode | Endpoint | Rôle |
109 +|---|---|---|
110 +| `GET` | `/api/creators` | annuaire filtrable (q, niche, region, langue, plateforme, tier) |
111 +| `GET` | `/api/creators/{cid}` | fiche canonique d'un créateur (comptes, métriques, scores) |
112 +| `GET` | `/api/taxonomies` | niches, régions, plateformes, tiers d'audience, langues |
113 +| `GET` | `/api/sources` | registre des connecteurs : famille, mode d'accès, signal d'identité, cadence, dernière synchro |
114 +| `GET` | `/api/stats` | statistiques agrégées (créateurs, comptes, par plateforme/tier/niche/région, dernier sync) — alimente les pastilles dynamiques ci-dessus |
115 +| `GET` | `/api/stats/dashboard` · `/report` · `/catalog` | tableau de bord + rapports PDF (catalogue) |
116 +| `POST` | `/api/stats/report/custom` | rapport PDF personnalisé (ReportBuilder) |
117 +| `POST` | `/api/optout` | retrait immédiat et persistant d'un créateur |
118 +| `GET` / `POST` | `/api/favorites` · `/api/favorites/toggle` | favoris « Mon univers Ka » (session KA ID) |
119 +| `GET` | `/healthz` · `/api/health` | santé du service |
120 +| `GET` | `/doc/` | guide d'utilisation en ligne |
82 121
83 122 ## Connecteurs
84 123
85 −22 connecteurs auto-découverts (`creaka/connectors/`), relancés par le watch quotidien (cycle de 24 h) :
124 +**22 connecteurs** auto-découverts (`creaka/connectors/`), relancés par le watch quotidien (cycle de 24 h). Le registre live `GET /api/sources` documente pour chaque source : famille, palier d'accès, mode d'accès, signal d'identité et cadence (mensuelle pour les datasets compilés, hebdomadaire pour les bases publiques, quotidienne pour la découverte plateformes — la couverture s'accumule à chaque passage).
86 125
87 126 | Famille | Connecteurs | Rôle |
88 127 |---|---|---|
@@ -92,6 +131,8 @@ Servis par `creaka/web.py` (FastAPI) sur le port 8160.
92 131 | Enrichissement — profils | `instagram`, `tiktok`, `youtube`, `twitch`, `x_profil`, `apify_social` | métriques et bios des comptes (API officielles, Scrapfly, acteurs Apify) |
93 132 | Enrichissement — liens | `bio_liens`, `linkinbio` | comptes croisés révélés via les liens de bio et les pages link-in-bio |
94 133
134 +La couche réseau des connecteurs (`_resilient.py`) enchaîne **Oxylabs → Scrapfly → Bright Data** en cas de blocage anti-bot. L'enrichissement profond multi-plateforme passe par **13 acteurs Apify maison** (`actors/ka-*` : instagram, tiktok, youtube, x, facebook, threads, twitch, kick, patreon, fansly, discord, onlyfans, snapchat), avec retries durcis, rotation d'IP et snapshots quotidiens d'audience.
135 +
95 136 ## Architecture
96 137
97 138 Pipeline (calqué sur Lou·Ka) : **découverte → extraction → résolution d'identité → normalisation → déduplication → SQLite → API/UI**.
@@ -101,29 +142,65 @@ Pipeline (calqué sur Lou·Ka) : **découverte → extraction → résolution d'
101 142 - **Résolution d'identité** (`creaka/identity.py`) : signaux pondérés (`profil_source` 0.98 · `link_in_bio` 0.95 · `cross_link` 0.90 · listes/bases publiques 0.85 · `handle_match` 0.75).
102 143 - **Éthique** (`creaka/ethics.py`) : purge des données privées, opt-out, régime restreint des mineurs.
103 144 - **Frontend SPA zéro build** — template HTML généré par `scripts/build_frontend.py` (icônes SVG injectées), design ka-ui « éditorial sharp », footer commun (`ecosystem.json`) ; **`frontend/dist/` est tracké dans ce repo** (y compris le guide `/doc`).
104 −- **25 tests pytest** (identité, homonymes, éthique…).
145 +- **51 tests pytest** (identité, homonymes, éthique, périmètre QC, link-in-bio, normalisation…).
105 146
106 147 Processus PM2 sur le nœud :
107 148
108 −| Processus | Rôle | Cadence |
109 −|---|---|---|
110 −| `crea-ka-web` | API FastAPI + frontend sur le port **8160** | continu |
111 −| `crea-ka-sync` | watch de synchronisation (`run.py watch 24`) : découverte + enrichissement | cycle de 24 h |
112 −| `crea-ka-ngrok` | tunnel ngrok vers **www.crea-ka.com** | continu |
149 +| Processus | Rôle | Commande de démarrage réelle | Cadence |
150 +|---|---|---|---|
151 +| `crea-ka-web` | API FastAPI + frontend sur le port **8160** | `.venv/bin/python run.py serve 8160` | continu |
152 +| `crea-ka-sync` | watch de synchronisation : découverte + enrichissement | `.venv/bin/python run.py watch 24` | cycle de 24 h |
153 +| `crea-ka-ngrok` | tunnel vers **www.crea-ka.com** | `ngrok http --url=www.crea-ka.com 8160` | continu |
154 +
155 +## Démarrage rapide
156 +
157 +```bash
158 +python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
159 +cp .env.example .env # remplir les clés (voir section suivante)
160 +.venv/bin/python -m pytest tests/ -q # 51 tests
161 +python3 run.py sync # découverte + enrichissement (toutes sources)
162 +python3 run.py sync youtube instagram # …ou seulement certaines sources
163 +python3 run.py watch 24 # sync en boucle (cycle de 24 h)
164 +python3 run.py serve 8160 # API + frontend → http://localhost:8160
165 +python3 scripts/build_frontend.py # regénère frontend/dist
166 +python3 run.py optout "instagram:handle" # retrait manuel immédiat
167 +```
168 +
169 +## Variables d'environnement
113 170
114 −Points de configuration notables (`.env`, gabarit `.env.example` — aucun secret dans le repo) : `SCRAPFLY_KEY`, `YOUTUBE_API_KEY`, jeton Apify, secret SSO partagé avec le hub KA ID. La liste d'opt-out vit dans `data/optout.json`.
171 +Gabarit dans `.env.example` (copier vers `.env` — jamais commité, aucun secret dans le repo). Noms seulement :
172 +
173 +| Variable | Rôle |
174 +|---|---|
175 +| `SCRAPFLY_KEY` | profils Instagram/TikTok (palier 4, à minimiser) |
176 +| `FIRECRAWL_API_KEY` | repli pages link-in-bio / listes publiques |
177 +| `YOUTUBE_API_KEY` | API officielle YouTube (privilégiée) |
178 +| `TWITCH_CLIENT_ID` · `TWITCH_CLIENT_SECRET` | API officielle Twitch |
179 +| `PODCASTINDEX_API_KEY` · `PODCASTINDEX_API_SECRET` | enrichissement balados (gratuit ; sans clés, le connecteur est sauté proprement) |
180 +| `APIFY_TOKEN` | acteurs Apify maison (enrichissement 13 plateformes) |
181 +| `APIFY_FORCE` · `APIFY_MAX_SHARDS` · `APIFY_SHARD_SIZE` · `APIFY_REVISIT_DAYS` · `APIFY_RUN_CONCURRENCY` · `APIFY_RUN_MEMORY_MB` | réglages fins des passes Apify (couverture forcée, sharding, fraîcheur, concurrence, mémoire) |
182 +| `KA_HUB_URL` · `KA_SSO_SECRET` · `SESSION_SECRET` | SSO KA ID (hub groupe-ka.com) et sessions |
183 +| `CREAKA_BASE_URL` | URL publique du site (SEO/liens absolus) |
184 +
185 +## Données & conformité
186 +
187 +- **Provenance** : uniquement des **profils publics et professionnels** — listes et palmarès médias publics, Wikidata/Wikipédia, annuaires publics, recherche publique des plateformes, API officielles (YouTube, Twitch, Podcast Index) et pages de profil publiques. Le registre `GET /api/sources` documente chaque source (mode d'accès, signal d'identité, cadence).
188 +- **Cadence de resync** : le processus `crea-ka-sync` relance découverte + enrichissement en **cycle de 24 h** (`run.py watch 24`) ; dernier sync exposé dans `/api/stats.last_sync`.
189 +- **Éthique & Loi 25** : purge des données privées (`creaka/ethics.py`), **régime restreint des mineurs**, opt-out immédiat et persistant via `/retrait` ou `POST /api/optout` (liste `data/optout.json`, jamais ré-agrégée).
190 +- **Qualité d'identité** : score de confiance par rattachement ; sous 0.50 le compte n'est **jamais publié** ; fusion des doublons uniquement sur compte fort partagé, jamais sur le nom (homonymes).
191 +- **Périmètre québécois** : marqueurs QC obligatoires à la découverte ; purge des fiches hors-Québec (4 605 fiches retirées le 2026-08-20).
115 192
116 193 ## Structure du repo
117 194
118 195 ```
119 196 crea-ka/
120 −├── run.py # CLI : sync · serve · optout
197 +├── run.py # CLI : sync · watch · serve · optout
121 198 ├── creaka/ # cœur Python : schema, identity, dedup, ethics, db, web, auth, stats, kapdf + connectors/ (22)
122 199 ├── frontend/ # src/ (template) → dist/ (généré par build_frontend.py, tracké — incl. doc/)
123 200 ├── scripts/ # build_frontend.py · deploy-m3u96b.sh · screenshots.sh
124 −├── tests/ # 25 tests pytest
125 −├── data/ # SQLite, optout.json, datasets locaux (gitignorés au besoin)
126 −├── actors/ # acteurs Apify d'appoint
201 +├── tests/ # 51 tests pytest
202 +├── data/ # SQLite, optout.json, sources.json, datasets locaux (gitignorés au besoin)
203 +├── actors/ # 13 acteurs Apify maison (ka-instagram, ka-tiktok, ka-youtube, ka-x, …)
127 204 └── docs/ # captures d'écran + docs connecteurs
128 205 ```
129 206
@@ -133,6 +210,17 @@ crea-ka/
133 210 - **Guide PDF** : [crea-ka-documentation.pdf](https://www.crea-ka.com/doc/crea-ka-documentation.pdf) — la même documentation, téléchargeable.
134 211 - Les captures du guide sont versionnées dans `frontend/dist/doc/img/` (etape1 → etape4).
135 212
213 +## Historique
214 +
215 +Jalons tirés du `git log` :
216 +
217 +- **2026-08-17** — commit initial : pipeline, premiers connecteurs, design ka-ui « éditorial sharp », SSO KA ID, tableau de bord `/stats`, widget KA Agent.
218 +- **2026-08-18** — vagues 2 à 4 d'expansion : balados (RSS, Podcast Index), Twitch GQL et InnerTube sans clé, `twitch/kick-decouverte` (Scrapfly), 1 361 requêtes YouTube, enrichisseur `region_bio` ; 12 connecteurs Apify maison + couverture 13 plateformes.
219 +- **2026-08-19** — campagne mobile (socle tokens.css, champs ≥16 px), KA Agent v2 plein écran, `/stats` v2 + 5 rapports PDF.
220 +- **2026-08-20** — seeds vague 3 (+392 créateurs QC) et périmètre QC durci : purge de 4 605 fiches hors-Québec ; « fiches légendaires » (bannières, Ka Score /100, sparklines, snapshots quotidiens d'audience).
221 +- **2026-08-21/22** — acteurs Apify durcis (retries, rotation d'IP, concurrence par acteur), chaîne anti-bot résiliente Oxylabs → Scrapfly → Bright Data, SEO SSR des fiches + robots/sitemaps, standard header KA.
222 +- **2026-08-23/24** — pages SEO programmatiques `/plateformes`, rapports PDF personnalisés (ReportBuilder), favoris unifiés « Mon univers Ka », page documentation `/doc` + guide PDF, README v3.
223 +
136 224 ## Développement (remote-first)
137 225
138 226 **La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/crea-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, tests, `pm2 restart`, puis commit/push depuis le nœud.
@@ -141,14 +229,6 @@ crea-ka/
141 229 - L'agent forwarding SSH est actif : le `git push origin main` fonctionne pendant une session SSH depuis le laptop.
142 230
143 231 ```bash
144 −python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
145 −cp .env.example .env # SCRAPFLY_KEY, YOUTUBE_API_KEY…
146 −python3 -m pytest tests/ -q # 25 tests
147 −python3 run.py sync # découverte + enrichissement
148 −python3 run.py serve 8160 # API + frontend
149 −python3 scripts/build_frontend.py # regénère frontend/dist
150 −python3 run.py optout "instagram:handle" # retrait manuel
151 −
152 232 pm2 restart crea-ka-web # après un changement en production
153 233 ```
154 234
155 235