SPB Git

spb/resto-ka

Public

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

page 1
  1. Tue, Aug 25, 2026 2

    1. Nav v2 correctif : le ✕ de fermeture vit DANS le panneau (fixe, toujours visible)
      …
      Le ✕ était le burger du header ; si le header n'est pas épinglé (bas de page),
      il défilait hors écran alors que le panneau fixed restait affiché — impossible
      de fermer sans Escape. Ajout d'un .mm-close position:fixed en haut à droite du
      panneau et burger masqué à l'ouverture (une seule commande de fermeture).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +13 −2
    2. Nav mobile v2 : le dropdown 480px devient un panneau plein écran fixed
      …
      Standard KA 2026-08-25 : .mobile-menu passe de position:absolute top:100%
      (max-height 480px) à position:fixed inset:0 — menu visible peu importe la
      position de scroll. Rang du header (marque + burger→✕) maintenu au-dessus du
      panneau, verrou de scroll CSS pur via html:has(.mobile-menu.open).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +13 −10
  2. Mon, Aug 24, 2026 6

    1. Simon-Pierre Boucher · 1 file +10
    2. Simon-Pierre Boucher · 1 file +109 −38
    3. feat(doc): page documentation /doc (guide + captures) + lien footer + PDF téléchargeable
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 8 files +170 −2
    4. Simon-Pierre Boucher · 3 files +81 −75
    5. data : mise à jour du répertoire UEAT découvert
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +80
  3. Sun, Aug 23, 2026 7

    1. favoris unifiés « Mon univers Ka » : le hub Groupe KA devient le magasin central
      …
      - restoka/hubfav.py : client HMAC du hub (calqué sur foodka/hubfav.py) —
        toggle synchrone, lecture avec cache mémoire 30 s invalidé au toggle
      - web.py : GET /api/favorites (liste du hub + fiches locales) et
        POST /api/favorites/toggle, protégés par la session KA ID (401 sinon)
      - auth.py : retrait des anciennes routes locales /api/favoris (plus aucun
        stockage local des favoris)
      - frontend : favorites.tsx (FavProvider/FavButton), cœur ♥ sur les cartes
        ET la fiche détail (non connecté : clic → connexion KA ID), page /favoris
        branchée au hub, entrée Favoris dans la nav, icône IcoHeart, .fav-btn.big
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 12 files +370 −107
    2. Simon-Pierre Boucher · 4 files +718 −12
    3. site-resto : extraction des photos des restos depuis leur site web
      …
      Le connecteur menus maison n emettait aucune image (231/231 fiches sans
      photo). Nouveau _extract_images (page d accueil) : og:image/twitter:image
      puis <img> (src/srcset/lazy-load, avif inclus), filtres logos/icones/
      placeholders/miniatures (-LxH < 300 px, width < 200), dedup des variantes
      de taille (WordPress -LxH, Webflow -p-NNN), max 6 photos.
      
      - fiche site-resto emise avec photos + cache detail (reemission comprise)
      - fiche OSM d origine enrichie si elle n a pas d images (COALESCE), y
        compris quand le crawl ne trouve ni menu ni contact
      - scripts/backfill_images.py : rattrapage ponctuel des fiches deja captees
        (execute 2026-08-23 : 207/231 fiches enrichies, + jumelles OSM)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +174 −8
    4. connecteur site-finder : découverte des sites web des restos OSM (Serper /maps)
      …
      Enrichissement (aucune fiche, aucun prix) : retrouve le site web officiel
      des ~10 600 restos OSM sans site connu via leur fiche Google Maps (API
      Serper, ll centré sur les coordonnées OSM). Croisement conservateur nom +
      GPS <= 400 m, ambigu ignoré ; domaines sociaux/agrégateurs/livraison
      rejetés, réservation -> details.reservation_url. Remplit website (+ phone
      si vide) et débloque le pipeline site-resto (menus maison dine-in).
      Tests hors ligne sur payloads réels (7 passent) ; .env.example
      (SERPER_API_KEY, SITE_FINDER_BUDGET) et data/sources.json documentés.
      
      Travail réalisé par une mission agent KA, commité a posteriori.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +412 −1
    5. SEO : pages programmatiques /villes + /ville/{slug} rendues en HTML (pattern lou-ka)
      …
      - restoka/seo.py : slugify + index villes groupé par slug (variantes de casse
        fusionnées, libellé majoritaire), SSR /villes et /ville/{slug} avec ItemList
        + BreadcrumbList, API /api/seo/villes et /api/seo/ville/{slug},
        sitemap-villes.xml, maillage interne accueil/fiche vers les pages villes
      - frontend : pages React VillesPage/VillePage, routes, lien pied de page
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +419 −3
    6. data: 32 intégrations UEAT découvertes par le sync
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +32
    7. osm: miroirs Overpass fiabilisés + réessais multi-rondes
      …
      Incident du 2026-08-22 : les 4 miroirs sont tombés en même temps (kumi 500,
      overpass-api.de injoignable, private.coffee 502, osm.jp certificat TLS
      invalide) et le run hebdo a fini à 0 POI (retraits suspendus par le garde-fou).
      
      - osm.jp retiré (hostname mismatch permanent), maps.mail.ru ajouté (instance
        planète complète, seul miroir opérationnel pendant l incident)
      - 3 rondes de réessai sur l ensemble des miroirs (attente 0/90/300 s) avant
        d abandonner un type d établissement
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +43 −25
  4. Sat, Aug 22, 2026 5

    1. Simon-Pierre Boucher · 5 files +74 −3
    2. Simon-Pierre Boucher · 2 files +14 −11
    3. SEO : SSR léger (accueil + fiches resto avec JSON-LD Restaurant), robots.txt, sitemaps chunkés, lang fr-CA
      …
      - restoka/seo.py (nouveau, calqué louka/seo.py) : head unique par route
        (title, description, canonical, hreflang fr-ca, og:* locale fr_CA,
        twitter, JSON-LD) + contenu essentiel serveur dans #root
      - accueil : title/h1 avec compte de restos, régions, menus récents,
        WebSite + Organization
      - fiche /resto/{uid} : JSON-LD Restaurant (PostalAddress QC/CA, geo,
        servesCuisine, telephone, priceRange, image) + BreadcrumbList,
        og:image = photo du resto, 404/410, canonical vers le uid maître
        pour les doublons inter-sources
      - robots.txt (Disallow /api/, /favoris, /docs) + sitemap index,
        sitemap-pages et sitemap-restos-{n} chunkés à 10 000 (lastmod)
      - pages statiques /stats /sources /contact : title/description uniques
      - web.py : include_router(seo.router) avant le fallback SPA
      - frontend/index.html : lang fr-CA
      Simon-Pierre Boucher · 3 files +438 −1
    4. connecteurs: chaine de fetch anti-bot resiliente (Oxylabs->Scrapfly->Bright Data)
      …
      Auto-escalade de BaseConnector.get() sur blocage (403/429/503/challenge CF)
      ou coupure reseau, via connectors/_resilient.py. Cles lues de l env avec repli
      sur ~/.claude/.env (accepte SCRAPFLY_KEY et SCRAPFLY_API_KEY). Reponse
      compatible requests.Response; coupe-circuit par hote. Aucun connecteur modifie.
      
      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +386
  5. Wed, Aug 19, 2026 5

    1. fix(fiche): panneau héro premier dans le DOM — plus de order:-1 mobile
      …
      Le panneau resto (nom, prix, adresse) était après le menu dans le DOM et
      remonté sur mobile via .panel{order:-1} — contraire au standard Groupe Ka
      « Ordre des sections — pages détail » (ordre DOM = ordre visuel).
      
      - Resto.tsx : <aside .panel> déplacé en premier enfant de .detail-grid,
        le bloc menu devient .detail-main
      - styles.css : order:-1 supprimé ; sur desktop le panneau est placé en
        colonne 2 via grid-column (aucun réordonnancement entre breakpoints)
      - Validé Playwright 390px (panneau premier, scrollY=0) + 1440px (panneau
        colonne droite)
      Simon-Pierre Boucher · 2 files +33 −21
    2. Simon-Pierre Boucher · 1 file +4 −1
    3. Mobile : menu compte via createPortal au-dessus de la tabbar, verrou scroll de la feuille filtres, logo tactile
      …
      - frontend/src/App.tsx : backdrop + menu compte rendus à la racine de <body>
        via createPortal (le backdrop-filter du header re-parentait le
        position:fixed → voile de 66 px, et le stacking context z-50 du header
        plaquait le menu SOUS la tabbar z-85 et le fab z-80) ; fermeture à Escape.
      - frontend/src/styles.css : .account-backdrop → var(--z-overlay) (800),
        .account-menu → position:fixed ancré sous le header (--header-h 66/58 px) à
        var(--z-modal) (900) ; zone tactile ≥44 px du logo .brand (::after inset
        -8px, rendu inchangé) ; les 7 selects de filtres étaient déjà couverts par
        la règle 16 px ≤900 px + filet anti-zoom global de tokens.css.
      - frontend/src/pages/Home.tsx : feuille de filtres mobile (sheetOpen) — gel du
        scroll d arrière-plan (pattern App.tsx) + fermeture à Escape.
      - frontend/src/ka/tokens.css (commité avec Stats v2) : socle mobile commun.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +50 −7
    4. Stats v2 : dashboard ultra complet + 5 rapports PDF (module commun Groupe KA v2)
      …
      - kit vendorisé mis au niveau canonique v2 (kacharts.tsx, kapdf.py, SPEC.md)
      - backend stats.py : 10 KPI (deltas + sparklines), 6 jauges de complétude,
        4 séries quotidiennes, multi-courbes prix moyen par ville, ajouts par
        source empilés, 4 répartitions, 3 distributions (prix de plats, capacités
        RACJ, notes Yelp), heatmap horaire des relevés, 6 tableaux, 12 records
      - /api/stats/report : 5 modes (complet|synthese|tendances|repartitions|
        donnees), inconnu -> complet, filename(mode)
      - page /stats : jauges, StatSummary, MultiLine/Stacked/Histogram/HourHeatmap,
        PdfButton v2 (menu 5 rapports)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 10 files +1,961 −317
  6. Tue, Aug 18, 2026 4

    1. Vague 3 : avis/notes sans clé API + menus livraison + permis d alcool
      …
      - yelp-scrape : notes/avis Yelp SANS clé (1 page de recherche yelp.ca/resto
        via Scrapfly ASP, cache Apollo embarqué) -> details.yelp, croisement
        conservateur nom+civique+ville, budget 80 pages/cycle, re-visite 30 j,
        indépendants d abord. Yelp Fusion (yelp) reprend la main si clé fournie.
      - ubereats : menus livraison + notes via sitemaps publics (index local
        37 087 slugs CA, 30 j) + __REACT_QUERY_STATE__ des pages resto ; croisement
        conservateur (téléphone / postal+civique / GPS<120 m + nom) avec restos
        EXISTANTS seulement, menus en price_context delivery, budget 60 pages/cycle.
      - permits (racj) : permis d alcool en vigueur (Données Québec, CC-BY 4.0),
        regroupés par établissement et croisés comme MAPAQ -> details.permis_alcool
        (1 924 restos croisés au premier run).
      - /api/stats : with_yelp_rating, with_ubereats, with_alcohol_permit ;
        ingest.enrich appelle permits.sync (guard 6 j) ; registre sources.json (9)
        + docs générées ; 73 tests verts (9 nouveaux, tout hors ligne).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 22 files +1,480 −10
    2. docs: documentation standardisée des 6 sources (générateur + fiches)
      …
      scripts/gen_connector_docs.py : générateur 100 % programmatique et rejouable
      qui croise data/sources.json (tier, extraction, acces_legal, cadence),
      l introspection statique (ast) de restoka/connectors/*.py et inspections.py,
      et la BD live (restaurants, menus, inspections, sync_log). Écrit
      docs/connecteurs/INDEX.md + une fiche par source (sections fixes).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 8 files +977
    3. Vague 2 : inspections MAPAQ, horaires structurés, contact site-resto, Yelp, fix Overpass 406
      …
      - MAPAQ (Données Québec, CC-BY 4.0) : module restoka/inspections.py — import
        des 2 994 condamnations (listecondamnation.csv) dans la table liée
        inspections, croisement CONSERVATEUR avec les restaurants (nom+lieu avec
        CP ou civique exigé ; adresse+nom hors tokens de ville — jamais la mauvaise
        succursale d une chaîne, jamais deux voisins d un centre commercial) :
        288 condamnations croisées sur 204 restos. details.mapaq + endpoint
        GET /api/restaurants/{uid}/inspections + compteurs /api/stats.
      - Horaires : restoka/hours.py — parseur opening_hours OSM (plages de jours,
        double service, off, 24/7, PH ignoré ; l exotique reste en brut) + JSON-LD
        schema.org. Câblé dans le connecteur OSM et backfillé : 2 656/2 939 tags
        bruts structurés par jour (90,4 %).
      - site-resto : extraction téléphone (tel:/JSON-LD/regex, E.164, garde
        anti-annuaire de chaîne), horaires JSON-LD et lien de réservation
        (OpenTable, Libro, Resto Loco…) -> COALESCE conservateur sur la fiche OSM
        (db.enrich_contact) + details.reservation_url (pending_enrichment).
      - Yelp Fusion : connecteur d enrichissement complet (rating, review_count,
        price, categories, phone -> details.yelp ; croisement par téléphone puis
        /businesses/matches, GPS <300 m si ambigu, budget 450 req/run). Livré en
        SkipSource « clé requise » (YELP_API_KEY absente) — nouveau patron
        SkipSource dans base.py + .env.example.
      - Overpass 406 : overpass-api.de refuse les UA déguisés en navigateur mais
        accepte un UA de bot honnête — UA dédié OVERPASS_UA (vérifié live, 200).
      - Colonne restaurants.details (migration auto, jamais touchée par
        sync_source), registre data/sources.json à 6 sources, /api/stats expose
        inspections/inspections_matched/restaurants_with_inspections.
      - Tests : 64 au vert (51 existants + 13 nouveaux : hours, inspections,
        extraction contact).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 15 files +1,215 −11
    4. Fiabilité sync + enrichissement UEAT/OSM
      …
      - Garde anti-fausses-fermetures : garde bootstrap (found < 60 % du max
        historique => retraits suspendus, active dès le 2e run), signal de run
        partiel remonté du connecteur au pipeline (sync_source(partial=...)).
      - OSM : run marqué partiel si un type échoue sur tous les miroirs ;
        réponses Overpass tronquées (remark timeout) et miroirs sans données
        (0 élément) traités comme des échecs ; overpass.osm.ch retiré (extrait
        suisse => 0 POI pour le Québec) ; +2 miroirs planet.
      - OSM : brand => chain, branch suffixé au nom, wheelchair/payment:*/
        capacity => services, diet:*=limited accepté, ~45 cuisines OSM
        supplémentaires mappées (belgian, turkish, cantonese, peruvian...).
      - UEAT : phoneNumber + address.latitude/longitude captés a la source
        (GPS de première partie, COALESCE côté base) ; 20 GUID découverts par
        site-resto promus dans data/sources.json (50 intégrations).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +327 −40
  7. Mon, Aug 17, 2026 9

    1. Simon-Pierre Boucher · 2 files +58 −53
    2. Câblage du widget KA Agent (bulle de chat IA Groupe KA)
      …
      Balises window.KA_AGENT={site:"resto-ka"} + /ka-agent.js (defer)
      en fin de <body> dans frontend/index.html.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +235
    3. Footer/contact : Job-Ka rejoint l écosystème (ecosystem.json 13 sites)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +175 −24
    4. Stats : tableau de bord analytique + rapport PDF Groupe-KA
      …
      - /api/stats/dashboard (contrat commun ka-ui/stats/SPEC.md) : KPI avec
        deltas, séries quotidiennes (nouveaux restos, plats suivis en cumul),
        répartitions (cuisines, gammes de prix, types), géo par région,
        heatmap des nouveautés, tableaux (villes, chaînes, nouveaux, syncs),
        records — 100 % calculé de la DB réelle, cache mémoire 5 min.
      - /api/stats/report : PDF estampillé Groupe-KA (kapdf/fpdf2), modes
        complet et synthèse, filename normalisé groupe-ka_resto-ka_stats_*.
      - Page /stats réécrite sur le kit kacharts (KPI, sélecteur de période,
        courbes, anneau, barres, heatmap, DataTable, records, bouton PDF).
      - kapdf : correctif — la couverture ne porte plus le pied de page
        standard (footer déclenché après la retombée de cover_mode).
      - fpdf2 ajouté aux dépendances.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 9 files +2,253 −102
    5. Ajoute les assets de partage Groupe KA (og.png, favicon.svg, apple-touch-icon)
      …
      - Nouveau favicon SVG et apple-touch-icon servis à la racine via frontend/public
      - Image Open Graph 1200×630 : meta og:image + dimensions + twitter:card/twitter:image dans le head
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +12 −1
    6. Harmonisation ka-ui : accent safran, badge Groupe KA, KaFooter, page /contact
      …
      - Vendorisation du package ka-ui (frontend/src/ka/) : tokens.css, ecosystem.json,
        KaFooter.tsx, GroupeKaBadge.tsx
      - tokens.css importé avant styles.css ; styles.css réduit à l accent SAFRAN
        (--accent #f08c00, soft #fdeed7, deep #b96a00, on-accent #141814) + alias --lime,
        socle dupliqué retiré, classes métier passées sur var(--accent)
      - Header : badge « Un service Groupe KA » (desktop >= 900 px + menu mobile)
      - Footer : KaFooter commun (contacts, avertissement, écosystème) + rangée de nav
        locale et crédit OpenStreetMap au-dessus
      - Nouvelle page /contact (infos d ecosystem.json, lien hub, création de compte
        KA ID -> groupe-ka.com/connexion) + prefixe SPA « contact » dans web.py
      - SEO : titre « Resto-Ka — Un service Groupe KA »
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 10 files +604 −165
    7. v2 — le plus grand agrégateur de restos du Québec : découverte OSM + 10 bannières UEAT
      …
      - Connecteur de découverte OpenStreetMap (Overpass, ODbL, attribution) :
        13 531 établissements nommés (restos, fast-foods, cafés, bars, crèmeries,
        boulangeries) → 14 055 fiches actives, 17/17 régions couvertes.
      - +10 intégrations UEAT (Boustan 65, Ben & Florentine 54, NO.900 32,
        Sushi Taxi 30, Cochon Dingue, Salvatoré, Belle Province, Madisons, Freddy)
        → 29 intégrations, 738 restos avec menu complet, 79 159 plats avec prix.
      - Déduplication chaîne↔découverte (suffixe de succursale retranché, OSM
        toujours derrière la fiche à menu) : 215 doublons masqués.
      - Régions : repli par ancres géographiques couvrant les 17 régions.
      - UI : filtre « Avec menu complet / Fiche seulement », tri « Menus d'abord »
        par défaut, tuile restos avec menu, attribution OSM au pied de page.
      - 45 tests (fixtures Overpass + UEAT réelles hors ligne).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 16 files +422 −34
    8. Resto·Ka v1 — agrégateur des restaurants du Québec (menus & prix réels)
      …
      - Pipeline complet calqué sur Lou·Ka : connecteurs auto-découverts, schéma
        Restaurant + menu imbriqué (sections → items → prix → options), validation
        stricte (price_context/price_source obligatoires), menus conservés PAR
        contexte, historique des prix par item, alertes de dérive, délai de grâce.
      - Connecteur templatisé UEAT (API GraphQL, prix takeout réels) : 19 marques,
        542 restos, 61 330 plats (98 % avec photo, 69 % avec options), 14/17 régions.
      - Géocodage Nominatim + Adresses Québec (96 %), régions ville→région,
        déduplication inter-sources (succursales jamais fusionnées).
      - Frontend Vite/React 18/TS — design « éditorial sharp » Groupe KA, recherche
        par resto ET par plat (groupée par marque), pagination numérotée, images,
        options en pastilles avec suppléments, badges de contexte de prix.
      - 41 tests (fixtures UEAT réelles hors ligne). Déployé : www.resto-ka.com
        (M3U96b:8115, PM2 + ngrok + sync hebdo).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 44 files +7,899
Menu

Theme