SPB Git forge

spb/fabri-ka

Public

Agrégateur de produits québécois — www.fabri-ka.com

217commits 1branches 0releases
66.1 MBsize
maindefault branch
3 h agolast push
Python 38.4% HTML 30.3% TypeScript 17.2% CSS 11% JavaScript 3.2%

docs: README ultra détaillé + visite guidée en 10 captures

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 29 days ago (Aug 29, 2026) parent efe7a3b

11 changed files +83 −15

modified README.md +83 −15
@@ -19,7 +19,7 @@
19 19 <a href="https://www.fabri-ka.com/api/stats"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.fabri-ka.com%2Fapi%2Fstats&query=%24.totals.stores_live&label=boutiques%20live&color=c4532e&style=flat-square" alt="Boutiques live"></a>
20 20 <a href="https://www.fabri-ka.com/api/stats"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.fabri-ka.com%2Fapi%2Fstats&query=%24.totals.stores_registry&label=registre%20QC&color=c4532e&style=flat-square" alt="Registre"></a>
21 21 <a href="https://www.fabri-ka.com/api/stats"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.fabri-ka.com%2Fapi%2Fstats&query=%24.totals.regions&label=r%C3%A9gions&color=c4532e&style=flat-square" alt="Régions"></a>
22 −<img src="https://img.shields.io/badge/connecteurs_plateforme-9-234438?style=flat-square" alt="Connecteurs">
22 +<img src="https://img.shields.io/badge/connecteurs_plateforme-10-234438?style=flat-square" alt="Connecteurs">
23 23 <img src="https://img.shields.io/badge/cat%C3%A9gories-20-234438?style=flat-square" alt="Catégories">
24 24
25 25 <img src="https://img.shields.io/badge/Python-FastAPI-3776ab?style=flat-square&logo=python&logoColor=white" alt="Python FastAPI">
@@ -43,7 +43,7 @@
43 43
44 44 ## Description
45 45
46 −**Fabri-Ka** est le **répertoire des produits québécois** : un agrégateur de découverte qui recense **385 308 produits** (au 2026-08-24) provenant de **1 582 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.
46 +**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.
47 47
48 48 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**).
49 49
@@ -51,17 +51,82 @@ Acheter québécois demande de connaître des centaines de boutiques dispersées
51 51
52 52 ## Fonctionnalités
53 53
54 −- **Recherche de produits** — plein-texte **FTS5 accent-insensible** sur **385 308 produits**, filtres **catégorie / région / origine / prix**, tri, pagination, fiches riches (galerie, boutique, produits liés).
55 −- **Répertoire de boutiques** — **1 582 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.
54 +- **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).
55 +- **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.
56 56 - **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).
57 57 - **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).
58 58 - **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).
59 59 - **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).
60 +- **« 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.
60 61 - **KA ID (SSO)** + favoris **« Mon univers Ka »** synchronisés au hub **groupe-ka.com**.
61 62 - **Widget KA Agent** — bulle de chat Groupe KA (`ka-agent.js`).
62 63 - **Mobile-first** — barre d'onglets, filtres en bottom sheet, galeries swipe, CTA collant, PWA-lite, **fr-CA** d'abord.
63 64 - **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.
64 65
66 +## Visite guidée
67 +
68 +*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).*
69 +
70 +### 1 · Accueil — [`/`](https://www.fabri-ka.com/)
71 +
72 +<img src="docs/screenshots/01-accueil.jpg" width="760" alt="Accueil de Fabri-Ka">
73 +
74 +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 ».
75 +
76 +### 2 · Catalogue de produits — [`/produits`](https://www.fabri-ka.com/produits)
77 +
78 +<img src="docs/screenshots/02-produits.jpg" width="760" alt="Catalogue des produits">
79 +
80 +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).
81 +
82 +### 3 · Répertoire des boutiques — [`/boutiques`](https://www.fabri-ka.com/boutiques)
83 +
84 +<img src="docs/screenshots/03-boutiques.jpg" width="760" alt="Répertoire des boutiques">
85 +
86 +**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.
87 +
88 +### 4 · Statistiques — [`/stats`](https://www.fabri-ka.com/stats)
89 +
90 +<img src="docs/screenshots/04-stats.jpg" width="760" alt="Tableau de bord statistiques">
91 +
92 +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).
93 +
94 +### 5 · À propos — [`/a-propos`](https://www.fabri-ka.com/a-propos)
95 +
96 +<img src="docs/screenshots/05-a-propos.jpg" width="760" alt="Page À propos">
97 +
98 +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.
99 +
100 +### 6 · Contact — [`/contact`](https://www.fabri-ka.com/contact)
101 +
102 +<img src="docs/screenshots/06-contact.jpg" width="760" alt="Page contact">
103 +
104 +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é).
105 +
106 +### 7 · Inscrire mon atelier — [`/inscrire`](https://www.fabri-ka.com/inscrire)
107 +
108 +<img src="docs/screenshots/07-inscrire.jpg" width="760" alt="Formulaire Inscrire mon atelier">
109 +
110 +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.
111 +
112 +### 8 · Page catégorie — [`/categorie/alcool`](https://www.fabri-ka.com/categorie/alcool)
113 +
114 +<img src="docs/screenshots/08-categorie-alcool.jpg" width="760" alt="Page catégorie alcool">
115 +
116 +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).
117 +
118 +### 9 · Page région — [`/region/abitibi-temiscamingue`](https://www.fabri-ka.com/region/abitibi-temiscamingue)
119 +
120 +<img src="docs/screenshots/09-region-abitibi-temiscamingue.jpg" width="760" alt="Page région Abitibi-Témiscamingue">
121 +
122 +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.
123 +
124 +### 10 · Documentation — [`/doc/`](https://www.fabri-ka.com/doc/)
125 +
126 +<img src="docs/screenshots/10-doc.jpg" width="760" alt="Documentation en ligne">
127 +
128 +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.
129 +
65 130 ### Galerie
66 131
67 132 *Captures du 2026-08-25 — DA v3 « catalogue éditorial » (mobile 390×844 · desktop 1440×900).*
@@ -100,15 +165,15 @@ Acheter québécois demande de connaître des centaines de boutiques dispersées
100 165
101 166 > 🗄️ Les captures d'époque sont conservées dans [`docs/archive/`](docs/archive/).
102 167
103 −## Chiffres (au 2026-08-24, `/api/stats` live + registre)
168 +## Chiffres (au 2026-08-28, `/api/stats` live + registre)
104 169
105 170 | Mesure | Valeur |
106 171 |---|---|
107 −| Produits agrégés (catalogues complets) | **385 308** (dont 370 533 avec prix — prix médian 25 $, moyen 228 $) |
108 −| Boutiques avec produits en ligne | **1 582** |
172 +| Produits agrégés (catalogues complets) | **384 535** publiés (prix médian ~25 $) |
173 +| Boutiques avec produits en ligne | **1 580** |
109 174 | 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 |
110 175 | Régions administratives couvertes | **17 / 17** (Montréal 56 k produits · Outaouais 32 k · Saguenay–Lac-Saint-Jean 24 k · …) |
111 −| Connecteurs plateforme | **9** — boutiques actives : Shopify 715 · WooCommerce 545 · Wix 302 · Votresite.ca 45 · Square 36 · Squarespace 27 · générique 22 · autres 9 |
176 +| 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 |
112 177 | Classes d'origine au registre | A : 3 863 · E : 180 · C : 39 |
113 178 | Catégories | **20** (épicerie fine 44 k · mode 43 k · bijoux 39 k · …) |
114 179 | Pages indexables (produits + boutiques + programmatiques) | **385 000+** |
@@ -123,7 +188,7 @@ Détails et méthodologie : [`deliverables/research_report.md`](deliverables/res
123 188 | **Backend** | **Python 3.14** · **FastAPI** (API + SSR SEO + service du frontend) |
124 189 | **Base de données** | **SQLite + FTS5** — upsert par **hash de contenu**, retraits avec délai de grâce (2 syncs) |
125 190 | **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** |
126 −| **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) · **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) |
191 +| **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) |
127 192 | **Découverte** | **35+ sources** : sitemaps d'annuaires, API cachées de cartes (wpgmza, FacetWP), pagination htmx, sessions **Firecrawl** pour répertoires JS |
128 193 | **Comptes** | **KA ID** SSO (JWT HS256, stdlib pure) · favoris HMAC-SHA256 vers le hub central |
129 194 | **Prod** | **PM2** + **ngrok** sur le cluster **MacLustr** (nœud M4M64a) |
@@ -180,23 +245,25 @@ Le site est une SPA React, mais **aucun moteur de recherche ne voit une page vid
180 245 | `/api/stats/extended` | GET | stats riches : médianes, histogrammes, croissance, ventilation par catégorie |
181 246 | `/api/report.pdf` | GET | rapport de marché PDF — généré à la volée (5 modes + `ReportBuilder` personnalisé) |
182 247 | `/api/sync` | POST | déclenche une synchronisation en arrière-plan |
248 +| `/api/inscriptions` · `…/{id}/decision` | POST/GET | auto-inscription des artisans (« Inscrire mon atelier ») — dépôt public en quarantaine, liste + décision admin |
183 249 | `/api/auth/ka/login` → `…/callback` · `/api/auth/me` · `/api/auth/logout` | GET/POST | SSO **KA ID** |
184 250 | `/api/favorites` · `/api/favorites/toggle` | GET/POST | favoris « Mon univers Ka » (hub central) |
185 251 | `/robots.txt` · `/sitemap.xml` (+ sous-sitemaps) | GET | infrastructure SEO |
186 252
187 253 ## Connecteurs & cadences
188 254
189 −**9 connecteurs plateforme** (`fabrika/connectors/`) pilotés par le registre `data/stores.json` :
255 +**10 connecteurs plateforme** (`fabrika/connectors/`) pilotés par le registre `data/stores.json` :
190 256
191 257 | Connecteur | Boutiques actives | Technique | Cadence |
192 258 |---|---|---|---|
193 −| `shopify.py` | 715 | `products.json` paginé, transport curl anti-429, retry durci | resync complète aux 6 h |
194 −| `woocommerce.py` | 545 | Store API `/wp-json/wc/store/v1/products` + fallback sitemap → fiches | aux 6 h |
259 +| `shopify.py` | 718 | `products.json` paginé, transport curl anti-429, retry durci | resync complète aux 6 h |
260 +| `woocommerce.py` | 542 | Store API `/wp-json/wc/store/v1/products` + fallback sitemap → fiches | aux 6 h |
195 261 | `wix.py` | 302 | GraphQL storefront public (jeton public) | aux 6 h |
196 262 | `votresite.py` | 45 | plateforme QC (Drupal 8 + OpenCart) : sitemap ou crawl catégories → fiche par fiche | aux 6 h |
197 263 | `square.py` | 36 | API storefront publique v13, IDs extraits du HTML | aux 6 h |
198 −| `squarespace.py` | 27 | `?format=json` par collection | aux 6 h |
264 +| `squarespace.py` | 26 | `?format=json` par collection | aux 6 h |
199 265 | `generic.py` | 22 | sitemap → JSON-LD/microdata/OG (PrestaShop, Lightspeed, Snipcart, Magento, custom) | aux 6 h |
266 +| `immunotec.py` | 1 | storefront sur mesure (Next.js + backend Exigo) derrière Cloudflare — « mur produits » via Scrapfly ASP | aux 6 h |
200 267 | `scrapfly.py` / Firecrawl | secours | rendu JS / anti-bot pour les sites qui bloquent | à la demande |
201 268
202 269 - Journal `sync_log` par boutique (found/added/updated/removed + raison d'échec), exposé par `/api/stats`.
@@ -212,7 +279,7 @@ Le site est une SPA React, mais **aucun moteur de recherche ne voit une page vid
212 279 | **D** | Mixte |
213 280 | **E** | Incertain — à vérifier |
214 281
215 −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-24) : **A 3 863 · E 180 · C 39**.
282 +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**.
216 283
217 284 ## Structure du projet
218 285
@@ -228,7 +295,8 @@ fabri-ka/
228 295 │ ├── auth.py # SSO « KA ID » (JWT HS256, zéro dépendance)
229 296 │ ├── hubfav.py # favoris poussés au hub Groupe KA (HMAC)
230 297 │ ├── hubprofile.py # profil membre lu du hub
231 −│ └── connectors/ # shopify · woocommerce · wix · squarespace · square · votresite · generic · scrapfly
298 +│ ├── inscriptions.py # auto-inscription des artisans (« Inscrire mon atelier », quarantaine)
299 +│ └── connectors/ # shopify · woocommerce · wix · squarespace · square · votresite · immunotec · generic · scrapfly
232 300 ├── frontend/ # React 18 + Vite + TS — 9 pages, PWA-lite, fr-CA
233 301 ├── scripts/ # pipeline de découverte (harvest → aggregate → verify → registry),
234 302 │ # enrichissements (contacts, livraison, collections), reprobe, docs connecteurs
added docs/screenshots/01-accueil.jpg +0 −0

Binary file not shown.

added docs/screenshots/02-produits.jpg +0 −0

Binary file not shown.

added docs/screenshots/03-boutiques.jpg +0 −0

Binary file not shown.

added docs/screenshots/04-stats.jpg +0 −0

Binary file not shown.

added docs/screenshots/05-a-propos.jpg +0 −0

Binary file not shown.

added docs/screenshots/06-contact.jpg +0 −0

Binary file not shown.

added docs/screenshots/07-inscrire.jpg +0 −0

Binary file not shown.

added docs/screenshots/08-categorie-alcool.jpg +0 −0

Binary file not shown.

added docs/screenshots/09-region-abitibi-temiscamingue.jpg +0 −0

Binary file not shown.

added docs/screenshots/10-doc.jpg +0 −0

Binary file not shown.