Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)
Python 69.3%
TypeScript 16.7%
CSS 7.9%
JavaScript 4.7%
HTML 1.4%
-
Fri, Sep 4, 2026 1
-
Fri, Aug 28, 2026 1
-
Wed, Aug 26, 2026 4
-
feat(ka-id v2.2): boost COLLABORATIVE_MODEL des recommandations du modèle ALS (kaid.py aligné sur ka-ui.git/kaid f844854)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
feat(ka-id v2.1): CF SIMILAR_USERS + langue transversale (kaid.py), SDK pilules « Sauvegarder cette recherche »/« Pas pour moi » (ka-id.js), alignés sur ka-ui.git/kaid cbe9c9f
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
fix(ka-id v2): kaid.py — les plages numériques pèsent 0.6 (un simple bon prix ne score plus 1.0), aligné sur ka-ui.git/kaid
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
feat(ka-id v2): personnalisation Groupe KA — restoka/kaid.py (canonique ka-ui.git/kaid), journal serveur (search/detail_view/favorite), reranking des tris « menu » (défaut) et « recent » (cuisine/ville/gamme de prix/type), routeur /api/kaid, SDK ka-id.js, badge « Recommandé pour vous » sur RestoCard
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Tue, Aug 25, 2026 10
-
KA Tabbar : sync canonique ka-ui (prop onClick sur les onglets-liens)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Barre de navigation mobile commune Groupe KA (KA Tabbar v1)
…
L ancienne tabbar 3 onglets bord-à-bord devient la pilule flottante du standard ka-ui/nav : Découvrir · Recherche · Villes · Favoris, accent orange, safe-area iOS. Recherche = focus du champ de l accueil (id f-q) ; le fab Filtres remonte au-dessus de la pilule. Stats/Sources restent au menu. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
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/ombres), ombre safran signature au survol des cartes — aucune logique changée
…
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
Major upgrade connecteurs : 7 nouvelles sources (mtl-alim, tastet, chownow, gloriafood, square, doordash, skip) + site-resto hub de découverte multi-plateformes
…
- mtl-alim : découverte massive Montréal (CSV open data, ~7 500 fiches food-service) - tastet : découverte éditoriale (1 516 critiques, coordonnées + lien source) - chownow/gloriafood/square : Palier 1 takeout (prix réels), dormants jusqu'à découverte de leurs intégrations par site-resto (*-discovered.json avec uid porteur) - doordash/skip : Palier 2 delivery, enrichissement conservateur (jamais de fiche, croisement téléphone/postal+civique/GPS+nom, menus étiquetés delivery) - siteresto : détection des widgets GloriaFood/ChowNow/Square/Clover sur les sites - dedup : priorités mtl-alim/tastet ; registre sources.json complété (17 sources) - 7 fichiers de tests (110 tests verts), smoke-runs live validés Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
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>
-
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>
-
Mon, Aug 24, 2026 6
-
feat(doc): page documentation /doc (guide + captures) + lien footer + PDF téléchargeable
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
data : mise à jour du répertoire UEAT découvert
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Sun, Aug 23, 2026 7
-
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>
-
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>
-
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>
-
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> -
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 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>
-