docs: README à jour avec screenshot
2 changed files +58 −53
modified
README.md
+58 −53
@@ -4,34 +4,38 @@ | |||||
| 4 | Desc: Resto·Ka — agrégateur des restaurants du Québec (menus & prix). | 4 | Desc: Resto·Ka — agrégateur des restaurants du Québec (menus & prix). | ||
| 5 | --> | 5 | --> | ||
| 6 | 6 | ||||
| 7 | −# Resto·Ka — [resto-ka.com](https://www.resto-ka.com) | 7 | +# Resto·Ka | ||
| 8 | 8 | ||||
| 9 | − | 9 | +**Tous les restaurants du Québec — menus complets et prix réels, dans les 17 régions.** | ||
| 10 | + | ||||
| 11 | + | ||||
| 12 | + | ||||
| 13 | + | ||||
| 10 |  | 14 |  | ||
| 11 |  | 15 |  | ||
| 12 |  | 16 |  | ||
| 13 |  | 17 |  | ||
| 14 | 18 | ||||
| 15 | − | 19 | +## Description | ||
| 16 | − | 20 | + | ||
| 17 | − | 21 | +**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**. | ||
| 18 | − | 22 | + | ||
| 19 | − | 23 | +- **14 091 restaurants** référencés (découverte **OpenStreetMap**, 17/17 régions) | ||
| 20 | − | 24 | +- **79 159 plats avec prix** — 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, +25-30 %) | ||
| 21 | − | 25 | +- **738 restos avec menu complet**, **24 chaînes suivies** | ||
| 26 | +- **98 %** des items avec photo, **69 %** avec options, **99 %** géolocalisés | ||||
| 22 | 27 | ||||
| 23 | −> **Agrégateur exhaustif de tous les restaurants du Québec, avec leurs menus | 28 | +Plateforme de la famille **·Ka** (Lou·Ka, Immo·Ka, Auto·Ka, Food·Ka, Fabri·Ka, Sorti·Ka…). Architecture des connecteurs **calquée sur Lou·Ka**, identité visuelle **« éditorial sharp » du Groupe KA** (Space Grotesk / Inter / JetBrains Mono, papier-encre-lime, bordures encre + ombres décalées). **`CLAUDE.md` est la source de vérité du projet.** | ||
| 24 | −> complets et leurs prix.** Chaque resto, chaque plat, chaque prix — dans les | ||||
| 25 | −> 17 régions, au même endroit, comparable et cherchable — **par resto ou par | ||||
| 26 | −> plat**. | ||||
| 27 | 29 | ||||
| 28 | −Plateforme de la famille **·Ka** (Lou·Ka, Immo·Ka, Auto·Ka, Food·Ka, Fabri·Ka, | 30 | +## Fonctionnalités | ||
| 29 | −Sorti·Ka). Architecture des connecteurs **calquée sur Lou·Ka**, identité | ||||
| 30 | −visuelle **« éditorial sharp » du Groupe KA** (Space Grotesk / Inter / | ||||
| 31 | −JetBrains Mono, papier-encre-lime, bordures encre + ombres décalées). | ||||
| 32 | −`CLAUDE.md` est la source de vérité du projet. | ||||
| 33 | 31 | ||||
| 34 | −## L'app | 32 | +- **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. | ||
| 33 | +- **Recherche par plat** dans les **79 159 items**, **groupée par marque** (pour ne pas répéter 76 fois la même poutine de chaîne). | ||||
| 34 | +- **Options & formats capturés** avec leurs suppléments (« Mini **+3,70 $** ») — ils changent le prix réel. | ||||
| 35 | +- **Historique des prix par item** (`item_price_log`) à chaque changement. | ||||
| 36 | +- **Alerte de dérive** : chute anormale du volume d'une source ou du nombre d'items d'un menu → retraits suspendus / ancien menu conservé. | ||||
| 37 | +- **Déduplication inter-sources** (les succursales ne sont jamais fusionnées) et **géocodage à 99 %** (Nominatim + Adresses Québec, cache persistant). | ||||
| 38 | +- **Connexion KA ID** (SSO Groupe Ka), favoris, tableau de bord **Stats** + rapport **PDF**, widget **KA Agent** (chat IA). | ||||
| 35 | 39 | ||||
| 36 | | Accueil — recherche de restos | Recherche par plat | | 40 | | Accueil — recherche de restos | Recherche par plat | | ||
| 37 | |---|---| | 41 | |---|---| | ||
@@ -41,34 +45,14 @@ JetBrains Mono, papier-encre-lime, bordures encre + ombres décalées). | |||||
| 41 | |---|---| | 45 | |---|---| | ||
| 42 | |  |  | | 46 | |  |  | | ||
| 43 | 47 | ||||
| 44 | −## Ce qui rend Resto·Ka différent | 48 | +## Stack technique | ||
| 45 | − | ||||
| 46 | −- **Prix réels** : captés sur la plateforme de commande des restos eux-mêmes | ||||
| 47 | − (Palier 1), pas sur les apps de livraison (+25-30 %). | ||||
| 48 | −- **Un prix n'est JAMAIS présenté sans son contexte** (`dine-in` / `takeout` / | ||||
| 49 | − `delivery`) — un menu sans `price_context`/`price_source` est rejeté à | ||||
| 50 | − l'ingestion, et un menu salle n'est jamais écrasé par un menu livraison. | ||||
| 51 | −- **Recherche par plat** dans les 79 159 items (groupée par marque pour ne pas | ||||
| 52 | − répéter 76 fois la même poutine de chaîne). | ||||
| 53 | −- **Options & formats capturés** avec leurs suppléments (« Mini +3,70 $ ») — | ||||
| 54 | − ils changent le prix réel. | ||||
| 55 | −- **Historique des prix par item** (`item_price_log`) à chaque changement. | ||||
| 56 | −- **Alerte de dérive** : chute anormale du volume d'une source ou du nombre | ||||
| 57 | − d'items d'un menu → retraits suspendus / ancien menu conservé. | ||||
| 58 | − | ||||
| 59 | −## Démarrage | ||||
| 60 | 49 | ||||
| 61 | −```bash | 50 | +- **Backend** : **Python 3.14** · **FastAPI** · **Uvicorn** · **SQLite** (menus par contexte + historique de prix) | ||
| 62 | −python3 -m venv .venv && .venv/bin/pip install -r requirements.txt | 51 | +- **Frontend** : **React 18** · **Vite** · **TypeScript** — design éditorial sharp Groupe KA | ||
| 63 | −cd frontend && npm install && npm run build && cd .. | 52 | +- **Scraping/ingestion** : requests direct / **Firecrawl** / **Scrapfly**, API **Overpass** (OSM), API **GraphQL UEAT** | ||
| 64 | − | 53 | +- **Tests** : **45 tests pytest** (fixtures réelles hors ligne) | ||
| 65 | −.venv/bin/python run.py sync # synchronise (+ géocode + dédup) | ||||
| 66 | −.venv/bin/python run.py serve 8115 # API + frontend sur :8115 | ||||
| 67 | −.venv/bin/python run.py watch 168 # boucle hebdomadaire | ||||
| 68 | −.venv/bin/python -m pytest tests/ # 45 tests (fixtures réelles hors ligne) | ||||
| 69 | −``` | ||||
| 70 | 54 | ||||
| 71 | −## Architecture (patron Lou·Ka) | 55 | +## Structure (patron Lou·Ka) | ||
| 72 | 56 | ||||
| 73 | ``` | 57 | ``` | ||
| 74 | restoka/ | 58 | restoka/ | ||
@@ -82,27 +66,48 @@ restoka/ | |||||
| 82 | ├── ingest.py # pipeline sync → geocode → dedup (délai de grâce, alertes) | 66 | ├── ingest.py # pipeline sync → geocode → dedup (délai de grâce, alertes) | ||
| 83 | ├── dedup.py # identité resto inter-sources (succursales jamais fusionnées) | 67 | ├── dedup.py # identité resto inter-sources (succursales jamais fusionnées) | ||
| 84 | ├── geocode.py # Nominatim + Adresses Québec, cache persistant | 68 | ├── geocode.py # Nominatim + Adresses Québec, cache persistant | ||
| 69 | +├── auth.py # connexion KA ID (SSO Groupe Ka) | ||||
| 85 | └── web.py # FastAPI + frontend React (frontend/dist) | 70 | └── web.py # FastAPI + frontend React (frontend/dist) | ||
| 86 | frontend/ # Vite + React 18 + TS — design éditorial sharp Groupe KA | 71 | frontend/ # Vite + React 18 + TS — design éditorial sharp Groupe KA | ||
| 87 | ``` | 72 | ``` | ||
| 88 | 73 | ||||
| 89 | ## Sources connectées | 74 | ## Sources connectées | ||
| 90 | 75 | ||||
| 91 | −Registre : `data/sources.json` (à consulter AVANT d'ajouter quoi que ce soit). | 76 | +Registre : **`data/sources.json`** (à consulter **AVANT** d'ajouter quoi que ce soit). | ||
| 92 | 77 | ||||
| 93 | | Source | Palier | Contexte de prix | Couverture | | 78 | | Source | Palier | Contexte de prix | Couverture | | ||
| 94 | |--------|--------|------------------|------------| | 79 | |--------|--------|------------------|------------| | ||
| 95 | −| **OpenStreetMap** (découverte, API Overpass) | 4 | — (fiches sans menu) | **13 500+ établissements** : tous les restos, fast-foods, cafés, bars, crèmeries et boulangeries nommés du Québec — 17/17 régions. Données © contributeurs OSM (ODbL). | | 80 | +| **OpenStreetMap** (découverte, API Overpass) | 4 | — (fiches sans menu) | **13 500+ établissements** : tous les restos, fast-foods, cafés, bars, crèmeries et boulangeries nommés du Québec — **17/17 régions**. Données © contributeurs OSM (ODbL). | | ||
| 96 | −| **UEAT** (commande en ligne, API GraphQL anonyme) | 1 | `takeout` (prix réels) | 29 intégrations : Sushi Shop (141), Poulet Rouge (82), Valentine (76), Normandin (44), Chocolats Favoris (41), Allô mon Coco (34), Thaïzone (26), Scores (25), Chez Ashton (23), Pacini (20), Boustan (65), Ben & Florentine (54), Pizzéria NO.900 (32), Sushi Taxi (30), Tutti Frutti, Mandy's, Cochon Dingue, Panda Boba-T, Salvatoré, Ryu Sushi, Impérial, La Belle Province, Madisons, Pizza Mia, Station W, Freddy, Le Super Qualité, Château Frontenac | | 81 | +| **UEAT** (commande en ligne, API GraphQL anonyme) | 1 | **`takeout` (prix réels)** | **29 intégrations** : Sushi Shop (141), Poulet Rouge (82), Valentine (76), Normandin (44), Chocolats Favoris (41), Allô mon Coco (34), Thaïzone (26), Scores (25), Chez Ashton (23), Pacini (20), Boustan (65), Ben & Florentine (54), Pizzéria NO.900 (32), Sushi Taxi (30), Tutti Frutti, Mandy's, Cochon Dingue, Panda Boba-T, Salvatoré, Ryu Sushi, Impérial, La Belle Province, Madisons, Pizza Mia, Station W, Freddy, Le Super Qualité, Château Frontenac | | ||
| 97 | | St-Hubert | 6 | `takeout` (visé) | à faire — anti-bot Akamai, voir `data/sources.json` | | 82 | | St-Hubert | 6 | `takeout` (visé) | à faire — anti-bot Akamai, voir `data/sources.json` | | ||
| 98 | 83 | ||||
| 84 | +## Démarrage local | ||||
| 85 | + | ||||
| 86 | +```bash | ||||
| 87 | +python3 -m venv .venv && .venv/bin/pip install -r requirements.txt | ||||
| 88 | +cd frontend && npm install && npm run build && cd .. | ||||
| 89 | + | ||||
| 90 | +.venv/bin/python run.py sync # synchronise (+ géocode + dédup) | ||||
| 91 | +.venv/bin/python run.py serve 8115 # API + frontend sur :8115 | ||||
| 92 | +.venv/bin/python run.py watch 168 # boucle hebdomadaire | ||||
| 93 | +.venv/bin/python -m pytest tests/ # 45 tests (fixtures réelles hors ligne) | ||||
| 94 | +``` | ||||
| 95 | + | ||||
| 99 | ## Déploiement | 96 | ## Déploiement | ||
| 100 | 97 | ||||
| 101 | −Node **M3U96b** (MacLustr), `~/apps/resto-ka`, PM2 : `resto-ka` (:8115) + | 98 | +- **Nœud** : **M3U96b** (cluster MacLustr), répertoire **`~/apps/resto-ka`** | ||
| 102 | −`resto-ka-ngrok` (→ https://www.resto-ka.com) + `resto-ka-sync` (hebdo). | 99 | +- **Port** : **8115** | ||
| 103 | −Registre cross-session : `~/Desktop/cluster-skill/cluster-deployments.json`. | 100 | +- **Domaine** : **[www.resto-ka.com](https://www.resto-ka.com)** (tunnel **ngrok**) | ||
| 101 | +- **PM2** (3 process) : **`resto-ka`** (serveur :8115) + **`resto-ka-sync`** (synchro hebdomadaire) + **`resto-ka-ngrok`** (tunnel → www.resto-ka.com) | ||||
| 102 | +- Registre cross-session : `~/Desktop/cluster-skill/cluster-deployments.json` | ||||
| 103 | + | ||||
| 104 | +## Développement remote-first | ||||
| 105 | + | ||||
| 106 | +**La source de vérité est le repo git sur le nœud M3U96b** (`~/apps/resto-ka`), **PAS** les copies laptop. Toute modification se fait **sur le nœud via SSH** : édition, build, `pm2 restart resto-ka`, puis `git add/commit/push origin main` **sur le nœud** (agent forwarding actif). | ||||
| 107 | + | ||||
| 108 | +- Remote **`origin`** = **spbgit** (git perso **git.spboucher.ai** — bare repo `~/srv/git/resto-ka.git` sur M3U96a, alias SSH `gitsrv`). **PAS GitHub.** | ||||
| 109 | +- Référence complète : `~/Desktop/cluster-skill/KA-REMOTE-DEV.md`. | ||||
| 104 | 110 | ||||
| 105 | --- | 111 | --- | ||
| 106 | 112 | ||||
| 107 | −*Resto·Ka — plateforme du [Groupe KA](https://www.groupe-ka.com). Auteur : | 113 | +Un service **[Groupe Ka](https://www.groupe-ka.com)** — Auteur : Simon-Pierre Boucher \<contact@spboucher.ai\>. | ||
| 108 | −Simon-Pierre Boucher \<contact@spboucher.ai\>.* | ||||
added
docs/screenshot.png
+0 −0
Binary file not shown.