docs: README v2 — galerie multi-pages, style du site, documentation, contact
1 changed file +115 −29
modified
README.md
+115 −29
@@ -1,26 +1,56 @@ | ||
| 1 | −# Fabri·Ka | |
| 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> | |
| 2 | 6 | |
| 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.** | |
| 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> | |
| 4 | 8 | |
| 5 | −[](https://www.fabri-ka.com) | |
| 6 | − | |
| 7 | − | |
| 8 | − | |
| 9 | − | |
| 10 | − | |
| 11 | − | |
| 12 | − | |
| 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> | |
| 13 | 21 | |
| 14 | 22 | **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. |
| 15 | 23 | |
| 16 | 24 | 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. |
| 17 | 25 | |
| 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> | |
| 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> | |
| 24 | 54 | |
| 25 | 55 | ## Fonctionnalités |
| 26 | 56 | |
@@ -34,6 +64,49 @@ Acheter québécois demande de connaître des centaines de boutiques dispersées | ||
| 34 | 64 | - **Mobile-first** — barre d'onglets, filtres en bottom sheet, galeries swipe, fr-CA d'abord. |
| 35 | 65 | - **Formulaire d'inscription** pour les marchands (`fabrika/inscriptions.py`). |
| 36 | 66 | |
| 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 | + | |
| 37 | 110 | ## Architecture |
| 38 | 111 | |
| 39 | 112 | | Composant | Rôle | |
@@ -66,6 +139,12 @@ Acheter québécois demande de connaître des centaines de boutiques dispersées | ||
| 66 | 139 | | `deliverables/` / `logs/` | exports produits par les scripts et journaux | |
| 67 | 140 | | `run.py` / `requirements.txt` | point d'entrée CLI (`sync`, `watch`, `serve`, `registry`) et dépendances backend | |
| 68 | 141 | |
| 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 | + | |
| 69 | 148 | ## Développement (remote-first) |
| 70 | 149 | |
| 71 | 150 | 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). |
@@ -99,19 +178,26 @@ En production sur le **nœud M4M64a** du cluster MacLustr (`~/fabri-ka`), servi | ||
| 99 | 178 | |
| 100 | 179 | ## Écosystème Groupe KA |
| 101 | 180 | |
| 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 | |
| 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) | |
| 115 | 201 | |
| 116 | 202 | --- |
| 117 | 203 | |
| 118 | 204 | |