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
6 h agolast push
Python 38.4% HTML 30.3% TypeScript 17.2% CSS 11% JavaScript 3.2%

Revert "docs: README v2 — galerie multi-pages, style du site, documentation, contact"

This reverts commit 728ff96858ca7e914b815479a7f022842fcc2672.
Simon-Pierre Boucher committed 1 mo ago (Aug 24, 2026) parent 052a7ad

1 changed file +29 −115

modified README.md +29 −115
@@ -1,56 +1,26 @@
1 −<p align="center">
2 − <a href="https://www.fabri-ka.com"><img src="https://www.fabri-ka.com/og.png" width="760" alt="Fabri·Ka — Les produits fabriqués au Québec"></a>
3 −</p>
4 −
5 −<h1 align="center">Fabri·Ka</h1>
1 +# Fabri·Ka
6 2
7 −<p align="center"><b>Le répertoire des produits québécois : plus de 300 000 produits de 1 377 boutiques d'ici, trouvables au même endroit.</b></p>
3 +**Le répertoire des produits québécois : plus de 300 000 produits de 1 377 boutiques d'ici, trouvables au même endroit.**
8 4
9 −<p align="center">
10 − <a href="https://www.fabri-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.fabri-ka.com&style=flat-square&label=www.fabri-ka.com&up_color=c4532e" alt="Site"></a>
11 − <a href="https://www.fabri-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-c4532e?style=flat-square" alt="Documentation"></a>
12 − <a href="https://www.fabri-ka.com/doc/fabri-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-c4532e?style=flat-square" alt="Guide PDF"></a>
13 − <img src="https://img.shields.io/badge/n%C5%93ud-M4M64a-1f6feb?style=flat-square" alt="Nœud">
14 − <img src="https://img.shields.io/badge/port-8097-555?style=flat-square" alt="Port">
15 − <img src="https://img.shields.io/badge/process-PM2-2b037a?style=flat-square" alt="PM2">
16 − <img src="https://img.shields.io/badge/Python-FastAPI-3776ab?style=flat-square&logo=python&logoColor=white" alt="Python FastAPI">
17 − <img src="https://img.shields.io/badge/React_18-Vite_%2B_TS-61dafb?style=flat-square&logo=react&logoColor=black" alt="React 18">
18 − <img src="https://img.shields.io/badge/SQLite-FTS5-003b57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite FTS5">
19 − <img src="https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square" alt="Groupe KA">
20 −</p>
5 +[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.fabri-ka.com&style=flat-square&label=www.fabri-ka.com)](https://www.fabri-ka.com)
6 +![Nœud](https://img.shields.io/badge/n%C5%93ud-M4M64a-1f6feb?style=flat-square)
7 +![Port](https://img.shields.io/badge/port-8097-555?style=flat-square)
8 +![PM2](https://img.shields.io/badge/process-PM2-2b037a?style=flat-square)
9 +![Python](https://img.shields.io/badge/Python-FastAPI-3776ab?style=flat-square&logo=python&logoColor=white)
10 +![React](https://img.shields.io/badge/React_18-Vite_%2B_TS-61dafb?style=flat-square&logo=react&logoColor=black)
11 +![SQLite](https://img.shields.io/badge/SQLite-FTS5-003b57?style=flat-square&logo=sqlite&logoColor=white)
12 +![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square)
21 13
22 14 **Fabri-Ka** est un **agrégateur de découverte de produits québécois** : **301 534 produits** provenant de **1 377 boutiques en ligne** du Québec (sur **3 507 boutiques vérifiées** au registre), couvrant les **17 régions administratives** de la province. Chaque produit renvoie vers la **boutique d'origine** — aucune vente sur Fabri-Ka : prix, photos et stocks appartiennent aux marchands sources.
23 15
24 16 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** (35+ sources : certifications, associations, annuaires, marques régionales) recense les boutiques et les classe par **origine de fabrication (A–E)** avec évidence conservée ; des **connecteurs par plateforme ecommerce** — et non par site — aspirent les catalogues publics (le même code Shopify sert des centaines de boutiques, piloté par le registre `data/stores.json`) ; un **moteur de recherche plein-texte FTS5** les rend trouvables par catégorie, région, origine et prix.
25 17
26 −## Visite guidée
27 −
28 −<table>
29 − <tr>
30 − <td align="center"><img src="frontend/public/doc/img/etape1.png" width="420"><br><sub><b>Accueil — le répertoire des produits d'ici : recherche, compteurs live et parcours par catégorie</b></sub></td>
31 − <td align="center"><img src="frontend/public/doc/img/etape2.png" width="420"><br><sub><b>Recherche « érable » — 6 716 produits, filtres catégorie / région / origine et badges A–E</b></sub></td>
32 − </tr>
33 − <tr>
34 − <td align="center"><img src="frontend/public/doc/img/etape3.png" width="420"><br><sub><b>Fiche produit — badge « A · Fabriqué au Québec », marque, catégorie et renvoi direct vers la boutique</b></sub></td>
35 − <td align="center"><img src="frontend/public/doc/img/etape4.png" width="420"><br><sub><b>Répertoire des boutiques — plateforme, région, origine et taille de catalogue pour chaque marchand</b></sub></td>
36 − </tr>
37 − <tr>
38 − <td align="center"><img src="docs/screenshots/categorie.png" width="420"><br><sub><b>Page catégorie SEO — « Érable & miel du Québec », l'une des ~350 pages programmatiques</b></sub></td>
39 − <td align="center"><img src="docs/screenshots/catalogue.png" width="420"><br><sub><b>Tout le catalogue — pagination plein-texte FTS5 sur l'ensemble des produits agrégés</b></sub></td>
40 − </tr>
41 − <tr>
42 − <td align="center"><img src="docs/screenshots/boutique.png" width="420"><br><sub><b>Fiche boutique — évidence de classification, fourchette de prix, dernière synchro et catalogue filtrable</b></sub></td>
43 − <td align="center"><img src="docs/screenshots/boutique-medusa.png" width="420"><br><sub><b>Fiche boutique (Bijoux Medusa) — trouvée par balayage dédié, ventilation par catégories</b></sub></td>
44 − </tr>
45 − <tr>
46 − <td align="center"><img src="docs/screenshots/stats.png" width="420"><br><sub><b>Stats — « Le Québec qui vend en ligne, en chiffres » + rapport de marché PDF téléchargeable</b></sub></td>
47 − <td align="center"><img src="docs/screenshots/stats-page.png" width="420"><br><sub><b>Stats — répartition des prix et ventilation par catégorie, recalculées en continu</b></sub></td>
48 − </tr>
49 − <tr>
50 − <td align="center"><img src="docs/screenshots/fabri-ka-mobile.png" width="420"><br><sub><b>Mobile — accueil avec barre d'onglets basse (accueil / produits / boutiques / recherche)</b></sub></td>
51 − <td align="center"><img src="docs/screenshots/mobile-produit.png" width="420"><br><sub><b>Mobile — fiche produit avec bouton d'achat collant vers la boutique d'origine</b></sub></td>
52 − </tr>
53 −</table>
18 +## Captures d'écran
19 +
20 +<p align="center">
21 + <img src="docs/screenshots/fabri-ka-desktop.png" width="640" alt="Accueil — desktop">
22 + <img src="docs/screenshots/fabri-ka-mobile.png" width="200" alt="Accueil — mobile">
23 +</p>
54 24
55 25 ## Fonctionnalités
56 26
@@ -64,49 +34,6 @@ Acheter québécois demande de connaître des centaines de boutiques dispersées
64 34 - **Mobile-first** — barre d'onglets, filtres en bottom sheet, galeries swipe, fr-CA d'abord.
65 35 - **Formulaire d'inscription** pour les marchands (`fabrika/inscriptions.py`).
66 36
67 −## API principale
68 −
69 −Toutes les données servies au frontend passent par une API JSON publique (FastAPI) :
70 −
71 −| Endpoint | Rôle |
72 −|---|---|
73 −| `GET /api/products` | recherche paginée FTS5 : mot-clé, catégorie, région, origine A–E, fourchette de prix, tri |
74 −| `GET /api/products/{uid}` | fiche complète d'un produit (galerie, boutique, produits liés) |
75 −| `GET /api/stores` · `GET /api/stores/{store_id}` | répertoire des boutiques et fiche enrichie (stats de prix, livraison, catégories) |
76 −| `GET /api/facets` | facettes dynamiques (catégories, régions, origines, comptes) |
77 −| `GET /api/stats` · `/api/stats/extended` · `/api/stats/dashboard` | métriques agrégées et tableau de bord |
78 −| `GET /api/report.pdf` · `/api/stats/report` · `/api/stats/catalog` · `POST /api/stats/report/custom` | rapports de marché PDF (standard et personnalisés) |
79 −| `POST /api/sync` | déclenchement d'une synchronisation |
80 −| `GET /robots.txt` · `/sitemap.xml` · `/sitemap-{name}.xml` | infrastructure SEO (sitemaps par chunks de 40 000 URLs) |
81 −
82 −## Pipeline de découverte & connecteurs
83 −
84 −**1. Découverte des boutiques** (`scripts/`) — harvest → aggregate → verify → classify → enrich, alimenté par 35+ sources (certifications, associations sectorielles, annuaires, marques régionales, balayages dédiés). Résultat : le registre `data/stores.json` — **3 507 boutiques QC vérifiées**, chacune classée par **origine de fabrication** avec évidence conservée :
85 −
86 −| Classe | Signification |
87 −|---|---|
88 −| **A** | Fabriqué au Québec |
89 −| **B** | Conçu au Québec |
90 −| **C** | Détaillant québécois |
91 −| **D** | Mixte |
92 −| **E** | À vérifier |
93 −
94 −**2. Aspiration des catalogues** (`fabrika/connectors/`) — **9 connecteurs par plateforme ecommerce**, et non par site : le même code sert des centaines de boutiques, piloté par le registre :
95 −
96 −| Connecteur | Technique |
97 −|---|---|
98 −| Shopify | `products.json` paginé, transport curl anti-429 |
99 −| WooCommerce | Store API |
100 −| Wix Stores | GraphQL |
101 −| Squarespace | `?format=json` |
102 −| Square Online | API publique du storefront |
103 −| Votresite.ca | extraction dédiée (plateforme québécoise) |
104 −| Immunotec | connecteur spécifique |
105 −| Générique | sitemap → JSON-LD / microdata / OpenGraph |
106 −| Scrapfly / Firecrawl | secours anti-bot pour les sites récalcitrants |
107 −
108 −**3. Ingestion** (`fabrika/ingest.py`) — upsert par **hash de contenu**, retraits avec **délai de grâce (2 syncs)**, journal `sync_log` par boutique. **Cadence : resynchronisation des catalogues aux 6 heures** (`run.py watch 360`, processus `fabri-ka-sync`).
109 −
110 37 ## Architecture
111 38
112 39 | Composant | Rôle |
@@ -139,12 +66,6 @@ Toutes les données servies au frontend passent par une API JSON publique (FastA
139 66 | `deliverables/` / `logs/` | exports produits par les scripts et journaux |
140 67 | `run.py` / `requirements.txt` | point d'entrée CLI (`sync`, `watch`, `serve`, `registry`) et dépendances backend |
141 68
142 −## Documentation
143 −
144 −- **Guide d'utilisation en ligne** : [www.fabri-ka.com/doc/](https://www.fabri-ka.com/doc/) — visite pas à pas du site (accueil, recherche, fiche produit, répertoire des boutiques), avec captures annotées.
145 −- **Guide PDF téléchargeable** : [fabri-ka-documentation.pdf](https://www.fabri-ka.com/doc/fabri-ka-documentation.pdf) — la même documentation, mise en page aux couleurs du site.
146 −- Les captures du guide sont versionnées dans `frontend/public/doc/img/` (servies telles quelles par le site).
147 −
148 69 ## Développement (remote-first)
149 70
150 71 La **source de vérité est le repo git sur le nœud M4M64a** (`~/fabri-ka`) — pas une copie laptop. Toute modification se fait sur le nœud via SSH : édition, build, redémarrage, puis commit/push depuis le nœud (agent forwarding actif).
@@ -178,26 +99,19 @@ En production sur le **nœud M4M64a** du cluster MacLustr (`~/fabri-ka`), servi
178 99
179 100 ## Écosystème Groupe KA
180 101
181 −| Plateforme | Univers |
182 −|---|---|
183 −| [groupe-ka.com](https://www.groupe-ka.com) | portail & KA ID |
184 −| [lou-ka.com](https://www.lou-ka.com) | logements à louer |
185 −| [immo-ka.com](https://www.immo-ka.com) | propriétés à vendre |
186 −| [vrai-prix.com](https://www.vrai-prix.com) | estimation immobilière |
187 −| [auto-ka.com](https://www.auto-ka.com) | véhicules |
188 −| [fabri-ka.com](https://www.fabri-ka.com) | produits québécois |
189 −| [food-ka.com](https://www.food-ka.com) | épicerie/alimentation |
190 −| [resto-ka.com](https://www.resto-ka.com) | restaurants |
191 −| [sorti-ka.com](https://www.sorti-ka.com) | sorties et événements |
192 −| [job-ka.com](https://www.job-ka.com) | emplois |
193 −| [crea-ka.com](https://www.crea-ka.com) | créateurs |
194 −| [trouve-ka.com](https://www.trouve-ka.com) | petites annonces |
195 −| [api-ka.com](https://www.api-ka.com) | API de données |
196 −
197 −## Contact
198 −
199 −**Simon-Pierre Boucher** — fondateur, Groupe KA
200 −📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)
102 +- [groupe-ka.com](https://www.groupe-ka.com) — portail
103 +- [lou-ka.com](https://www.lou-ka.com) — logements à louer
104 +- [immo-ka.com](https://www.immo-ka.com) — propriétés à vendre
105 +- [vrai-prix.com](https://www.vrai-prix.com) — estimation immobilière
106 +- [auto-ka.com](https://www.auto-ka.com) — véhicules
107 +- [fabri-ka.com](https://www.fabri-ka.com) — produits québécois
108 +- [food-ka.com](https://www.food-ka.com) — épicerie/alimentation
109 +- [resto-ka.com](https://www.resto-ka.com) — restaurants
110 +- [sorti-ka.com](https://www.sorti-ka.com) — sorties et événements
111 +- [job-ka.com](https://www.job-ka.com) — emplois
112 +- [crea-ka.com](https://www.crea-ka.com) — créateurs
113 +- [trouve-ka.com](https://www.trouve-ka.com) — petites annonces
114 +- [api-ka.com](https://www.api-ka.com) — API de données
201 115
202 116 ---
203 117
204 118