SPB Git forge

spb/resto-ka

Public

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

52commits 1branches 0releases
11.6 MBsize
maindefault branch
19 days agolast push
Python 69.3% TypeScript 16.7% CSS 7.9% JavaScript 4.7% HTML 1.4%

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

Simon-Pierre Boucher committed 26 days ago (Aug 29, 2026) parent f2fad4c

11 changed files +54 −51

modified README.md +54 −51
@@ -47,44 +47,37 @@
47 47
48 48 **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 %).
49 49
50 −**En chiffres** (live `/api/stats`, au 2026-08-24) : **14 716 restaurants actifs** (hors doublons, découverte OpenStreetMap, 17/17 régions), **149 569 plats avec prix**, **1 682 menus capturés** (1 268 takeout · 386 salle · 31 livraison), **180 chaînes identifiées** dont **116 intégrations UEAT découvertes**, 2 994 inspections MAPAQ importées, 1 859 restos avec permis d'alcool (RACJ), 155 312 entrées d'historique de prix, 80 % des items avec photo, 100 % des restos 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.
50 +**En chiffres** (live `/api/stats`, au 2026-08-28) : **21 217 restaurants actifs** (hors doublons, découverte OpenStreetMap + registre alimentaire de Montréal, 17/17 régions), **163 677 plats avec prix**, **1 874 menus capturés** (1 324 takeout · 496 salle · 57 livraison), **188 chaînes identifiées** dont **116+ intégrations UEAT découvertes**, **3 001 inspections MAPAQ** importées (661 croisées sur 443 restos), **3 001 restos avec permis d'alcool** (RACJ), 220 restos notés Yelp, **17 sources au registre**, 100 % des restos 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.
51 51
52 52 ## Visite guidée
53 53
54 −*Captures du 2026-08-25 — front-end v2 « éditorial premium » (mobile 390×844 · desktop 1440×900).*
55 −
56 −### Mobile
54 +*Captures live du 2026-08-28 sur [www.resto-ka.com](https://www.resto-ka.com) — desktop 1440×900, mobile 390×844.*
57 55
58 56 <table>
59 57 <tr>
60 − <td align="center"><img src="docs/screenshots/mobile/home.webp" width="240" alt="Accueil mobile"><br><sub><b>Accueil — recherche resto ou plat, KA Tabbar</b></sub></td>
61 − <td align="center"><img src="docs/screenshots/mobile/resultats.webp" width="240" alt="Résultats mobile"><br><sub><b>Restos de Montréal</b></sub></td>
62 − <td align="center"><img src="docs/screenshots/mobile/resto.webp" width="240" alt="Fiche resto mobile"><br><sub><b>Fiche restaurant — menu complet, prix réels</b></sub></td>
58 + <td align="center" width="50%"><a href="https://www.resto-ka.com/"><img src="docs/screenshots/01-accueil.jpg" alt="Accueil"></a><br><sub><b>Accueil</b> — héros typographique « Chaque resto, chaque plat, chaque prix », recherche par resto ou par plat, bande « signes vitaux » live (restos, plats, menus, régions) sur fond encre.</sub></td>
59 + <td align="center" width="50%"><a href="https://www.resto-ka.com/villes"><img src="docs/screenshots/02-villes.jpg" alt="Répertoire des villes"></a><br><sub><b>Répertoire des villes</b> (<code>/villes</code>) — les villes du Québec classées par région administrative, avec le compte de restos ; pages SEO indexables.</sub></td>
63 60 </tr>
64 61 <tr>
65 − <td align="center"><img src="docs/screenshots/mobile/stats.webp" width="240" alt="Stats mobile"><br><sub><b>Statistiques</b></sub></td>
66 − <td align="center"><img src="docs/screenshots/mobile/villes.webp" width="240" alt="Villes mobile"><br><sub><b>Répertoire des villes</b></sub></td>
67 − <td align="center"><img src="docs/screenshots/mobile/menu-mobile.webp" width="240" alt="Menu mobile"><br><sub><b>Nav v2 — panneau plein écran</b></sub></td>
62 + <td align="center"><a href="https://www.resto-ka.com/stats"><img src="docs/screenshots/03-stats.jpg" alt="Statistiques"></a><br><sub><b>Statistiques</b> (<code>/stats</code>) — tableau de bord complet : volumes par région, contextes de prix, chaînes, inspections, sources ; rapports PDF (catalogue + ReportBuilder personnalisé).</sub></td>
63 + <td align="center"><a href="https://www.resto-ka.com/sources"><img src="docs/screenshots/04-sources.jpg" alt="Sources de données"></a><br><sub><b>Sources</b> (<code>/sources</code>) — le registre public des 17 sources de données : rôle, statut, cadence et dernières synchronisations, en toute transparence.</sub></td>
68 64 </tr>
69 −</table>
70 −
71 −### Desktop
72 −
73 −<table>
74 65 <tr>
75 − <td align="center"><img src="docs/screenshots/desktop/home.webp" width="420" alt="Accueil desktop"><br><sub><b>Accueil — bande « signes vitaux » encre, héros typographique</b></sub></td>
76 − <td align="center"><img src="docs/screenshots/desktop/resultats.webp" width="420" alt="Résultats desktop"><br><sub><b>Résultats — cartes à filets d'encre, ombre safran au survol</b></sub></td>
66 + <td align="center"><a href="https://www.resto-ka.com/contact"><img src="docs/screenshots/05-contact.jpg" alt="Contact"></a><br><sub><b>Contact</b> (<code>/contact</code>) — coordonnées du Groupe KA, formulaire, et liens vers les autres plateformes de l'écosystème.</sub></td>
67 + <td align="center"><a href="https://www.resto-ka.com/ville/montreal"><img src="docs/screenshots/06-ville-montreal.jpg" alt="Restos de Montréal"></a><br><sub><b>Page ville — Montréal</b> (<code>/ville/montreal</code>) — près de 12 000 restos montréalais, filtres par cuisine et type, cartes à filets d'encre avec ombre safran au survol.</sub></td>
77 68 </tr>
78 69 <tr>
79 − <td align="center"><img src="docs/screenshots/desktop/resto.webp" width="420" alt="Fiche resto"><br><sub><b>Fiche restaurant — infos structurées + lien commande</b></sub></td>
80 − <td align="center"><img src="docs/screenshots/desktop/resto-menu.webp" width="420" alt="Menu du resto"><br><sub><b>Menu structuré — plats, formats, prix contextualisés</b></sub></td>
70 + <td align="center"><a href="https://www.resto-ka.com/resto/mtl-alim:100002"><img src="docs/screenshots/07-resto-mtl-alim-100002.jpg" alt="Fiche restaurant"></a><br><sub><b>Fiche restaurant</b> (<code>/resto/&lt;uid&gt;</code>) — panneau héros (nom, cuisine, adresse), coordonnées et horaires structurés, menu par contexte de prix, inspections MAPAQ et permis d'alcool, carte.</sub></td>
71 + <td align="center"><a href="https://www.resto-ka.com/favoris"><img src="docs/screenshots/08-favoris.jpg" alt="Favoris"></a><br><sub><b>Favoris</b> (<code>/favoris</code>) — « Mon univers Ka » : les restos sauvegardés avec le compte unique KA ID, partagés entre les 12 plateformes du groupe.</sub></td>
81 72 </tr>
82 73 <tr>
83 − <td align="center"><img src="docs/screenshots/desktop/villes.webp" width="420" alt="Villes"><br><sub><b>Répertoire des villes (pages SEO)</b></sub></td>
84 − <td align="center"><img src="docs/screenshots/desktop/stats.webp" width="420" alt="Stats"><br><sub><b>Statistiques — 21 200+ restos, 18 régions</b></sub></td>
74 + <td align="center"><a href="https://www.resto-ka.com/doc/"><img src="docs/screenshots/09-doc.jpg" alt="Documentation"></a><br><sub><b>Documentation</b> (<code>/doc/</code>) — guide d'utilisation illustré en 4 étapes + version PDF téléchargeable.</sub></td>
75 + <td align="center"><a href="https://www.resto-ka.com/"><img src="docs/screenshots/10-accueil-mobile.jpg" alt="Accueil mobile" width="240"></a><br><sub><b>Accueil mobile</b> (390×844) — recherche plein pouce, signes vitaux compacts et KA Tabbar (barre de navigation mobile commune Groupe KA).</sub></td>
85 76 </tr>
86 77 </table>
87 78
79 +> 🗄️ Les captures du front-end v2 du 2026-08-25 (webp) restent dans [`docs/screenshots/mobile/`](docs/screenshots/mobile/) et [`docs/screenshots/desktop/`](docs/screenshots/desktop/) ; les captures d'époque sont conservées dans [`docs/archive/`](docs/archive/).
80 +
88 81 ### Nouveautés front-end (2026-08-25)
89 82
90 83 - **Front-end v2 « éditorial premium »** — bande signes vitaux pleine largeur (chiffres géants tabulaires sur fond encre), nav soulignée, héros typographique agrandi, cartes/plats/menus/filtres allégés (filets d'encre au lieu de boîtes), ombre safran signature au survol.
@@ -92,22 +85,21 @@
92 85 - **7 nouvelles sources** — mtl-alim, Tastet, ChowNow, GloriaFood, Square, DoorDash, Skip + hub de découverte multi-plateformes.
93 86 - **Widget ka-agent v4** — cartes de restos cliquables et choix en boutons.
94 87
95 −> 🗄️ Les captures d'époque sont conservées dans [`docs/archive/`](docs/archive/).
96 −
97 88 ## Fonctionnalités
98 89
99 90 - **Prix réels et contextualisés** — un prix n'est jamais présenté sans son contexte (`dine-in` / `takeout` / `delivery`) ; un menu sans `price_context`/`price_source` est rejeté à l'ingestion, et un menu salle n'est jamais écrasé par un menu livraison.
100 −- **Recherche par plat** dans les 149 569 items (au 2026-08-24), groupée par marque (pour ne pas répéter la même poutine de chaîne des dizaines de fois).
91 +- **Recherche par plat** dans les 163 677 items (au 2026-08-28), groupée par marque (pour ne pas répéter la même poutine de chaîne des dizaines de fois).
101 92 - **Options & formats capturés** avec leurs suppléments (« Mini +3,70 $ ») — ils changent le prix réel.
102 −- **Historique des prix par item** (`item_price_log`, 155 312 entrées au 2026-08-24) à chaque changement.
103 −- **Alerte de dérive** — chute anormale du volume d'une source ou du nombre d'items d'un menu → retraits suspendus / ancien menu conservé.
93 +- **Historique des prix par item** (`item_price_log`, 155 000+ entrées) à chaque changement.
94 +- **Alerte de dérive** — chute anormale du volume d'une source ou du nombre d'items d'un menu → retraits suspendus / ancien menu conservé (visible dans les syncs récents : les runs partiels de Tastet sont signalés et les retraits suspendus).
104 95 - **Déduplication inter-sources** (les succursales ne sont jamais fusionnées) et **géocodage à 100 %** (Nominatim + Adresses Québec, cache persistant).
105 −- **Découverte OpenStreetMap** (API Overpass) : 13 427 établissements nommés au dernier passage — restos, fast-foods, cafés, bars, crèmeries, boulangeries — dans les 17 régions ; **connecteur UEAT templatisé** (API GraphQL) pour les menus takeout réels de **116 intégrations de chaînes découvertes** (Sushi Shop, Valentine, Normandin, Thaïzone, Chez Ashton…).
106 −- **Découverte des sites web** des restos OSM (connecteur `site-finder`, Serper /maps) et **extraction des photos** depuis les sites des restos (`site-resto`).
107 −- **Enrichissements officiels** : inspections MAPAQ (2 994 importées, 288 appariées à 204 restos) et permis d'alcool RACJ (1 859 restos).
108 −- **Avis & notes** : Yelp par scraping quotidien (177 restos notés) et croisement Uber Eats (36 restos, prix marqués `delivery`).
109 −- **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).
110 −- **Registre des sources** — `data/sources.json` (10 sources), à consulter avant tout ajout (statut et raison des sources non connectables).
96 +- **Découverte OpenStreetMap** (API Overpass) : 14 008 établissements nommés au dernier passage — restos, fast-foods, cafés, bars, crèmeries, boulangeries — dans les 17 régions, complétée par le **registre alimentaire de la Ville de Montréal** (`mtl-alim`, 7 574 établissements, données ouvertes) et le média resto **Tastet** ; **connecteur UEAT templatisé** (API GraphQL) pour les menus takeout réels de **116+ intégrations de chaînes découvertes** (Sushi Shop, Valentine, Normandin, Thaïzone, Chez Ashton…).
97 +- **Découverte des sites web** des restos (connecteur `site-finder`, Serper /maps — sites, téléphones, liens de réservation) et **extraction des menus + photos** depuis les sites des restos (`site-resto`).
98 +- **Hub multi-plateformes de commande** : connecteurs templatisés ChowNow, GloriaFood et Square Online (menus takeout réels, activés dès qu'une intégration est découverte par `site-finder`).
99 +- **Enrichissements officiels** : inspections MAPAQ (3 001 importées, 661 appariées à 443 restos) et permis d'alcool RACJ (3 001 restos).
100 +- **Avis & notes** : Yelp par scraping quotidien (220 restos notés) et croisement des plateformes de livraison Uber Eats, DoorDash et Skip (prix marqués `delivery`, jamais prioritaires).
101 +- **Connexion KA ID** (SSO Groupe KA), favoris unifiés « Mon univers Ka », recommandations personnalisées (moteur `kaid` v2, filtrage collaboratif ALS), tableau de bord `/stats` + rapports PDF (catalogue + ReportBuilder), widget **KA Agent v4** (chat IA, cartes de restos cliquables).
102 +- **Registre des sources** — `data/sources.json` (**17 sources**), exposé publiquement sur [/sources](https://www.resto-ka.com/sources), à consulter avant tout ajout (statut et raison des sources non connectables).
111 103
112 104 ## Démarrage rapide
113 105
@@ -124,7 +116,7 @@ cd frontend && npm install && npm run build && cd ..
124 116 .venv/bin/python run.py serve 8115 # API + frontend sur :8115
125 117 .venv/bin/python run.py watch 168 # boucle hebdomadaire (heures)
126 118
127 −# Tests (80 tests pytest, fixtures réelles hors ligne)
119 +# Tests (110 tests pytest, fixtures réelles hors ligne)
128 120 .venv/bin/python -m pytest tests/
129 121 ```
130 122
@@ -138,9 +130,9 @@ Servis par `restoka/web.py` (FastAPI) sur le port 8115.
138 130 | `GET` | `/api/restaurants/{uid}` | fiche complète : menu structuré par contexte de prix, photos, coordonnées, horaires |
139 131 | `GET` | `/api/restaurants/{uid}/prices` | historique des prix des items du resto (`item_price_log`) |
140 132 | `GET` | `/api/restaurants/{uid}/inspections` | inspections/permis (enrichissements MAPAQ + RACJ) |
141 −| `GET` | `/api/dishes` | recherche par plat dans les 149 569 items, groupée par marque |
133 +| `GET` | `/api/dishes` | recherche par plat dans les 163 677 items, groupée par marque |
142 134 | `GET` | `/api/facets` | facettes de filtres (régions, villes, cuisines, types) |
143 −| `GET` | `/api/sources` | registre des sources (statuts, cadences) |
135 +| `GET` | `/api/sources` | registre des sources (statuts, cadences) — alimente la page `/sources` |
144 136 | `GET` | `/api/stats` | statistiques publiques JSON (alimente les pastilles ci-dessus) |
145 137 | `GET` | `/api/stats/dashboard` | données du tableau de bord `/stats` |
146 138 | `GET` | `/api/stats/report` | rapport PDF principal |
@@ -151,7 +143,7 @@ Servis par `restoka/web.py` (FastAPI) sur le port 8115.
151 143 | `POST` | `/api/sync` | déclenchement d'une synchronisation |
152 144 | `GET` | `/healthz` | santé du service (`{"status":"ok"}`) |
153 145 | `GET` | `/doc/` | guide d'utilisation en ligne |
154 −| `GET` | `/{full_path}` | SPA + pages SSR légères (accueil, fiches JSON-LD, /villes) |
146 +| `GET` | `/{full_path}` | SPA + pages SSR légères (accueil, fiches JSON-LD, /villes, /ville/:slug) |
155 147
156 148 ## Connecteurs
157 149
@@ -159,11 +151,18 @@ Auto-enregistrés dans `restoka/connectors/` (requests direct / Firecrawl / Scra
159 151
160 152 | Connecteur | Famille | Rôle | Cadence |
161 153 |---|---|---|---|
162 −| `osm` | découverte | OpenStreetMap (Overpass, miroirs fiabilisés) — 13 427 établissements nommés, 17/17 régions | mensuelle |
163 −| `ueat` | menus takeout (tier 1) | connecteur templatisé UEAT (API GraphQL) — menus takeout réels de 116 intégrations découvertes | hebdomadaire |
154 +| `osm` | découverte | OpenStreetMap (Overpass, miroirs fiabilisés) — 14 008 établissements nommés, 17/17 régions | mensuelle |
155 +| `mtl-alim` | découverte | registre des établissements alimentaires de la Ville de Montréal (données ouvertes) — 7 574 établissements | mensuelle |
156 +| `tastet` | découverte / éditorial | restos recensés par le média Tastet (sélections montréalaises) | hebdomadaire |
157 +| `sitefinder` | découverte | sites web / téléphones / liens de réservation / plateformes de commande des restos (Serper /maps) | hebdo par lots (3 000 req.), échecs re-sondés 180 j |
158 +| `ueat` | menus takeout (tier 1) | connecteur templatisé UEAT (API GraphQL) — menus takeout réels de 116+ intégrations découvertes | hebdomadaire |
164 159 | `siteresto` | menus salle | menus + photos publiés sur le site des restos indépendants | hebdo (batch incrémental), re-crawl mensuel |
165 −| `sitefinder` | découverte | sites web / plateformes de commande des restos OSM (Serper /maps) | hebdo par lots (3 000 req.), échecs re-sondés 180 j |
160 +| `chownow` | menus takeout | connecteur templatisé ChowNow — dormant (activé dès qu'une intégration est découverte) | hebdomadaire |
161 +| `gloriafood` | menus takeout | connecteur templatisé GloriaFood — dormant (activé dès qu'une intégration est découverte) | hebdomadaire |
162 +| `squareonline` | menus takeout | connecteur templatisé Square Online — 1 intégration active | hebdomadaire |
166 163 | `ubereats` | livraison | complément livraison (prix `delivery`, jamais prioritaires sur un menu salle) | quotidienne par petits lots (60 pages), re-vérif 30 j |
164 +| `doordash` | livraison | croisement DoorDash (menus `delivery`) | quotidienne par petits lots |
165 +| `skip` | livraison | croisement SkipTheDishes (menus `delivery`) | quotidienne par petits lots |
167 166 | `yelp` | annuaire | enrichissement via l'API Yelp Fusion (clé requise — SkipSource sans `YELP_API_KEY`) | hebdo, re-vérification 30 j |
168 167 | `yelp_scrape` | annuaire | notes, nombre d'avis, gamme de prix, catégories, fermetures via yelp.ca | quotidienne par petits lots (80 pages), re-vérif 30 j |
169 168
@@ -171,11 +170,11 @@ S'y ajoutent deux **enrichissements officiels** exécutés par `ingest.enrich` (
171 170
172 171 ## Données & conformité
173 172
174 −- **Registre des sources** : `data/sources.json` — **10 sources** au 2026-08-24 (8 actives, 1 « clé requise » : yelp, 1 « à faire » : sthubert). À consulter **avant** tout ajout de source (CLAUDE.md §0.4) : chaque entrée documente l'accès légal, l'extraction et la cadence.
175 −- **Prix de première partie** : les menus takeout viennent de la plateforme de commande des restos eux-mêmes (UEAT — la même API GraphQL que le widget officiel, auth anonyme publique) ou de leur propre site — **prix réels non majorés**. Les menus salle (`site-resto`) et takeout passent toujours avant les plateformes de livraison.
176 −- **Scraping poli** : throttling (0,35 s sur UEAT), User-Agent identifiable `RestoKaBot`, budgets par passage (Yelp 450 req/j, site-finder 3 000 req, Uber Eats 60 pages/j).
177 −- **Données publiques officielles** : inspections MAPAQ et permis d'alcool RACJ (jeux de données gouvernementaux).
178 −- **Cadence de resync** : boucle `run.py watch 168` (cycle hebdomadaire) ; les sources quotidiennes (yelp-scrape, ubereats) avancent par petits lots à chaque passage ; alertes de dérive + délai de grâce avant tout retrait.
173 +- **Registre des sources** : `data/sources.json` — **17 sources** au 2026-08-28 (**12 actives**, 3 dormantes en attente d'intégrations découvertes : chownow, gloriafood, square, 1 « clé requise » : yelp, 1 « à faire » : sthubert). À consulter **avant** tout ajout de source (CLAUDE.md §0.4) : chaque entrée documente l'accès légal, l'extraction et la cadence. Version publique : [/sources](https://www.resto-ka.com/sources).
174 +- **Prix de première partie** : les menus takeout viennent de la plateforme de commande des restos eux-mêmes (UEAT — la même API GraphQL que le widget officiel, auth anonyme publique ; ChowNow/GloriaFood/Square Online templatisés) ou de leur propre site — **prix réels non majorés**. Les menus salle (`site-resto`) et takeout passent toujours avant les plateformes de livraison.
175 +- **Scraping poli** : throttling (0,35 s sur UEAT), User-Agent identifiable `RestoKaBot`, budgets par passage (Yelp 450 req/j, site-finder 3 000 req, Uber Eats 60 pages/j, DoorDash/Skip par petits lots).
176 +- **Données publiques officielles** : inspections MAPAQ, permis d'alcool RACJ et registre alimentaire de la Ville de Montréal (jeux de données gouvernementaux/municipaux ouverts).
177 +- **Cadence de resync** : boucle `run.py watch 168` (cycle hebdomadaire) ; les sources quotidiennes (yelp-scrape, ubereats, doordash, skip) avancent par petits lots à chaque passage ; alertes de dérive + délai de grâce avant tout retrait.
179 178 - La base SQLite de prod (`data/restoka.db`) est **gitignorée** ; aucun secret dans le repo (`.env` local, gabarit `.env.example`).
180 179
181 180 ## Architecture
@@ -184,11 +183,11 @@ Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication
184 183
185 184 - **Backend Python 3.14 / FastAPI / Uvicorn** (`restoka/web.py`) : API + service du build Vite + SSR léger SEO (JSON-LD Restaurant, sitemaps chunkés, pages /villes).
186 185 - **SQLite** (`restoka/db.py`) : restos, **menus par contexte de prix**, historique de prix (`item_price_log`), inspections, favoris, caches détail/géocodage.
187 −- **Connecteurs auto-enregistrés** (`restoka/connectors/`) : requests direct / Firecrawl / Scrapfly + cache détail (`base.py`), UEAT templatisé (`ueat.py`), découverte Overpass/OSM.
186 +- **Connecteurs auto-enregistrés** (`restoka/connectors/`) : requests direct / Firecrawl / Scrapfly + cache détail (`base.py`), UEAT templatisé (`ueat.py`), hub multi-plateformes (chownow/gloriafood/squareonline), découverte Overpass/OSM + mtl-alim + Tastet.
188 187 - **Ingestion** (`restoka/ingest.py`) : sync → geocode → dedup, délai de grâce et alertes de dérive ; enrichissements inspections/permis/heures.
189 188 - **Structuration LLM** (`restoka/menullm.py`) : menus maison structurés par Claude (API Anthropic).
190 −- **Frontend React 18 + Vite + TypeScript** (`frontend/`), design « éditorial sharp » Groupe KA.
191 −- **80 tests pytest** avec fixtures réelles hors ligne (connecteurs, normalisation, schéma, horaires, permis…).
189 +- **Frontend React 18 + Vite + TypeScript** (`frontend/`), design « éditorial premium » Groupe KA (v2 2026-08-25).
190 +- **110 tests pytest** avec fixtures réelles hors ligne (connecteurs, normalisation, schéma, horaires, permis…).
192 191
193 192 Processus PM2 sur le nœud (commandes de start réelles) :
194 193
@@ -221,17 +220,18 @@ Gabarit : `.env.example` (copier vers `.env`, jamais commité). **Noms seulement
221 220 resto-ka/
222 221 ├── run.py # point d'entrée CLI (sync / watch / serve)
223 222 ├── restoka/ # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats, menullm… + connectors/
224 −├── frontend/ # React 18 + Vite + TypeScript — design éditorial sharp Groupe KA + public/doc/ (guide)
225 −├── data/ # sources.json (registre), ueat-discovered.json (116 intégrations), base SQLite de prod (gitignorée)
223 +├── frontend/ # React 18 + Vite + TypeScript — design éditorial premium Groupe KA + public/doc/ (guide)
224 +├── data/ # sources.json (registre), ueat-discovered.json (intégrations), base SQLite de prod (gitignorée)
226 225 ├── scripts/ # scripts d'appoint (captures, déploiement)
227 −├── tests/ # 80 tests pytest (fixtures réelles hors ligne)
228 −└── docs/ # captures d'écran + docs connecteurs
226 +├── tests/ # 110 tests pytest (fixtures réelles hors ligne)
227 +└── docs/ # screenshots/ (visite guidée + v2 webp), archive/, connecteurs/ (docs par source)
229 228 ```
230 229
231 230 ## Documentation
232 231
233 232 - **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.
234 233 - **Guide PDF** : [resto-ka-documentation.pdf](https://www.resto-ka.com/doc/resto-ka-documentation.pdf) — la même documentation, téléchargeable.
234 +- **Docs des connecteurs** : [`docs/connecteurs/`](docs/connecteurs/) — une fiche par source (accès, extraction, cadence, gotchas), index dans `INDEX.md`.
235 235 - Les captures du guide sont versionnées dans `frontend/public/doc/img/` (etape1 → etape4).
236 236
237 237 ## Développement (remote-first)
@@ -263,6 +263,9 @@ Jalons tirés du `git log` :
263 263 - **2026-08-22** — SEO : SSR léger (JSON-LD Restaurant), sitemaps chunkés, robots.txt ; chaîne de fetch anti-bot résiliente (Oxylabs → Scrapfly → Bright Data) ; section « Récemment consultés ».
264 264 - **2026-08-23** — connecteur `site-finder` (Serper /maps), photos extraites des sites des restos, Stats v3 (rapports PDF personnalisés, ReportBuilder), favoris unifiés « Mon univers Ka », pages SEO /villes ; 32 → 116 intégrations UEAT découvertes.
265 265 - **2026-08-24** — page documentation `/doc` (guide + captures + PDF), refonte du README (v2 puis v3), mise à jour du répertoire UEAT.
266 +- **2026-08-25** — front-end v2 « éditorial premium », KA Tabbar v1, **7 nouvelles sources** (mtl-alim, Tastet, ChowNow, GloriaFood, Square, DoorDash, Skip) + hub de découverte multi-plateformes, widget ka-agent v4 ; le volume passe de ~14,7 k à 21 k+ restos.
267 +- **2026-08-26/27** — KA ID v2 : recommandations personnalisées (`kaid.py`, filtrage collaboratif ALS, pilules « Sauvegarder cette recherche »/« Pas pour moi »), alignées sur `ka-ui.git`.
268 +- **2026-08-28** — README v4 : visite guidée en 10 captures live (`docs/screenshots/`), chiffres et registre des sources à jour.
266 269
267 270 ## Écosystème Groupe KA
268 271
added docs/screenshots/01-accueil.jpg +0 −0

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

added docs/screenshots/06-ville-montreal.jpg +0 −0

Binary file not shown.

added docs/screenshots/07-resto-mtl-alim-100002.jpg +0 −0

Binary file not shown.

added docs/screenshots/08-favoris.jpg +0 −0

Binary file not shown.

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

Binary file not shown.

added docs/screenshots/10-accueil-mobile.jpg +0 −0

Binary file not shown.