SPB Git

spb/resto-ka

Public

Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)

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

Simon-Pierre Boucher committed (Aug 24, 2026) parent b8fc713 Browse files

1 changed file +109 −38

Unified Split
modified README.md +109 −38
@@ -1,30 +1,55 @@
1 <!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai --> 1 <!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai -->
2 2
3−# Resto·Ka 3+<p align="center">
4− 4+ <a href="https://www.resto-ka.com"><img src="https://www.resto-ka.com/og.png" width="760" alt="Resto·Ka — Chaque resto, chaque plat, chaque prix"></a>
5−**Tous les restaurants du Québec — menus complets et prix réels, comparables et cherchables dans les 17 régions.** 5+</p>
6− 6+<h1 align="center">Resto·Ka</h1>
7−[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.resto-ka.com&style=flat-square&label=www.resto-ka.com)](https://www.resto-ka.com) 7+<p align="center"><b>Chaque resto, chaque plat, chaque prix</b></p>
8−![Nœud](https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square)
9−![Port](https://img.shields.io/badge/port-8115-141814?style=flat-square)
10−![PM2](https://img.shields.io/badge/process-PM2-2b037a?style=flat-square)
11 8
12−![Python](https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white) 9+<p align="center">
13−![FastAPI](https://img.shields.io/badge/FastAPI-API-009688?style=flat-square&logo=fastapi&logoColor=white) 10+ <a href="https://www.resto-ka.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwww.resto-ka.com&style=flat-square&label=www.resto-ka.com&up_color=f08c00&up_message=en%20ligne" alt="Site"></a>
14−![React](https://img.shields.io/badge/React_18-Vite_+_TS-087EA4?style=flat-square&logo=react&logoColor=white) 11+ <a href="https://www.resto-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-f08c00?style=flat-square" alt="Documentation"></a>
15−![SQLite](https://img.shields.io/badge/SQLite-menus_+_prix-003B57?style=flat-square&logo=sqlite&logoColor=white) 12+ <a href="https://www.resto-ka.com/doc/resto-ka-documentation.pdf"><img src="https://img.shields.io/badge/guide-PDF-f08c00?style=flat-square" alt="PDF"></a>
16−![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square) 13+ <img src="https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square" alt="Nœud">
14+ <img src="https://img.shields.io/badge/port-8115-141814?style=flat-square" alt="Port">
15+ <img src="https://img.shields.io/badge/process-PM2-2b037a?style=flat-square" alt="PM2">
16+</p>
17+<p align="center">
18+ <img src="https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python">
19+ <img src="https://img.shields.io/badge/FastAPI-API-009688?style=flat-square&logo=fastapi&logoColor=white" alt="FastAPI">
20+ <img src="https://img.shields.io/badge/React_18-Vite_+_TS-087EA4?style=flat-square&logo=react&logoColor=white" alt="React">
21+ <img src="https://img.shields.io/badge/SQLite-menus_+_prix-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite">
22+ <img src="https://img.shields.io/badge/Groupe-KA-f08c00?style=flat-square" alt="Groupe KA">
23+</p>
17 24
18 **Resto·Ka** ([www.resto-ka.com](https://www.resto-ka.com)) est l'**agrégateur exhaustif des restaurants du Québec** : chaque resto, chaque plat, chaque prix — dans les 17 régions administratives, au même endroit, comparable et cherchable **par resto ou par plat**. Les prix sont des **prix takeout réels, non majorés**, captés sur la plateforme de commande des restos eux-mêmes (pas sur les apps de livraison, majorées de 25-30 %). 25 **Resto·Ka** ([www.resto-ka.com](https://www.resto-ka.com)) est l'**agrégateur exhaustif des restaurants du Québec** : chaque resto, chaque plat, chaque prix — dans les 17 régions administratives, au même endroit, comparable et cherchable **par resto ou par plat**. Les prix sont des **prix takeout réels, non majorés**, captés sur la plateforme de commande des restos eux-mêmes (pas sur les apps de livraison, majorées de 25-30 %).
19 26
20 **En chiffres** (base de production) : **14 091 restaurants** référencés (découverte OpenStreetMap, 17/17 régions), **79 159 plats avec prix**, **738 restos avec menu complet**, **24 chaînes suivies**, 98 % des items avec photo, 99 % géolocalisés. Pour qui ? Quiconque veut répondre à « qu'est-ce que je mange, où, et combien ça coûte ? » sans ouvrir quinze applis — là où les apps de livraison majorent et où les annuaires (Google, Yelp) n'ont ni menus structurés ni prix comparables. 27 **En chiffres** (base de production) : **14 091 restaurants** référencés (découverte OpenStreetMap, 17/17 régions), **79 159 plats avec prix**, **738 restos avec menu complet**, **24 chaînes suivies**, 98 % des items avec photo, 99 % géolocalisés. Pour qui ? Quiconque veut répondre à « qu'est-ce que je mange, où, et combien ça coûte ? » sans ouvrir quinze applis — là où les apps de livraison majorent et où les annuaires (Google, Yelp) n'ont ni menus structurés ni prix comparables.
21 28
22−## Captures d'écran 29+## Visite guidée
23− 30+
24−<p align="center"> 31+<table>
25− <img src="docs/screenshots/resto-ka-desktop.png" width="640" alt="Accueil — desktop"> 32+ <tr>
26− <img src="docs/screenshots/resto-ka-mobile.png" width="200" alt="Accueil — mobile"> 33+ <td align="center"><img src="docs/screenshots/resto-ka-desktop.png" width="420"><br><sub><b>Accueil — recherche par resto ou par plat (desktop)</b></sub></td>
27−</p> 34+ <td align="center"><img src="docs/screenshots/resto-ka-mobile.png" width="220"><br><sub><b>Accueil — version mobile</b></sub></td>
35+ </tr>
36+ <tr>
37+ <td align="center"><img src="frontend/public/doc/img/etape1.png" width="420"><br><sub><b>Étape 1 · Cherchez un resto ou un plat depuis l'accueil</b></sub></td>
38+ <td align="center"><img src="frontend/public/doc/img/etape2.png" width="420"><br><sub><b>Étape 2 · Parcourez les restos d'une ville</b></sub></td>
39+ </tr>
40+ <tr>
41+ <td align="center"><img src="frontend/public/doc/img/etape3.png" width="420"><br><sub><b>Étape 3 · Ouvrez la fiche d'un restaurant</b></sub></td>
42+ <td align="center"><img src="frontend/public/doc/img/etape4.png" width="420"><br><sub><b>Étape 4 · Comparez le marché sur /stats</b></sub></td>
43+ </tr>
44+ <tr>
45+ <td align="center"><img src="docs/screenshots/accueil.png" width="420"><br><sub><b>Accueil — variante pleine page</b></sub></td>
46+ <td align="center"><img src="docs/screenshots/fiche.png" width="420"><br><sub><b>Fiche restaurant — menu structuré et prix contextualisés</b></sub></td>
47+ </tr>
48+ <tr>
49+ <td align="center"><img src="docs/screenshots/plats.png" width="420"><br><sub><b>Recherche par plat — 79 159 items, groupés par marque</b></sub></td>
50+ <td align="center"><img src="docs/screenshots/stats.png" width="420"><br><sub><b>Tableau de bord /stats — le marché resto en chiffres</b></sub></td>
51+ </tr>
52+</table>
28 53
29 ## Fonctionnalités 54 ## Fonctionnalités
30 55
@@ -38,6 +63,37 @@
38 - **Connexion KA ID** (SSO Groupe KA), favoris unifiés « Mon univers Ka », tableau de bord `/stats` + rapports PDF (catalogue + ReportBuilder), widget **KA Agent** (chat IA). 63 - **Connexion KA ID** (SSO Groupe KA), favoris unifiés « Mon univers Ka », tableau de bord `/stats` + rapports PDF (catalogue + ReportBuilder), widget **KA Agent** (chat IA).
39 - **Registre des sources** — `data/sources.json`, à consulter avant tout ajout (statut et raison des sources non connectables). 64 - **Registre des sources** — `data/sources.json`, à consulter avant tout ajout (statut et raison des sources non connectables).
40 65
66+## API (endpoints principaux)
67+
68+Servis par `restoka/web.py` (FastAPI) sur le port 8115.
69+
70+| Endpoint | Rôle |
71+|---|---|
72+| `GET /api/restaurants` | recherche de restos (ville, région, cuisine, texte libre, pagination) |
73+| `GET /api/restaurants/{uid}` | fiche complète : menu structuré par contexte de prix, photos, coordonnées |
74+| `GET /api/restaurants/{uid}/prices` | historique des prix des items du resto |
75+| `GET /api/restaurants/{uid}/inspections` | inspections/permis (enrichissements MAPAQ) |
76+| `GET /api/dishes` | recherche par plat dans les 79 159 items, groupée par marque |
77+| `GET /api/facets` · `GET /api/sources` | facettes de filtres, registre des sources |
78+| `GET /api/stats` · `/api/stats/dashboard` · `/report` · `/catalog` · `POST /api/stats/report/custom` | tableau de bord + rapports PDF (catalogue et personnalisés) |
79+| `GET /api/favorites` · `POST /api/favorites/toggle` | favoris « Mon univers Ka » (session KA ID) |
80+| `POST /api/sync` | déclenchement d'une synchronisation |
81+| `GET /healthz` | santé du service |
82+| `GET /doc/` | guide d'utilisation en ligne |
83+
84+## Connecteurs
85+
86+Auto-enregistrés dans `restoka/connectors/` (requests direct / Firecrawl / Scrapfly + cache détail dans `base.py`, résilience `_resilient.py`) :
87+
88+| Connecteur | Rôle |
89+|---|---|
90+| `osm` | découverte OpenStreetMap (Overpass) — 13 500+ établissements nommés, 17/17 régions |
91+| `ueat` | connecteur templatisé UEAT (API GraphQL) — menus takeout réels de 29 intégrations de chaînes |
92+| `siteresto` | menus publiés sur le site des restos indépendants |
93+| `sitefinder` | découverte du site web / de la plateforme de commande d'un resto |
94+| `ubereats` | complément livraison (prix marqués `delivery`, jamais prioritaires sur un menu salle) |
95+| `yelp` · `yelp_scrape` | enrichissement annuaire via yelp.ca (notes, nombre d'avis, gamme de prix, catégories, fermetures) |
96+
41 ## Architecture 97 ## Architecture
42 98
43 Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication → SQLite → API/frontend**. 99 Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication → SQLite → API/frontend**.
@@ -51,11 +107,13 @@ Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication
51 107
52 Processus PM2 sur le nœud : 108 Processus PM2 sur le nœud :
53 109
54−| Processus | Rôle | 110+| Processus | Rôle | Cadence |
55−|---|---| 111+|---|---|---|
56−| `resto-ka` | serveur FastAPI (API + frontend) sur le port **8115** | 112+| `resto-ka` | serveur FastAPI (API + frontend) sur le port **8115** | continu |
57−| `resto-ka-sync` | boucle de synchronisation hebdomadaire (`run.py watch`) | 113+| `resto-ka-sync` | boucle de synchronisation (`run.py watch 168`) | cycle hebdomadaire (168 h) |
58−| `resto-ka-ngrok` | tunnel ngrok vers **www.resto-ka.com** | 114+| `resto-ka-ngrok` | tunnel ngrok vers **www.resto-ka.com** | continu |
115+
116+Points de configuration notables (variables d'environnement, sans secrets dans le repo) : clés Scrapfly/Firecrawl des connecteurs, secret SSO partagé avec le hub KA ID. Le registre des sources vit dans `data/sources.json` ; la base SQLite de prod est gitignorée.
59 117
60 ## Structure du repo 118 ## Structure du repo
61 119
@@ -63,13 +121,19 @@ Processus PM2 sur le nœud :
63 resto-ka/ 121 resto-ka/
64 ├── run.py # point d'entrée CLI (sync / watch / serve) 122 ├── run.py # point d'entrée CLI (sync / watch / serve)
65 ├── restoka/ # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats… + connectors/ 123 ├── restoka/ # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats… + connectors/
66−├── frontend/ # React 18 + Vite + TypeScript — design éditorial sharp Groupe KA 124+├── frontend/ # React 18 + Vite + TypeScript — design éditorial sharp Groupe KA + public/doc/ (guide)
67 ├── data/ # sources.json (registre) + base SQLite de prod (gitignorée) 125 ├── data/ # sources.json (registre) + base SQLite de prod (gitignorée)
68 ├── scripts/ # scripts d'appoint (captures, déploiement) 126 ├── scripts/ # scripts d'appoint (captures, déploiement)
69 ├── tests/ # 45 tests pytest (fixtures réelles hors ligne) 127 ├── tests/ # 45 tests pytest (fixtures réelles hors ligne)
70 └── docs/ # captures d'écran + docs connecteurs 128 └── docs/ # captures d'écran + docs connecteurs
71 ``` 129 ```
72 130
131+## Documentation
132+
133+- **Guide en ligne** : [www.resto-ka.com/doc/](https://www.resto-ka.com/doc/) — à quoi sert le site, le parcours en 4 étapes (recherche → restos d'une ville → fiche → /stats), d'où viennent les données, FAQ.
134+- **Guide PDF** : [resto-ka-documentation.pdf](https://www.resto-ka.com/doc/resto-ka-documentation.pdf) — la même documentation, téléchargeable.
135+- Les captures du guide sont versionnées dans `frontend/public/doc/img/` (etape1 → etape4).
136+
73 ## Développement (remote-first) 137 ## Développement (remote-first)
74 138
75 **La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/resto-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, `pm2 restart`, puis commit/push depuis le nœud. 139 **La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/resto-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, `pm2 restart`, puis commit/push depuis le nœud.
@@ -99,19 +163,26 @@ pm2 restart resto-ka # après un changement en production
99 163
100 ## Écosystème Groupe KA 164 ## Écosystème Groupe KA
101 165
102−- [groupe-ka.com](https://www.groupe-ka.com) — portail du groupe et compte unique KA ID 166+| Plateforme | Vocation |
103−- [lou-ka.com](https://www.lou-ka.com) — logements à louer 167+|---|---|
104−- [immo-ka.com](https://www.immo-ka.com) — propriétés à vendre 168+| [groupe-ka.com](https://www.groupe-ka.com) | portail du groupe et compte unique KA ID |
105−- [vrai-prix.com](https://www.vrai-prix.com) — estimation immobilière 169+| [lou-ka.com](https://www.lou-ka.com) | logements à louer |
106−- [auto-ka.com](https://www.auto-ka.com) — véhicules 170+| [immo-ka.com](https://www.immo-ka.com) | propriétés à vendre |
107−- [fabri-ka.com](https://www.fabri-ka.com) — produits québécois 171+| [vrai-prix.com](https://www.vrai-prix.com) | estimation immobilière |
108−- [food-ka.com](https://www.food-ka.com) — épicerie et alimentation 172+| [auto-ka.com](https://www.auto-ka.com) | véhicules |
109−- [resto-ka.com](https://www.resto-ka.com) — restaurants *(ce repo)* 173+| [fabri-ka.com](https://www.fabri-ka.com) | produits québécois |
110−- [sorti-ka.com](https://www.sorti-ka.com) — sorties et événements 174+| [food-ka.com](https://www.food-ka.com) | épicerie et alimentation |
111−- [job-ka.com](https://www.job-ka.com) — emplois 175+| [resto-ka.com](https://www.resto-ka.com) | restaurants *(ce repo)* |
112−- [crea-ka.com](https://www.crea-ka.com) — créateurs de contenu 176+| [sorti-ka.com](https://www.sorti-ka.com) | sorties et événements |
113−- [trouve-ka.com](https://www.trouve-ka.com) — petites annonces 177+| [job-ka.com](https://www.job-ka.com) | emplois |
114−- [api-ka.com](https://www.api-ka.com) — API de données 178+| [crea-ka.com](https://www.crea-ka.com) | créateurs de contenu |
179+| [trouve-ka.com](https://www.trouve-ka.com) | petites annonces |
180+| [api-ka.com](https://www.api-ka.com) | API de données |
181+
182+## Contact
183+
184+**Simon-Pierre Boucher** — fondateur, Groupe KA
185+📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)
115 186
116 --- 187 ---
117 188
118 189
Menu

Theme