Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)
-
Sun, Aug 23, 2026 2
-
data: 32 intégrations UEAT découvertes par le sync
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-
-
Sat, Aug 22, 2026 5
-
accueil : section « Récemment consultés » — fiches restos vues (localStorage) affichées en premier ; API /api/restaurants?uids=
…
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
header opaque + z-index en tokens + scroll-lock ka-scroll-lock (standard header/menu KA 2026-08-22)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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 -
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>
-
-
Wed, Aug 19, 2026 5
-
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) -
tokens.css : overflow-x clip aussi sur html (quirk WebKit iOS — le clip sur body seul laisse défiler le viewport)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-
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>
-
-
Tue, Aug 18, 2026 4
-
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>
-
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>
-
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> -
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>
-
-
Mon, Aug 17, 2026 9
-
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> -
Footer/contact : Job-Ka rejoint l écosystème (ecosystem.json 13 sites)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-
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>
-
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>
-
WIP v2 committé depuis le nœud — connexion KA ID (restoka/auth.py, hubprofile), favoris (Favoris.tsx, account.tsx), connecteur siteresto, menullm + tests, MAJ sources/ueat/db/web/frontend
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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>
-
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>