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%
26.7 KB · 299 lines markdown
Rendered Raw Blame History
1<!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai -->23<p align="center">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</p>6<h1 align="center">Resto·Ka</h1>7<p align="center"><b>Chaque resto, chaque plat, chaque prix</b></p>89<div align="center">1011<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>12<a href="https://www.resto-ka.com/healthz"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fhealthz&query=%24.status&label=sant%C3%A9%20API&color=f08c00&style=flat-square" alt="Santé API (live)"></a>13<a href="https://www.resto-ka.com/doc/"><img src="https://img.shields.io/badge/📖_documentation-%2Fdoc-f08c00?style=flat-square" alt="Documentation"></a>14<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>15<img src="https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square" alt="Nœud">16<img src="https://img.shields.io/badge/port-8115-141814?style=flat-square" alt="Port">17<img src="https://img.shields.io/badge/process-PM2-2b037a?style=flat-square" alt="PM2">1819</div>2021<div align="center">2223<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.restaurants&label=restaurants&color=f08c00&style=flat-square" alt="Restaurants (live)">24<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.items&label=plats%20avec%20prix&color=f08c00&style=flat-square" alt="Plats avec prix (live)">25<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.with_menu&label=menus%20captur%C3%A9s&color=f08c00&style=flat-square" alt="Menus capturés (live)">26<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.chains&label=cha%C3%AEnes&color=f08c00&style=flat-square" alt="Chaînes (live)">27<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.regions&label=r%C3%A9gions&color=f08c00&style=flat-square" alt="Régions (live)">28<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.inspections&label=inspections%20MAPAQ&color=f08c00&style=flat-square" alt="Inspections MAPAQ (live)">29<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.with_alcohol_permit&label=permis%20alcool&color=f08c00&style=flat-square" alt="Permis d'alcool (live)">30<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.resto-ka.com%2Fapi%2Fstats&query=%24.sources_registry&label=sources%20au%20registre&color=f08c00&style=flat-square" alt="Sources au registre (live)">3132</div>3334<div align="center">3536<img src="https://img.shields.io/badge/Python-3.14-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python">37<img src="https://img.shields.io/badge/FastAPI-API-009688?style=flat-square&logo=fastapi&logoColor=white" alt="FastAPI">38<img src="https://img.shields.io/badge/React_18-TypeScript-087EA4?style=flat-square&logo=react&logoColor=white" alt="React">39<img src="https://img.shields.io/badge/Vite-5-646CFF?style=flat-square&logo=vite&logoColor=white" alt="Vite">40<img src="https://img.shields.io/badge/SQLite-menus_+_prix-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite">41<img src="https://img.shields.io/badge/PM2-3_processus-2B037A?style=flat-square&logo=pm2&logoColor=white" alt="PM2">42<img src="https://img.shields.io/badge/ngrok-tunnel-1F1E37?style=flat-square&logo=ngrok&logoColor=white" alt="ngrok">43<img src="https://img.shields.io/badge/Groupe-KA-f08c00?style=flat-square" alt="Groupe KA">44<img src="https://img.shields.io/badge/remote--first-spbgit-141814?style=flat-square" alt="remote-first spbgit">4546</div>4748**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 %).4950**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.5152## Visite guidée535455> ⚠️ **Application archivée le 2026-09-04** — l'URL live (https://www.resto-ka.com) est hors fonction ; l'app a été retirée du cluster MacLustr (registre mld, admin-ka, gardiens, site groupe-ka). Ce dépôt spbgit reste la source de vérité pour une remise en service.56*Captures live du 2026-08-28 sur [www.resto-ka.com](https://www.resto-ka.com) — desktop 1440×900, mobile 390×844.*5758<table>59  <tr>60    <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>61    <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>62  </tr>63  <tr>64    <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>65    <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>66  </tr>67  <tr>68    <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>69    <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>70  </tr>71  <tr>72    <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>73    <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>74  </tr>75  <tr>76    <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>77    <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>78  </tr>79</table>8081> 🗄️ 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/).8283### Nouveautés front-end (2026-08-25)8485- **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.86- **KA Tabbar v1** — barre de navigation mobile commune Groupe KA.87- **7 nouvelles sources** — mtl-alim, Tastet, ChowNow, GloriaFood, Square, DoorDash, Skip + hub de découverte multi-plateformes.88- **Widget ka-agent v4** — cartes de restos cliquables et choix en boutons.8990## Fonctionnalités9192- **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.93- **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).94- **Options & formats capturés** avec leurs suppléments (« Mini +3,70 $ ») — ils changent le prix réel.95- **Historique des prix par item** (`item_price_log`, 155 000+ entrées) à chaque changement.96- **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).97- **Déduplication inter-sources** (les succursales ne sont jamais fusionnées) et **géocodage à 100 %** (Nominatim + Adresses Québec, cache persistant).98- **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…).99- **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`).100- **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`).101- **Enrichissements officiels** : inspections MAPAQ (3 001 importées, 661 appariées à 443 restos) et permis d'alcool RACJ (3 001 restos).102- **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).103- **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).104- **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).105106## Démarrage rapide107108```bash109# Backend110python3 -m venv .venv && .venv/bin/pip install -r requirements.txt111112# Frontend (build servi par FastAPI)113cd frontend && npm install && npm run build && cd ..114# ou en dev : cd frontend && npm run dev115116# Lancer117.venv/bin/python run.py sync            # synchronise (+ géocode + dédup)118.venv/bin/python run.py serve 8115      # API + frontend sur :8115119.venv/bin/python run.py watch 168       # boucle hebdomadaire (heures)120121# Tests (110 tests pytest, fixtures réelles hors ligne)122.venv/bin/python -m pytest tests/123```124125## API (endpoints)126127Servis par `restoka/web.py` (FastAPI) sur le port 8115.128129| Méthode | Endpoint | Description |130|---|---|---|131| `GET` | `/api/restaurants` | recherche de restos (ville, région, cuisine, texte libre, `uids=`, pagination) |132| `GET` | `/api/restaurants/{uid}` | fiche complète : menu structuré par contexte de prix, photos, coordonnées, horaires |133| `GET` | `/api/restaurants/{uid}/prices` | historique des prix des items du resto (`item_price_log`) |134| `GET` | `/api/restaurants/{uid}/inspections` | inspections/permis (enrichissements MAPAQ + RACJ) |135| `GET` | `/api/dishes` | recherche par plat dans les 163 677 items, groupée par marque |136| `GET` | `/api/facets` | facettes de filtres (régions, villes, cuisines, types) |137| `GET` | `/api/sources` | registre des sources (statuts, cadences) — alimente la page `/sources` |138| `GET` | `/api/stats` | statistiques publiques JSON (alimente les pastilles ci-dessus) |139| `GET` | `/api/stats/dashboard` | données du tableau de bord `/stats` |140| `GET` | `/api/stats/report` | rapport PDF principal |141| `GET` | `/api/stats/catalog` | catalogue des rapports disponibles |142| `POST` | `/api/stats/report/custom` | rapport PDF personnalisé (ReportBuilder) |143| `GET` | `/api/favorites` | favoris « Mon univers Ka » (session KA ID) |144| `POST` | `/api/favorites/toggle` | ajout/retrait d'un favori |145| `POST` | `/api/sync` | déclenchement d'une synchronisation |146| `GET` | `/healthz` | santé du service (`{"status":"ok"}`) |147| `GET` | `/doc/` | guide d'utilisation en ligne |148| `GET` | `/{full_path}` | SPA + pages SSR légères (accueil, fiches JSON-LD, /villes, /ville/:slug) |149150## Connecteurs151152Auto-enregistrés dans `restoka/connectors/` (requests direct / Firecrawl / Scrapfly + cache détail dans `base.py`, résilience `_resilient.py`, chaîne anti-bot Oxylabs → Scrapfly → Bright Data) :153154| Connecteur | Famille | Rôle | Cadence |155|---|---|---|---|156| `osm` | découverte | OpenStreetMap (Overpass, miroirs fiabilisés) — 14 008 établissements nommés, 17/17 régions | mensuelle |157| `mtl-alim` | découverte | registre des établissements alimentaires de la Ville de Montréal (données ouvertes) — 7 574 établissements | mensuelle |158| `tastet` | découverte / éditorial | restos recensés par le média Tastet (sélections montréalaises) | hebdomadaire |159| `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 |160| `ueat` | menus takeout (tier 1) | connecteur templatisé UEAT (API GraphQL) — menus takeout réels de 116+ intégrations découvertes | hebdomadaire |161| `siteresto` | menus salle | menus + photos publiés sur le site des restos indépendants | hebdo (batch incrémental), re-crawl mensuel |162| `chownow` | menus takeout | connecteur templatisé ChowNow — dormant (activé dès qu'une intégration est découverte) | hebdomadaire |163| `gloriafood` | menus takeout | connecteur templatisé GloriaFood — dormant (activé dès qu'une intégration est découverte) | hebdomadaire |164| `squareonline` | menus takeout | connecteur templatisé Square Online — 1 intégration active | hebdomadaire |165| `ubereats` | livraison | complément livraison (prix `delivery`, jamais prioritaires sur un menu salle) | quotidienne par petits lots (60 pages), re-vérif 30 j |166| `doordash` | livraison | croisement DoorDash (menus `delivery`) | quotidienne par petits lots |167| `skip` | livraison | croisement SkipTheDishes (menus `delivery`) | quotidienne par petits lots |168| `yelp` | annuaire | enrichissement via l'API Yelp Fusion (clé requise — SkipSource sans `YELP_API_KEY`) | hebdo, re-vérification 30 j |169| `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 |170171S'y ajoutent deux **enrichissements officiels** exécutés par `ingest.enrich` (garde-fou 6 jours) : `mapaq` (inspections) et `racj` (permis d'alcool), tous deux hebdomadaires.172173## Données & conformité174175- **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).176- **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.177- **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).178- **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).179- **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.180- La base SQLite de prod (`data/restoka.db`) est **gitignorée** ; aucun secret dans le repo (`.env` local, gabarit `.env.example`).181182## Architecture183184Pipeline (patron Lou·Ka) : **connecteurs → normalisation → déduplication → SQLite → API/frontend**.185186- **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).187- **SQLite** (`restoka/db.py`) : restos, **menus par contexte de prix**, historique de prix (`item_price_log`), inspections, favoris, caches détail/géocodage.188- **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.189- **Ingestion** (`restoka/ingest.py`) : sync → geocode → dedup, délai de grâce et alertes de dérive ; enrichissements inspections/permis/heures.190- **Structuration LLM** (`restoka/menullm.py`) : menus maison structurés par Claude (API Anthropic).191- **Frontend React 18 + Vite + TypeScript** (`frontend/`), design « éditorial premium » Groupe KA (v2 2026-08-25).192- **110 tests pytest** avec fixtures réelles hors ligne (connecteurs, normalisation, schéma, horaires, permis…).193194Processus PM2 sur le nœud (commandes de start réelles) :195196| Processus | Rôle | Commande | Cadence |197|---|---|---|---|198| `resto-ka` | serveur FastAPI (API + frontend) sur le port **8115** | `.venv/bin/python run.py serve 8115` | continu |199| `resto-ka-sync` | boucle de synchronisation | `.venv/bin/python run.py watch 168` | cycle hebdomadaire (168 h) |200| `resto-ka-ngrok` | tunnel vers **www.resto-ka.com** | `ngrok http --url=www.resto-ka.com 8115` | continu |201202## Variables d'environnement203204Gabarit : `.env.example` (copier vers `.env`, jamais commité). **Noms seulement — aucune valeur dans le repo.**205206| Variable | Rôle |207|---|---|208| `SCRAPFLY_KEY` | rendu JS + bypass anti-bot (plateformes de livraison) |209| `ANTHROPIC_API_KEY` | structuration des menus maison par Claude (`restoka/menullm.py`) |210| `FIRECRAWL_API_KEY` | rendu JS de secours pour les sites de restos SPA (`site-resto`) |211| `YELP_API_KEY` | API Yelp Fusion (sans clé : source sautée proprement) |212| `YELP_BUDGET` | budget de requêtes Yelp par passage (quota quotidien 500) |213| `SERPER_API_KEY` | Google Maps via Serper — découverte des sites web (`site-finder`) |214| `SITE_FINDER_BUDGET` | budget de requêtes Serper par passage (défaut 3 000) |215| `KA_SSO_SECRET` | SSO Groupe KA (« Se connecter avec KA ») |216| `SESSION_SECRET` | sessions signées |217| `RESTOKA_BASE_URL` | URL publique du site (défaut `https://www.resto-ka.com`) |218219## Structure du repo220221```222resto-ka/223├── run.py           # point d'entrée CLI (sync / watch / serve)224├── restoka/         # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats, menullm… + connectors/225├── frontend/        # React 18 + Vite + TypeScript — design éditorial premium Groupe KA + public/doc/ (guide)226├── data/            # sources.json (registre), ueat-discovered.json (intégrations), base SQLite de prod (gitignorée)227├── scripts/         # scripts d'appoint (captures, déploiement)228├── tests/           # 110 tests pytest (fixtures réelles hors ligne)229└── docs/            # screenshots/ (visite guidée + v2 webp), archive/, connecteurs/ (docs par source)230```231232## Documentation233234- **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.235- **Guide PDF** : [resto-ka-documentation.pdf](https://www.resto-ka.com/doc/resto-ka-documentation.pdf) — la même documentation, téléchargeable.236- **Docs des connecteurs** : [`docs/connecteurs/`](docs/connecteurs/) — une fiche par source (accès, extraction, cadence, gotchas), index dans `INDEX.md`.237- Les captures du guide sont versionnées dans `frontend/public/doc/img/` (etape1 → etape4).238239## Développement (remote-first)240241**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.242243- Remote `origin` = **spbgit** (git perso [git.spboucher.ai](https://git.spboucher.ai), bare repos sur M3U96a). **Pas GitHub.**244- L'agent forwarding SSH est actif : le `git push origin main` fonctionne pendant une session SSH depuis le laptop.245- `CLAUDE.md` est la source de vérité du projet (règles d'ingestion, en-têtes d'auteur obligatoires).246247```bash248pm2 restart resto-ka                    # après un changement en production249```250251## Déploiement252253- **Nœud** : M3U96b (Mac Studio, cluster MacLustr) — répertoire `~/apps/resto-ka`254- **Port** : **8115** (local, exposé uniquement via le tunnel)255- **Processus PM2** : `resto-ka` (serveur) + `resto-ka-sync` (synchro) + `resto-ka-ngrok` (tunnel)256- **Domaine** : **https://www.resto-ka.com** (tunnel ngrok)257258## Historique259260Jalons tirés du `git log` :261262- **2026-08-17** — naissance : pipeline connecteurs→SQLite→API (patron Lou·Ka), assets Groupe KA, tableau de bord `/stats` + rapport PDF, câblage du widget KA Agent.263- **2026-08-18** — vagues 2-3 d'enrichissement : inspections MAPAQ, horaires structurés, Yelp (API + scraping), avis/notes sans clé, menus livraison, permis d'alcool ; documentation standardisée des sources.264- **2026-08-19** — Stats v2 (dashboard complet + 5 rapports PDF), campagne mobile (menus tactiles, tabbar), KA Agent v2 plein écran, standard « panneau héro premier dans le DOM ».265- **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 ».266- **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.267- **2026-08-24** — page documentation `/doc` (guide + captures + PDF), refonte du README (v2 puis v3), mise à jour du répertoire UEAT.268- **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.269- **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`.270- **2026-08-28** — README v4 : visite guidée en 10 captures live (`docs/screenshots/`), chiffres et registre des sources à jour.271272## Écosystème Groupe KA273274| Plateforme | Vocation |275|---|---|276| [groupe-ka.com](https://www.groupe-ka.com) | portail du groupe et compte unique KA ID |277| [lou-ka.com](https://www.lou-ka.com) | logements à louer |278| [immo-ka.com](https://www.immo-ka.com) | propriétés à vendre |279| [vrai-prix.com](https://www.vrai-prix.com) | estimation immobilière |280| [auto-ka.com](https://www.auto-ka.com) | véhicules |281| [fabri-ka.com](https://www.fabri-ka.com) | produits québécois |282| [food-ka.com](https://www.food-ka.com) | épicerie et alimentation |283| [resto-ka.com](https://www.resto-ka.com) | restaurants *(ce repo)* |284| [sorti-ka.com](https://www.sorti-ka.com) | sorties et événements |285| [job-ka.com](https://www.job-ka.com) | emplois |286| [crea-ka.com](https://www.crea-ka.com) | créateurs de contenu |287| [trouve-ka.com](https://www.trouve-ka.com) | petites annonces |288| [api-ka.com](https://www.api-ka.com) | API de données |289290## Contact291292**Simon-Pierre Boucher** — fondateur, Groupe KA293📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)294295---296297© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai298Ce repo vit sur **spbgit** ([git.spboucher.ai](https://git.spboucher.ai)).299