Fabri·Ka — Tous les produits québécois. Un seul endroit.

Fabri·Ka

Tous les produits québécois. Un seul endroit.
www.fabri-ka.com

Site Guide PDF Stats Nœud Port PM2 Produits (live) Boutiques live Registre Régions Connecteurs Catégories Python FastAPI React 18 SQLite FTS5 Firecrawl Scrapfly PM2 ngrok KA ID Groupe KA spbgit
*Les pastilles « produits / boutiques live / registre QC / régions » sont **dynamiques** : elles interrogent `https://www.fabri-ka.com/api/stats` en direct.* Aperçu de Fabri-Ka --- ## Description **Fabri-Ka** est le **répertoire des produits québécois** : un agrégateur de découverte qui recense **384 535 produits** (au 2026-08-28, `/api/stats` live) provenant de **1 580 boutiques en ligne** du Québec, couvrant les **17 régions administratives** de la province. Chaque produit renvoie vers la **boutique d'origine** — **aucune vente sur Fabri-Ka** : les prix, photos et stocks appartiennent aux marchands sources. Acheter québécois demande de connaître des centaines de boutiques dispersées — érablières, microbrasseries, savonneries, ébénistes, torréfacteurs, fermes… **Fabri-Ka retourne le problème** : un pipeline de découverte recense les boutiques en ligne du Québec (**4 082 boutiques vérifiées** au registre), des connecteurs par *plateforme* aspirent leurs catalogues publics complets, et un **moteur de recherche unique** les rend trouvables — filtrés par **catégorie**, **région** et **origine de fabrication** (classes **A–E**). > Contrairement à un agrégateur classique (1 connecteur / site), Fabri-Ka utilise **1 connecteur / plateforme ecommerce** : le même code **Shopify** sert des centaines de boutiques, piloté par le registre `data/stores.json` produit par la recherche. ## Fonctionnalités - **Recherche de produits** — plein-texte **FTS5 accent-insensible** sur **384 535 produits**, filtres **catégorie / région / origine / prix**, tri, pagination, fiches riches (galerie, boutique, produits liés). - **Répertoire de boutiques** — **1 580 boutiques** avec produits (sur **4 082 vérifiées**), fiches enrichies : logo, région, plateforme, **stats de prix**, **politique de livraison** (colonne `shipping_info`, extraite des pages politiques), catégories, boutiques similaires. - **Statistiques** — tableau de bord analytique `/stats` (module commun **ka-stats**) : totaux, médianes, histogrammes, ventilation régionale, croissance — et **rapports de marché PDF** générés à la volée (`/api/report.pdf`, moteur **kapdf**, 5 modes + rapports personnalisés). - **Catégories** — taxonomie de **20 catégories** (épicerie fine 44 k · mode 43 k · bijoux 39 k · …) avec **~350 pages programmatiques SEO** (`/categorie/erable`, `/region/monteregie`, combinaisons non vides). - **Classification d'origine A–E** — chaque boutique justifiée par une **évidence conservée** (certifications *Aliments du Québec* / *Les Produits du Québec*, associations, wording du site). - **SEO / SSR** — **385 000+ pages indexables** : HTML complet dès la 1ʳᵉ requête, **JSON-LD** schema.org, **sitemaps** exhaustifs, 301/404/410 propres (détails plus bas). - **« Inscrire mon atelier »** — canal d'**auto-inscription des artisans** (`/inscrire` → `POST /api/inscriptions`) : dépôt public en **quarantaine** (rien n'est publié sans validation), anti-abus honeypot + 5 dépôts/24 h/IP, décision admin `approve|reject` avec vérification du site par le pipeline `verify` avant ajout au registre. - **KA ID (SSO)** + favoris **« Mon univers Ka »** synchronisés au hub **groupe-ka.com**. - **Widget KA Agent** — bulle de chat Groupe KA (`ka-agent.js`). - **Mobile-first** — barre d'onglets, filtres en bottom sheet, galeries swipe, CTA collant, PWA-lite, **fr-CA** d'abord. - **Supervision** — connecteurs surveillés par les gardiens autonomes du Groupe KA (agents ka6, supervision api-ka) ; `/api/stats` expose le `sync_log` et les boutiques désactivées. ## Visite guidée *10 captures du site en production (2026-08-28, desktop) — chaque image pointe la page réelle de [www.fabri-ka.com](https://www.fabri-ka.com).* ### 1 · Accueil — [`/`](https://www.fabri-ka.com/) Accueil de Fabri-Ka La porte d'entrée : masthead vert profond à liseré terracotta, **recherche plein-texte** immédiate, compteurs live (produits · boutiques · régions), entrées rapides vers les **20 catégories** et les **17 régions administratives**. Display serif Fraunces, DA v3 « catalogue éditorial ». ### 2 · Catalogue de produits — [`/produits`](https://www.fabri-ka.com/produits) Catalogue des produits Le cœur du site : **384 535 produits québécois** interrogés en plein-texte **FTS5 accent-insensible**, filtrés par catégorie / région / origine (A–E) / fourchette de prix, triés et paginés. Cartes sans cadre, photos 10 px radius, prix en serif ; chaque carte renvoie vers la **boutique d'origine** (aucune vente sur Fabri-Ka). ### 3 · Répertoire des boutiques — [`/boutiques`](https://www.fabri-ka.com/boutiques) Répertoire des boutiques **1 580 boutiques avec produits en ligne** (sur 4 082 vérifiées au registre) : index à filets, logo, région, plateforme ecommerce, nombre de produits. Chaque fiche boutique s'enrichit de **stats de prix**, de la **politique de livraison** extraite et de boutiques similaires. ### 4 · Statistiques — [`/stats`](https://www.fabri-ka.com/stats) Tableau de bord statistiques Le tableau de bord analytique (module commun **ka-stats**) : totaux, médianes de prix, histogrammes, ventilation régionale et par catégorie, croissance du catalogue — plus les **rapports de marché PDF** générés à la volée (`/api/report.pdf`, moteur kapdf, 5 modes + rapports personnalisés). ### 5 · À propos — [`/a-propos`](https://www.fabri-ka.com/a-propos) Page À propos La mission expliquée aux visiteurs : pourquoi un agrégateur de produits québécois, comment fonctionne le pipeline de découverte (registre → connecteurs par plateforme → moteur de recherche), et ce que signifient les **classes d'origine A–E** justifiées par évidence conservée. ### 6 · Contact — [`/contact`](https://www.fabri-ka.com/contact) Page contact Le canal de contact du site : questions générales, signalements, et **demandes de retrait** — tout ayant droit peut demander le retrait de ses données (voir la section conformité). ### 7 · Inscrire mon atelier — [`/inscrire`](https://www.fabri-ka.com/inscrire) Formulaire Inscrire mon atelier L'**auto-inscription des artisans et fabricants** : un formulaire public dépose la candidature en **quarantaine** (`POST /api/inscriptions`, statut `pending` — rien n'est publié sans validation). Anti-abus honeypot + limite 5 dépôts/24 h/IP ; à l'approbation, le site est vérifié par le pipeline `verify` puis ajouté au registre (source `auto_inscription`) — connecté si un catalogue public répond, sinon fiche annuaire. ### 8 · Page catégorie — [`/categorie/alcool`](https://www.fabri-ka.com/categorie/alcool) Page catégorie alcool Exemple des **pages programmatiques SEO** par catégorie : microbrasseries, distilleries, vignobles et cidreries du Québec réunis sous `/categorie/alcool`, avec compteurs réels, filtres et maillage interne. La taxonomie compte **20 catégories** et ~350 pages programmatiques non vides (catégorie × région). ### 9 · Page région — [`/region/abitibi-temiscamingue`](https://www.fabri-ka.com/region/abitibi-temiscamingue) Page région Abitibi-Témiscamingue Le pendant régional : chacune des **17 régions administratives** a sa vitrine — ici l'Abitibi-Témiscamingue — listant ses boutiques et produits locaux. Acheter local, au sens propre : le filtre région s'appuie sur la localisation vérifiée des boutiques au registre. ### 10 · Documentation — [`/doc/`](https://www.fabri-ka.com/doc/) Documentation en ligne La **page /doc illustrée** (standard Groupe Ka) : guide complet de la plateforme avec captures, architecture et FAQ, déclinée en **[PDF téléchargeable](https://www.fabri-ka.com/doc/fabri-ka-documentation.pdf)** — liée depuis le pied de page de chaque page du site. ### Galerie *Captures du 2026-08-25 — DA v3 « catalogue éditorial » (mobile 390×844 · desktop 1440×900).* **Mobile**
Accueil mobile
Accueil — masthead vert profond, KA Tabbar
Catalogue mobile
Catalogue — cartes sans cadre
Catégorie mobile
Catégorie — érable
Boutiques mobile
Index des boutiques à filets
Stats mobile
KPI stats en colonnes de chiffres
**Desktop**
Accueil desktop
Accueil — display serif Fraunces, sections à règles d'encre
Catalogue
Catalogue — photos 10px radius + filets
Catégorie
Page catégorie (SEO programmatique)
Boutiques
Boutiques — 1 500+ artisans et fabricants
Stats
Statistiques du registre
**Nouveautés front-end (2026-08-25)** : DA v3 « catalogue éditorial » — display serif Fraunces (titres + prix), masthead et tab bar vert profond à liseré terracotta, cartes produits sans cadre, boutiques en index à filets, KPI stats en colonnes ; **KA Tabbar v1** (nav mobile commune Groupe KA). > 🗄️ Les captures d'époque sont conservées dans [`docs/archive/`](docs/archive/). ## Chiffres (au 2026-08-28, `/api/stats` live + registre) | Mesure | Valeur | |---|---| | Produits agrégés (catalogues complets) | **384 535** publiés (prix médian ~25 $) | | Boutiques avec produits en ligne | **1 580** | | Boutiques québécoises vérifiées au registre (`data/stores.json`) | **4 082** — dont 2 466 avec ecommerce détecté et 1 701 activées pour la sync | | Régions administratives couvertes | **17 / 17** (Montréal 56 k produits · Outaouais 32 k · Saguenay–Lac-Saint-Jean 24 k · …) | | Connecteurs plateforme | **10** — boutiques actives : Shopify 718 · WooCommerce 542 · Wix 302 · Votresite.ca 45 · Square 36 · Squarespace 26 · générique 22 · Immunotec 1 · autres 9 | | Classes d'origine au registre | A : 3 863 · E : 180 · C : 39 | | Catégories | **20** (épicerie fine 44 k · mode 43 k · bijoux 39 k · …) | | Pages indexables (produits + boutiques + programmatiques) | **385 000+** | | Base | `data/fabrika.db` **3,2 Go** (SQLite + FTS5) | Détails et méthodologie : [`deliverables/research_report.md`](deliverables/research_report.md) · stratégie de découverte continue : [`deliverables/discovery_strategy.md`](deliverables/discovery_strategy.md) · conformité par source : [`docs/CONFORMITE.md`](docs/CONFORMITE.md). ## Stack technique | Couche | Technologies | |---|---| | **Backend** | **Python 3.14** · **FastAPI** (API + SSR SEO + service du frontend) | | **Base de données** | **SQLite + FTS5** — upsert par **hash de contenu**, retraits avec délai de grâce (2 syncs) | | **Frontend** | **React 18 + Vite + TypeScript** — 9 pages, identité famille KA « éditorial sharp » (Space Grotesk + Inter + JetBrains Mono, palette crème/terracotta/pin/miel), tokens **ka-ui** | | **Connecteurs** | **Shopify** `products.json` (transport curl anti-429 TLS) · **WooCommerce** Store API (+ fallback sitemap Yoast/AIOSEO, permaliens personnalisés) · **Wix Stores** GraphQL · **Squarespace** `?format=json` · **Square Online** API storefront publique (`/app/store/api/v13/…/products`, IDs user/site extraits du HTML de la page d'accueil) · **Votresite.ca** (plateforme QC : Drupal 8 + boutique OpenCart en sous-répertoire — sitemap OpenCart ou crawl des catégories, puis fiche par fiche) · **connecteur générique** (sitemap → JSON-LD/microdata/OG : PrestaShop, Lightspeed, Snipcart, Magento, sites custom) · **Immunotec** (storefront sur mesure Next.js/Exigo derrière Cloudflare, via Scrapfly ASP) · **Scrapfly/Firecrawl** en secours anti-bot. **Ecwid** non couvert : storefront 100 % client-side (l'API REST v3 exige un token secret — le token `pub…` de script.js est générique et refusé (403) ; aucun rendu serveur du catalogue, ni sur les instant sites ni via le plugin WordPress) | | **Découverte** | **35+ sources** : sitemaps d'annuaires, API cachées de cartes (wpgmza, FacetWP), pagination htmx, sessions **Firecrawl** pour répertoires JS | | **Comptes** | **KA ID** SSO (JWT HS256, stdlib pure) · favoris HMAC-SHA256 vers le hub central | | **Prod** | **PM2** + **ngrok** sur le cluster **MacLustr** (nœud M4M64a) | ### Architecture en 30 secondes ```mermaid flowchart LR subgraph Discovery["Pipeline de découverte (scripts/)"] A["35+ annuaires sources
certifications · associations ·
marques régionales · balayages"] --> B["harvest → aggregate →
verify → classify A–E"] B --> R[("stores.json
4 082 boutiques QC")] end subgraph FabriKa["Plateforme (fabrika/)"] R --> C["Connecteurs plateforme
Shopify · Woo · Wix · Squarespace · Square ·
Votresite.ca · générique (JSON-LD) · Scrapfly"] C --> D[("SQLite + FTS5
hash + diff")] D --> E["API FastAPI
/api/products · /api/facets"] D --> S["Rendu serveur SEO
HTML complet · JSON-LD ·
sitemaps · 301/404/410"] E --> F["React 18 + Vite
recherche · filtres · fiches"] S --> G["🕷 Googlebot & co."] end H["KA ID (SSO) + favoris
hub groupe-ka.com"] <--> E W["⏱ Watcher 6 h (PM2)"] -.-> C F --> U["🍁 Acheteur local"] ``` ## SEO & rendu serveur — **385 000+ pages indexables** Le site est une SPA React, mais **aucun moteur de recherche ne voit une page vide** : le catch-all FastAPI (`fabrika/seo.py`) injecte dans le HTML du build Vite, pour chaque route, un `` complet **et le contenu essentiel de la page dans `#root`** — React remplace ce contenu au montage (hydratation). | Élément | Détail | |---|---| | **Title & meta description uniques** | Générés par page à partir des données réelles (compteurs, prix, boutique) | | **Canonical + hreflang fr-CA** | Sur chaque page, querystring normalisée | | **Open Graph + Twitter Card** | `og:image` = photo produit / couverture boutique | | **JSON-LD schema.org** | `Product` + `Offer` (prix CAD, dispo, vendeur), `BreadcrumbList`, `OnlineStore`, `CollectionPage` + `ItemList`, `WebSite` + `SearchAction` | | **Contenu HTML complet** | H1, stats, description, galerie (lazy + dimensions), grille de produits, maillage interne | **URLs & statuts propres** : slug lisible + uid (`/produits/sirop-d-erable-…-b63130ffc8b18c8cc650`), **301** de l'uid nu vers l'URL slugée, **410 Gone** pour les produits retirés, **404** pour les uid inconnus — fini le soft-404. **Sitemaps & robots** : `/robots.txt` → `/sitemap.xml` (index) → `sitemap-pages.xml` + `sitemap-boutiques.xml` + `sitemap-produits-{n}.xml` (**40 000 URLs/chunk**, `lastmod` réel, régénérés automatiquement, cache 1 h). **Performance** : **GZip** (‑80 % sur le HTML), `Cache-Control: immutable` sur les assets hashés, images `loading="lazy"` avec dimensions explicites, polices en `swap`. ## API | Endpoint | Méthode | Description | |---|---|---| | `/api/products?q=&category=®ion=&origin=&price_min=&price_max=&sort=&page=` | GET | recherche plein-texte + filtres, triée | | `/api/products/{uid}` | GET | fiche produit (galerie, boutique, produits liés) | | `/api/stores?region=&q=&with_products=` | GET | répertoire des boutiques (logo, région, plateforme) | | `/api/stores/{id}` | GET | fiche boutique enrichie : stats de prix, catégories, boutiques similaires | | `/api/facets` | GET | catégories/régions/origines avec compteurs | | `/api/stats` | GET | totaux live, ventilation régionale, `sync_log`, boutiques désactivées | | `/api/stats/extended` | GET | stats riches : médianes, histogrammes, croissance, ventilation par catégorie | | `/api/report.pdf` | GET | rapport de marché PDF — généré à la volée (5 modes + `ReportBuilder` personnalisé) | | `/api/sync` | POST | déclenche une synchronisation en arrière-plan | | `/api/inscriptions` · `…/{id}/decision` | POST/GET | auto-inscription des artisans (« Inscrire mon atelier ») — dépôt public en quarantaine, liste + décision admin | | `/api/auth/ka/login` → `…/callback` · `/api/auth/me` · `/api/auth/logout` | GET/POST | SSO **KA ID** | | `/api/favorites` · `/api/favorites/toggle` | GET/POST | favoris « Mon univers Ka » (hub central) | | `/robots.txt` · `/sitemap.xml` (+ sous-sitemaps) | GET | infrastructure SEO | ## Connecteurs & cadences **10 connecteurs plateforme** (`fabrika/connectors/`) pilotés par le registre `data/stores.json` : | Connecteur | Boutiques actives | Technique | Cadence | |---|---|---|---| | `shopify.py` | 718 | `products.json` paginé, transport curl anti-429, retry durci | resync complète aux 6 h | | `woocommerce.py` | 542 | Store API `/wp-json/wc/store/v1/products` + fallback sitemap → fiches | aux 6 h | | `wix.py` | 302 | GraphQL storefront public (jeton public) | aux 6 h | | `votresite.py` | 45 | plateforme QC (Drupal 8 + OpenCart) : sitemap ou crawl catégories → fiche par fiche | aux 6 h | | `square.py` | 36 | API storefront publique v13, IDs extraits du HTML | aux 6 h | | `squarespace.py` | 26 | `?format=json` par collection | aux 6 h | | `generic.py` | 22 | sitemap → JSON-LD/microdata/OG (PrestaShop, Lightspeed, Snipcart, Magento, custom) | aux 6 h | | `immunotec.py` | 1 | storefront sur mesure (Next.js + backend Exigo) derrière Cloudflare — « mur produits » via Scrapfly ASP | aux 6 h | | `scrapfly.py` / Firecrawl | secours | rendu JS / anti-bot pour les sites qui bloquent | à la demande | - Journal `sync_log` par boutique (found/added/updated/removed + raison d'échec), exposé par `/api/stats`. - Une boutique qui casse **n'affecte jamais les autres** ; les faux positifs de découverte sont désactivés (`enabled=0`) avec garde anti-réintroduction (`reprobe_stores.py`). ## Classification d'origine | Classe | Signification | |---|---| | **A** | Fabriqué / cultivé / transformé au Québec | | **B** | Conçu au Québec, fabriqué ailleurs | | **C** | Détaillant québécois (revente) | | **D** | Mixte | | **E** | Incertain — à vérifier | Chaque classe est justifiée par une **évidence conservée** — jamais déduite du seul fait qu'une entreprise « semble » québécoise. Répartition au registre (2026-08-28) : **A 3 863 · E 180 · C 39**. ## Structure du projet ``` fabri-ka/ ├── fabrika/ # plateforme │ ├── web.py # API FastAPI + service du frontend + routes SEO │ ├── seo.py # rendu serveur : meta, JSON-LD, sitemaps, 301/404/410 │ ├── db.py # SQLite + FTS5, diff par hash, délai de grâce │ ├── ingest.py # orchestration des syncs par boutique │ ├── schema.py # modèles Product/Store, taxonomie 20 catégories, 17 régions │ ├── report.py # rapport de marché PDF généré à la volée │ ├── auth.py # SSO « KA ID » (JWT HS256, zéro dépendance) │ ├── hubfav.py # favoris poussés au hub Groupe KA (HMAC) │ ├── hubprofile.py # profil membre lu du hub │ ├── inscriptions.py # auto-inscription des artisans (« Inscrire mon atelier », quarantaine) │ └── connectors/ # shopify · woocommerce · wix · squarespace · square · votresite · immunotec · generic · scrapfly ├── frontend/ # React 18 + Vite + TS — 9 pages, PWA-lite, fr-CA ├── scripts/ # pipeline de découverte (harvest → aggregate → verify → registry), │ # enrichissements (contacts, livraison, collections), reprobe, docs connecteurs ├── data/ # stores.json (registre 4 082) · fabrika.db (3,2 Go) · caches (non versionnés) ├── deliverables/ # rapport de recherche, CSV des boutiques, sources ├── docs/ # captures d'écran, CONFORMITE.md, fiches des connecteurs └── run.py # CLI : sync · serve · watch ``` ## Démarrage rapide ```bash git clone https://git.spboucher.ai/fabri-ka.git && cd fabri-ka # (prod : ssh M4M64a && cd ~/fabri-ka) # Backend python3 -m venv .venv && .venv/bin/pip install -r requirements.txt # Frontend (dev : npm run dev ; prod : build servi par FastAPI) cd frontend && npm install && npm run build && cd .. # Ingestion puis service .venv/bin/python run.py sync # toutes les boutiques connectables .venv/bin/python run.py serve 8097 # → http://localhost:8097 .venv/bin/python run.py watch 360 # resynchronisation en boucle (minutes) # Après un changement en prod pm2 restart fabri-ka-web # (ou fabri-ka-sync selon le changement) ``` ## Variables d'environnement Noms seulement — les valeurs vivent dans le `.env` du nœud (jamais dans le repo) : | Variable | Rôle | |---|---| | `FABRIKA_BASE_URL` | URL publique du site (canonicals, sitemaps) | | `FABRIKA_ADMIN_TOKEN` | jeton des opérations d'administration (`/api/sync`) | | `KA_SSO_SECRET` · `KA_HUB_URL` · `SESSION_SECRET` | SSO KA ID (JWT HS256) et hub groupe-ka.com | | `FIRECRAWL_API_KEY` | sessions Firecrawl (répertoires JS, découverte) | | `SCRAPFLY_API_KEY` | secours anti-bot de certains connecteurs | ## Données & conformité - **Provenance** : le catalogue provient des **endpoints publics des boutiques elles-mêmes** (Shopify `products.json`, WooCommerce Store API, GraphQL Wix, etc.) — pas d'annuaire tiers, aucune donnée derrière authentification. - **Revue de conformité par source** : chaque source est évaluée AVANT connexion (robots.txt/CGU lus et datés, décision consignée) — voir [`docs/CONFORMITE.md`](docs/CONFORMITE.md) (dernière revue complète : 2026-08-19). - **Politesse réseau** : throttle global par plateforme (Shopify : **0,7 s/req** toutes boutiques confondues), backoff 429, caches disque, User-Agent identifié. - **Traçabilité** : chaque produit renvoie vers la boutique d'origine ; chaque boutique conserve sa provenance de découverte (`discovery_sources`) et son évidence d'origine (`origin_evidence`). - **Cadence** : resynchronisation complète **aux 6 heures** (`run.py watch 360`) ; retraits avec délai de grâce (2 syncs). - **Retrait sur demande** : tout ayant droit peut demander le retrait de ses données (contact ci-dessous). ## Déploiement En production sur le **nœud M4M64a** du cluster **MacLustr** (répertoire `~/fabri-ka`), servi sur le **port 8097** et exposé via **ngrok** sur **[www.fabri-ka.com](https://www.fabri-ka.com)**. **3 processus PM2 (vérifiés live) :** ``` fabri-ka-web .venv/bin/python run.py serve 8097 # API + frontend + SSR SEO fabri-ka-sync .venv/bin/python run.py watch 360 # resync aux 6 h fabri-ka-ngrok ngrok http --url=www.fabri-ka.com 8097 # tunnel ``` Redéploiement : build + **`pm2 restart fabri-ka-web`** (la prod garde sa base `data/` — resynchronisée en continu, jamais écrasée). ## Développement remote-first (IMPORTANT) La **source de vérité est le repo git sur le nœud M4M64a** (`~/fabri-ka`) — **pas** une copie locale sur le laptop. Toute modification se fait **sur le nœud via SSH** : édition, build, `pm2 restart`, puis commit/push **depuis le nœud** (agent forwarding actif). - Remote `origin` = **spbgit** (git perso **[git.spboucher.ai](https://git.spboucher.ai)**), via l'alias SSH **`gitsrv`** : `gitsrv:srv/git/fabri-ka.git` — bare repo hébergé sur M3U96a. - **Ne pas éditer de copies laptop** ; référence complète : `~/Desktop/cluster-skill/KA-REMOTE-DEV.md`. ## Historique Jalons réels du repo (`git log`, 95 commits) : | Jalon | Commit | |---|---| | Naissance — agrégateur de produits québécois | `4d4f1b5` | | Expansion majeure : 149 500+ produits, 3 131 boutiques, 17/17 régions | `a4bbc59` | | Stats v2 — dashboard ultra complet + 5 rapports PDF (kapdf v2) | `6112f03` | | Qualité produits — listing_status, quarantaine, prix « sur devis », galeries enrichies | `1f5ecb8` | | Connecteur Votresite.ca (plateforme QC) — 45 boutiques, +3 190 produits | `037494b` | | Stats v3 — rapports PDF personnalisés (`ReportBuilder`) · gardiens ka6 sur la supervision des connecteurs | `1fbc242` · `db542b0` | ## Principes 1. **Politesse** — throttle global par plateforme (Shopify : **0,7 s/req** toutes boutiques confondues), délais entre requêtes, User-Agent identifié. 2. **Fidélité** — aucun prix inventé ; entités HTML décodées ; si la source ne publie pas une donnée, elle est `null`. 3. **Traçabilité** — chaque produit renvoie vers la **boutique d'origine** ; chaque boutique conserve sa provenance de découverte et son évidence d'origine. 4. **Robustesse** — une boutique qui casse n'affecte jamais les autres ; journal `sync_log` avec raison d'échec par boutique. 5. **Trouvabilité** — tout ce qui existe dans la base existe pour Google : HTML complet, données structurées, sitemaps exhaustifs, jamais de soft-404. ## Écosystème Groupe KA | Plateforme | Univers | |---|---| | [groupe-ka.com](https://www.groupe-ka.com) | portail & KA ID | | [lou-ka.com](https://www.lou-ka.com) | logements à louer | | [immo-ka.com](https://www.immo-ka.com) | propriétés à vendre | | [vrai-prix.com](https://www.vrai-prix.com) | estimation immobilière | | [auto-ka.com](https://www.auto-ka.com) | véhicules | | [fabri-ka.com](https://www.fabri-ka.com) | produits québécois | | [food-ka.com](https://www.food-ka.com) | épicerie/alimentation | | [resto-ka.com](https://www.resto-ka.com) | restaurants | | [sorti-ka.com](https://www.sorti-ka.com) | sorties et événements | | [job-ka.com](https://www.job-ka.com) | emplois | | [crea-ka.com](https://www.crea-ka.com) | créateurs | | [trouve-ka.com](https://www.trouve-ka.com) | petites annonces | | [api-ka.com](https://www.api-ka.com) | API de données | ---
**Simon-Pierre Boucher** [![Email](https://img.shields.io/badge/contact@spboucher.ai-1E1B16?style=for-the-badge&logo=minutemailer&logoColor=C4532E)](mailto:contact@spboucher.ai) [![Git](https://img.shields.io/badge/git.spboucher.ai-1E1B16?style=for-the-badge&logo=git&logoColor=C4532E)](https://git.spboucher.ai) Un service **[Groupe Ka](https://www.groupe-ka.com)** © 2026 Simon-Pierre Boucher — tous droits réservés.