SPB Git

spb/resto-ka

Public

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

7.8 KB

# Resto·Ka

Tous les restaurants du Québec — menus complets et prix réels, comparables et cherchables dans les 17 régions.

Site Nœud Port PM2

Python FastAPI React SQLite Groupe KA

Resto·Ka (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 %).

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.

# Captures d'écran

Accueil — desktop Accueil — mobile

# Fonctionnalités

  • 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.
  • 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).
  • Options & formats capturés avec leurs suppléments (« Mini +3,70 $ ») — ils changent le prix réel.
  • Historique des prix par item (item_price_log) à chaque changement.
  • Alerte de dérive — chute anormale du volume d'une source ou du nombre d'items d'un menu → retraits suspendus / ancien menu conservé.
  • Déduplication inter-sources (les succursales ne sont jamais fusionnées) et géocodage à 99 % (Nominatim + Adresses Québec, cache persistant).
  • Découverte OpenStreetMap (API Overpass) : 13 500+ établissements nommés — 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 29 intégrations de chaînes (Sushi Shop, Valentine, Normandin, Thaïzone, Chez Ashton…).
  • 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).
  • Registre des sources — data/sources.json, à consulter avant tout ajout (statut et raison des sources non connectables).

# Architecture

Pipeline (patron Lou·Ka) : connecteurs → normalisation → déduplication → SQLite → API/frontend.

  • Backend Python 3.14 / FastAPI / Uvicorn (restoka/web.py) : API + service du build Vite.
  • SQLite (restoka/db.py) : restos, menus par contexte de prix, historique de prix.
  • Connecteurs auto-enregistrés (restoka/connectors/) : requests direct / Firecrawl / Scrapfly + cache détail (base.py), UEAT templatisé (ueat.py), découverte Overpass/OSM.
  • Ingestion (restoka/ingest.py) : sync → geocode → dedup, délai de grâce et alertes de dérive ; enrichissements inspections/permis/heures.
  • Frontend React 18 + Vite + TypeScript (frontend/), design « éditorial sharp » Groupe KA.
  • 45 tests pytest avec fixtures réelles hors ligne.

Processus PM2 sur le nœud :

Processus Rôle
resto-ka serveur FastAPI (API + frontend) sur le port 8115
resto-ka-sync boucle de synchronisation hebdomadaire (run.py watch)
resto-ka-ngrok tunnel ngrok vers www.resto-ka.com

# Structure du repo

text
resto-ka/
├── run.py           # point d'entrée CLI (sync / watch / serve)
├── restoka/         # cœur Python : web, db, ingest, dedup, geocode, regions, schema, normalize, auth, stats… + connectors/
├── frontend/        # React 18 + Vite + TypeScript — design éditorial sharp Groupe KA
├── data/            # sources.json (registre) + base SQLite de prod (gitignorée)
├── scripts/         # scripts d'appoint (captures, déploiement)
├── tests/           # 45 tests pytest (fixtures réelles hors ligne)
└── docs/            # captures d'écran + docs connecteurs

# Développement (remote-first)

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.

  • Remote origin = spbgit (git perso git.spboucher.ai, bare repos sur M3U96a). Pas GitHub.
  • L'agent forwarding SSH est actif : le git push origin main fonctionne pendant une session SSH depuis le laptop.
  • CLAUDE.md est la source de vérité du projet (règles d'ingestion, en-têtes d'auteur obligatoires).
bash
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
cd frontend && npm install && npm run build && cd ..

.venv/bin/python run.py sync            # synchronise (+ géocode + dédup)
.venv/bin/python run.py serve 8115      # API + frontend
.venv/bin/python run.py watch 168       # boucle hebdomadaire (heures)
.venv/bin/python -m pytest tests/       # 45 tests

pm2 restart resto-ka                    # après un changement en production

# Déploiement

  • Nœud : M3U96b (Mac Studio, cluster MacLustr) — répertoire ~/apps/resto-ka
  • Port : 8115 (local, exposé uniquement via le tunnel)
  • Processus PM2 : resto-ka (serveur) + resto-ka-sync (synchro) + resto-ka-ngrok (tunnel)
  • Domaine : https://www.resto-ka.com (tunnel ngrok)

# Écosystème Groupe KA


© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai Ce repo vit sur spbgit (git.spboucher.ai).

Files · e016aa8719306d0aa7652a17fe7890d3b94dab7c
Menu

Theme