Agrégateur de produits québécois — www.fabri-ka.com
Python 38.4%
HTML 30.3%
TypeScript 17.2%
CSS 11%
JavaScript 3.2%
-
Sun, Aug 23, 2026 15
-
connecteur WooCommerce : sitemaps Yoast/AIOSEO et permaliens personnalisés
…
- locs() : ne garder que les <loc> du namespace sitemap (les sitemaps Yoast/AIOSEO embarquent des <image:loc> wp-content qui polluaient la liste), avec repli filtré pour les sitemaps sans namespace - inventaire : accepter les bases de permalien personnalisées (ex. /project/ sur mobilierurbain.ca) en plus de /produit|/product - sync : si la route liste est cassée (500 fatal) mais les fiches unitaires répondent, repli sitemap + fiches par slug (_sitemap_slug_fallback) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
[ka6] fix connecteur inspirationgourmande.ca: wp-json retourne 500 (erreur PHP serveur), pages HTML cachées via WP Super Cache — fallback HTML dans WooCommerceConnector: scrape accueil + catégories FR/EN (/categorie-produit/), extrait JSON-LD Product sur chaque page produit accessible
…
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
[ka6] fix connecteur domainevallierrobert.ca: plugin WP recipe_for_product injecte du HTML avant le JSON REST — ajouter fallback strip-HTML-prefix dans _get_items
…
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
[ka6] fix connecteur origin-north.ai: site SaaS B2B sans boutique Wix — catalog_endpoint null, ecommerce=false
…
origin-north.ai (Cédric Millar Integrated Solutions Inc / AFMQ) est un site SaaS supply chain sans app Wix Stores (app 1380b703 absente, has_cart=false). Corrige catalog_endpoint (était /_api/wix-ecommerce-storefront-web/api, maintenant null pour cohérence avec verify_cache) et ecommerce=false. Store déjà disabled=false. Double filtre ingest (enabled=false + catalog_endpoint=null) garantit l'exclusion. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
[ka6] fix connecteur labonneattitude.com: Hydrogen/Oxygen frontend (ca.attitudeliving.com) n'expose pas /products.json — remplace l'URL par main-ca-attitude.myshopify.com; myshopify.com bloque les UA navigateur, skip -A curl sur .myshopify.com
…
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
build_registry: préservation des overrides manuels d un rebuild à l autre
…
Un rebuild régénérait enabled=true pour les 91 boutiques Wix désactivées à l audit du 2026-08-23 et écrasait les réparations faites au registre. Désormais préservés depuis le stores.json précédent : disabled_reason (l entrée reste désactivée), timeout par boutique (canadel.com), et plateforme/endpoint/url des entrées marquées manual_platform (rose.ca, migrée Woo -> Shopify boutique.rose.ca). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Supervision & réparation boutiques : fenêtre sync_log paramétrable, canadel/rose réparées, 91 Wix sans app Boutique désactivées
…
- /api/stats : nouveau paramètre optionnel syncs_since_h (heures) — retourne toutes les entrées du sync_log depuis now-h (ORDER BY ts DESC LIMIT 4000), minimum les 20 dernières ; sans paramètre, comportement inchangé (30 entrées). Corrige l artefact du moniteur central qui voyait « 1723 produits vs médiane 8469 » : fenêtre de 30 syncs sur ~1 700 boutiques/cycle, le volume réel (355 k produits publiés) n a jamais chuté. - connecteurs : dépassement de délai par boutique via la clé timeout du registre (base.py) — canadel.com (Store API ~50 s/page de 100) passait en timeout 30 s puis Scrapfly 422 ; timeout 90 -> 517 produits synchronisés. - rose.ca : boutique migrée de WooCommerce (Store API vide sur www.rose.ca) vers Shopify boutique.rose.ca -> registre mis à jour (url/platform/ endpoint), 6 produits récupérés (anti-bot Shopify géré par le repli Scrapfly existant). - registre : 91 boutiques Wix désactivées (enabled=false + disabled_reason) après audit live des 170 Wix à 0 produit — 90 sans app Wix Stores (jamais de catalogue accessible ; build_registry assigne l endpoint Wix par défaut dès que la plateforme est wix) + drasca.ca (n est plus un site Wix). Les 79 autres : app présente mais catalogue réellement vide ou entièrement masqué (fermes/CSA saisonnières — vérifié par rendu JS et catalog-reader, totalResults=0) -> laissées actives, le 0 est exact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 22, 2026 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>
-
Fri, Aug 21, 2026 1
-
Wed, Aug 19, 2026 16
-
Fiche boutique : requête « boutiques similaires » réécrite en 2 temps indexés (le LEFT JOIN DISTINCT prenait ~5 min sur les grosses catégories à 347 k produits — 0,5 s maintenant)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague 4 exécutée : registre 3 507 -> 3 947 boutiques (+440, dont 135 connectées et synchronisées, +48 159 produits publiés), 8 boutiques mortes passées « présumée fermée » (backfill historique), 1 679 fiches avec certifications, géocodage des nouvelles RTA ; docs/CONFORMITE.md (CGU/robots datés par source, écartés : REQ Cloudflare+CC-BY-NC-SA, UPA app décommissionnée, SMAQ coquille, Goûtez Lanaudière Eudonet 404, PME MTL sans répertoire, Etsy 403, Ma Zone Québec, Panier Bleu)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Auto-inscription des artisans : page /inscrire (formulaire taxonomie, honeypot, 5 dépôts/24h/IP) -> POST /api/inscriptions en quarantaine pending, vue admin X-Admin-Token + décision approve/reject (approve = verify + fiche au registre, source auto_inscription), journal logs/inscriptions.log ; badges certifications + présumée fermée sur la fiche boutique ; /api/stores exclut les fermées par défaut
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Certifications structurées (champ stores.certifications : Aliments du Québec, Produits du Québec, Économusée, Arrêts gourmands, Bio CARTV avec certificateur+date) + détection « présumée fermée » : fail_streak sur échecs consécutifs, seuil 12 syncs (~3 j), produits dépubliés, réintégration auto au premier sync réussi, backfills rejouables
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague 4 — nouvelles sources de fabricants : CARTV bio (SIPAB, 3 425 certifiés, 7 POST), CTAQ (transformateurs, AJAX), vendors des collectifs (résolution domaine validée par titre), CIBIM/canards/Îles, catégories Fabriqué à Montréal (acheterquebecois), re-test curl epipresto+laboiteagrains (429 TLS) ; priors registre ; Woo attributes en chaînes tolérés (norseco)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Passes rejouables : retry 429 backoff long sur collections.json, géocodage idempotent ; logs/ ignoré
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Phase 2 — passes d'enrichissement exécutées : géocodage RTA 2 995 boutiques (zippopotam, cache rejouable), 167 boutiques catégorisées via collections Shopify (table consignée), 111 courriels + téléphones, livraison 271->365, re-sondage des 1 256 jamais-sondées (3 réactivées, provancher re-désactivée hors-mission), renommage 169 boutiques génériques + 163 mojibake, héritage catégories (autre 38 312 -> 3 398) ; registre + caches + docs régénérées
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Frontend : « Sur devis », prix dans la devise source, filtre « Fabricants seulement » (kind=fabricant), badges revendeur/collectif, coordonnées et livraison sur la fiche boutique
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Enrichissement boutiques : géocodage RTA via Nominatim (cache), extraction courriel/téléphone/réseaux (pages contact + JSON-LD), taxonomie collections Shopify (table de correspondance consignée)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Qualité produits : listing_status (exclusions cartes-cadeaux/ateliers/abonnements/billets), quarantaine prix>100k et titres vides, prix placeholders 999999 -> sur devis (price_on_request), cap descriptions 600->5000, images 8->15, Woo courte+longue, Wix additionalInfo/inventory/weight, Square include=images,options (galerie), Shopify retry 429 durci
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
tokens.css : overflow-x clip aussi sur html (quirk WebKit iOS) ; immo-ka : zone tactile ka-signup portée à 45 px effectifs
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Stats v2 : dashboard ultra complet (9 KPI+sparklines, 5 jauges, multi-courbes, empilees, distributions, heatmap horaire, 5 tableaux, 10 records) + 5 rapports PDF (kapdf v2) + page /stats v2
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mobile : dvh sur la colonne filtres, anti-zoom iOS 16 px, cible tactile du logo, grain reconcilie avec tokens
…
- styles.css : doublet 100vh/100dvh sur .filters (barre URL iOS) ; regles explicites >=16 px pour #header-search-input, .searchbar input et selects en contexte tactile ; extension tactile ::after du logo (98x29) ; suppression de la redefinition locale du grain body::before (z-index 0) au profit de celle du design system (ka/tokens.css, z-index 9999). - ka/tokens.css : section SOCLE MOBILE OBLIGATOIRE (echelle --z-*, --vh100, .ka-bottombar, verrou ka-scroll-lock, filet anti-zoom iOS). - public/ka-agent.js : agent KA corrige (safe-area, textarea 16 px, plein ecran auto <=640 px + verrou scroll). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Tue, Aug 18, 2026 4
-
Vague 3 : 4 annuaires frais (Pages Vertes, MIAM Mauricie, Garde-Manger MTG, Terroir et Saveurs) — +283 boutiques, +99 connectables, +6 004 produits
…
- scripts/wave3_discovery.py : moisson sitemap/fiches des 4 annuaires (sans clé API, throttle poli, filtre des domaines partenaires) + intégration additive (aggregate -> verify -> registre + DB, mêmes garde-fous que build_registry). - build_registry.py : priors des 5 nouvelles sources (gardemangerduquebec scindé producteurs A / détaillants C via portfolio_category), régions Mauricie/Montérégie, rebuild rejouable. - reprobe_stores.py : --skip / --skip-stamped / --only-file + horodatage last_reprobe sur chaque cible sondée. - Re-sondage : 500 boutiques du stock restant (0 réactivable — vitrines sans endpoint) + 187 nouvelles vague 3 (4 Square réactivées). - Écartés après reconnaissance : Etsy (403), Ma Zone Québec (coquille vide), Goûtez Lanaudière (CRM Eudonet injoignable) ; CMAQ/économusées/Créateurs de saveurs/Signé Local déjà couverts. - provancher.org désactivée (billets de visites, pas des produits) et purgée. - Registre 3 507 (+283) | connectables 1 568 (+99) | productives 1 377 (+78) | produits 301 534 (+6 004). README + docs/connecteurs régénérés. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Docs connecteurs : générateur rejouable + 11 fiches standardisées (6 plateformes, Scrapfly, verdict Ecwid, découverte-registre, enrichissement, INDEX)
…
Croise data/stores.json (3 224 boutiques) + introspection des connecteurs + BD live (volumétrie/complétude produits, top boutiques, gotchas). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague 2 : connecteur Square Online, re-sondage des boutiques, livraison, catégories
…
- connectors/square.py : API storefront publique Square Online (/app/store/api/v13, IDs user/site extraits du HTML) — 32 boutiques Square réactivées, ~2 700 produits gagnés. Ecwid documenté non couvert (client-only, API v3 = token secret). - scripts/reprobe_stores.py : re-sondage des boutiques enabled=0 / sans plateforme (Shopify/Woo/Wix/Squarespace/Square), MAJ stores.json + verify_cache + verified.jsonl + BD. 33 réactivées sur 400 sondées (32 square, 1 woocommerce). - scripts/enrich_shipping.py : colonne stores.shipping_info — politique de livraison (≤400 c.) extraite des pages usuelles, cache disque, throttle Shopify global 0,7 s. 271 boutiques. - schema.py : le classifieur exploite les options Shopify et attributs WooCommerce (details) + matériaux bijoux ; scripts/recategorize.py (backfill, 1 665 produits recatégorisés, jamais de rétrogradation vers autre) ; enrich_products.py aligné. - db.py : connect() tolérant aux verrous (retry), migration shipping_info, passage en WAL ; suppressions FTS par lots (uid UNINDEXED -> 1 balayage/lot de 500 au lieu de 1/produit, débloque les re-syncs massives). - README : 8 connecteurs, 294 266 produits, 1 298 boutiques. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Colonne details (avis/dimensions/variantes) + repli Scrapfly robuste (large_object, sticky)
…
- schema.py : champ Product.details (dict JSON) inclus dans le content_hash - db.py : colonne products.details (migration additive) + insert/update - shopify.py : details (variantes, options, dates) ; Scrapfly collant par boutique bloquée + retry — répare ici-la.co (20 077 produits) - scrapfly.py : suivi des liens large_object (pages >5 Mo, ex. ici-la p.68) - woocommerce.py : details (avis, sku, poids, dimensions, attributs, low_stock, backorder, variations) + vendor depuis la taxonomie brands - wix.py : GraphQL enrichi (sku, brand, discount) -> details + vendor - web.py : details décodé en JSON dans les réponses produit Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-