# Créa·Ka
**Tous les créateurs québécois. Tous leurs liens.**
[](https://www.crea-ka.com)
[](https://www.crea-ka.com/stats)
[](https://www.crea-ka.com)
[](https://www.python.org)
[](creaka/web.py)
[](frontend/src/index.template.html)
[](tests/)
[](creaka/connectors/)
[](https://www.crea-ka.com)
Annuaire public, québécois, exhaustif et **cross-plateforme** des créateurs de
contenu — un croisement entre un annuaire cherchable et un « Linktree
collectif », membre de la famille **Groupe KA**.
**https://www.crea-ka.com**
---
## Captures
| Accueil (annuaire) | Page créateur |
|---|---|
|  |  |
| Statistiques | Mobile (tab bar Lou·Ka) |
|---|---|
|  |  |
## Ce que fait Créa·Ka
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**. L'annuaire se filtre par **niche** (20), **région**
(17 régions administratives), **langue**, **plateforme** et **taille d'audience**
(nano/micro/macro/méga). Chaque créateur a sa page dédiée `/createur/{id}`.
## Architecture (calquée sur Lou·Ka)
```
DÉCOUVERTE → EXTRACTION → RÉSOLUTION D'IDENTITÉ → NORMALISATION → DÉDUP. → SQLite → API/UI
```
| Module | Rôle |
|---|---|
| `creaka/schema.py` | fiche `Creator` + `PlatformAccount`, validation stricte (compte sans url/confidence = rejeté) |
| `creaka/identity.py` | signaux de rattachement §12.1 : `profil_source` 0.98 · `link_in_bio` 0.95 · `cross_link` 0.90 · `listes_medias`/`base_publique` 0.85 · `handle_match` 0.75 |
| `creaka/dedup.py` | fusion **uniquement** sur compte fort partagé — jamais sur le nom (homonymes) |
| `creaka/ethics.py` | purge des données privées, opt-out persistant, régime restreint des mineurs |
| `creaka/db.py` | SQLite WAL : fiches canoniques + index des comptes + journal des syncs |
| `creaka/web.py` | API FastAPI + frontend statique |
### Connecteurs (registre auto-découvrant)
| Connecteur | Famille | Accès | Signal |
|---|---|---|---|
| `listes-medias` | découverte | dataset local (palmarès médias publics croisés, 376 profils) | 0.85 |
| `wikidata-qc` | découverte | SPARQL Wikidata (nés/résidant au QC, handles curés) | 0.85 |
| `onlyqueb` | découverte | sitemap + JSON-LD (annuaire public, liens auto-déclarés) | 0.90 |
| `youtube-recherche` | découverte | recherche publique YouTube, ~120 requêtes × marqueur QC obligatoire | 0.98 |
| `balados-itunes` | découverte | **API officielle** iTunes/Apple Podcasts | 0.98 |
| `instagram-profil` | enrichissement | Scrapfly (profil public : abonnés, bio, **liens de bio** → cross-link) | — |
| `tiktok-profil` | enrichissement | Scrapfly (JSON d'hydratation public) | — |
| `youtube` | enrichissement | API officielle v3 si clé, sinon page publique | — |
| `twitch` | enrichissement | API officielle Helix (sauté sans clés) | — |
| `link-in-bio` | enrichissement | Linktree/Beacons/Bio.link… — **le levier nº 1** : une page → tous les comptes | 0.95 |
La couverture **s'accumule à chaque passage** (watch quotidien) : la découverte
trouve de nouveaux créateurs, l'enrichissement rafraîchit les métriques et
révèle les comptes croisés via les liens de bio et les pages link-in-bio.
## API publique
```
GET /api/creators?q&niche®ion&langue&plateforme&tier&sort&limit&offset
GET /api/creators/{id} GET /api/stats GET /api/taxonomies
GET /api/sources POST /api/optout GET /healthz
```
## Éthique — prime sur tout (CLAUDE.md §15)
- **Profils publics et professionnels seulement** ; `ethics.scrub()` purge
téléphones, adresses civiques et courriels personnels avant tout stockage.
- **Opt-out immédiat et persistant** (`/retrait`) : fiche masquée sur-le-champ,
liste de suppression `data/optout.json`, **jamais ré-agrégée**.
- **Mineurs** : régime restreint automatique (année de naissance Wikidata) et
**exclusion de l'annuaire public**.
- **Score de confiance** sur chaque rattachement ; sous 0.50 → « à vérifier »,
jamais publié. Mieux vaut un lien de moins qu'un lien erroné.
- Loi 25 : finalités documentées, accès/rectification/retrait via `/retrait`.
## Développement
```bash
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
cp .env.example .env # SCRAPFLY_KEY, YOUTUBE_API_KEY…
python3 -m pytest tests/ -q # 25 tests (identité, homonymes, éthique…)
python3 run.py sync # découverte + enrichissement
python3 run.py serve 8160 # API + frontend
python3 scripts/build_frontend.py # regénère frontend/dist (icônes SVG injectées)
python3 run.py optout "instagram:handle" # retrait manuel
```
## Déploiement
Node **M3U96b** (`~/apps/crea-ka`) : PM2 `crea-ka-web` (:8160) +
`crea-ka-sync` (watch 24 h) + `crea-ka-ngrok` (**www.crea-ka.com**).
Redéploiement : `scripts/deploy-m3u96b.sh` · captures : `scripts/screenshots.sh`.
---
**Groupe KA** · [KA ID](https://www.groupe-ka.com) · [Lou-Ka](https://www.lou-ka.com) ·
[Immo-Ka](https://www.immo-ka.com) · [Auto-Ka](https://www.auto-ka.com) ·
[Food-Ka](https://www.food-ka.com) · [Fabri-Ka](https://www.fabri-ka.com)
© Simon-Pierre Boucher —