← back to Dw Photo Capture
Learn how each vendor labels their samples (180 vendor profiles)
5ebe4e664f10ccc92e90d8dc06d8f743832df9b6 · 2026-06-25 23:03:04 -0700 · Steve Abrams
The scanner's vendor knowledge was 5 hardcoded entries; now it learns every
vendor's sample-labeling pattern from two sources:
- build_vendor_profiles.py: one Shopify bulk export grouped by vendor induces a
per-vendor profile — brand-name regex, manufacturer-code prefix histogram,
numeric-share, example codes. Learns from the MANUFACTURER code (what's printed
on the swatch), not the DW house SKU. 180 vendors profiled from 131k products.
- /api/learn: each scan that resolves to a real product folds the on-swatch code
prefix back into that vendor's profile (learned_scans++), persisted + live.
server.js merges seed VENDOR_LEX + learned profiles into a runtime LEXICON that
analyzeOcr consults, so brand detection + SKU-prefix boosting + fast-lock now
cover all 180 vendors. profileToLex handles prefixed AND numeric-coded vendors.
/learn viewer (admin, basic-auth) shows what's been learned per vendor — prefixes,
examples, code-source (mfr vs house), private-label flag, scan count, updated time.
Verified: Scalamandre (learned-only, not seeded) → vendor detected + topStrong;
/api/learn write persists + rebuilds lexicon. $0 (local + Shopify read).
Files touched
A build_vendor_profiles.pyA data/vendor_profiles.jsonM public/index.htmlA public/learn.htmlM server.js
Diff
commit 5ebe4e664f10ccc92e90d8dc06d8f743832df9b6
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Jun 25 23:03:04 2026 -0700
Learn how each vendor labels their samples (180 vendor profiles)
The scanner's vendor knowledge was 5 hardcoded entries; now it learns every
vendor's sample-labeling pattern from two sources:
- build_vendor_profiles.py: one Shopify bulk export grouped by vendor induces a
per-vendor profile — brand-name regex, manufacturer-code prefix histogram,
numeric-share, example codes. Learns from the MANUFACTURER code (what's printed
on the swatch), not the DW house SKU. 180 vendors profiled from 131k products.
- /api/learn: each scan that resolves to a real product folds the on-swatch code
prefix back into that vendor's profile (learned_scans++), persisted + live.
server.js merges seed VENDOR_LEX + learned profiles into a runtime LEXICON that
analyzeOcr consults, so brand detection + SKU-prefix boosting + fast-lock now
cover all 180 vendors. profileToLex handles prefixed AND numeric-coded vendors.
/learn viewer (admin, basic-auth) shows what's been learned per vendor — prefixes,
examples, code-source (mfr vs house), private-label flag, scan count, updated time.
Verified: Scalamandre (learned-only, not seeded) → vendor detected + topStrong;
/api/learn write persists + rebuilds lexicon. $0 (local + Shopify read).
---
build_vendor_profiles.py | 148 ++
data/vendor_profiles.json | 4520 +++++++++++++++++++++++++++++++++++++++++++++
public/index.html | 8 +-
public/learn.html | 109 ++
server.js | 85 +-
5 files changed, 4867 insertions(+), 3 deletions(-)
diff --git a/build_vendor_profiles.py b/build_vendor_profiles.py
new file mode 100644
index 0000000..a40973d
--- /dev/null
+++ b/build_vendor_profiles.py
@@ -0,0 +1,148 @@
+#!/usr/bin/env python3
+"""Build data/vendor_profiles.json — learn HOW EACH VENDOR LABELS THEIR SAMPLES from the
+live catalog, so the SKU scanner can detect the brand and lock onto the right code fast.
+
+For every Shopify `vendor` we group all of that vendor's manufacturer codes (+ house SKUs)
+and induce a profile:
+ • aliases — brand-name strings to look for in the OCR text (regex-ready)
+ • prefixes — histogram of the leading alpha run of their codes (WD, WDW, WHF, …)
+ • numeric — share of codes that are bare numbers (Schumacher 5255-16 style)
+ • shape — typical length of a code
+ • examples — a few real codes
+This is the deterministic counterpart to live scan-learning (/api/learn): the catalog
+teaches the broad strokes instantly; live scans refine the on-swatch reality over time.
+
+Uses one Bulk Operation (server-side full export). Read-only. $0 (local + Shopify read)."""
+import json, os, re, sys, time, urllib.request
+from collections import defaultdict, Counter
+from datetime import datetime, timezone
+
+SHOP = "designer-laboratory-sandbox.myshopify.com"; API = "2024-10"
+ROOT = os.path.dirname(os.path.abspath(__file__))
+OUT = os.path.join(ROOT, "data", "vendor_profiles.json")
+TOKEN = os.environ.get("SHOPIFY_ADMIN_TOKEN", "")
+if not TOKEN:
+ for line in open(os.path.expanduser("~/Projects/secrets-manager/.env")):
+ if line.startswith("SHOPIFY_ADMIN_TOKEN="):
+ TOKEN = line.strip().split("=", 1)[1]; break
+assert TOKEN, "no SHOPIFY_ADMIN_TOKEN"
+
+# Front-facing private-label rule: these upstream names must NEVER be surfaced to a
+# customer. The scanner is an internal admin tool so it MAY detect them, but we tag the
+# profile so any public consumer can skip it. (See MEMORY: Brewster/York/WallQuest…)
+PRIVATE_LABEL = re.compile(r"BREWSTER|YORK|WALLQUEST|CHESAPEAKE|NEXTWALL|SEABROOK|COMMAND ?54|DESIMA|CARLSTEN|NICOLETTE ?MAYER", re.I)
+
+def gql(query):
+ req = urllib.request.Request(f"https://{SHOP}/admin/api/{API}/graphql.json",
+ data=json.dumps({"query": query}).encode(),
+ headers={"X-Shopify-Access-Token": TOKEN, "Content-Type": "application/json"})
+ return json.load(urllib.request.urlopen(req, timeout=90))
+
+def parts(val): # "WDW-2290; Diamond WMT5001" -> ["WDW-2290","Diamond WMT5001"]
+ return [p for p in re.split(r"[;,/|]+", val or "") if p.strip()]
+
+def norm(s): # display code, trimmed (keep dashes for shape)
+ return re.sub(r"\s+", "", (s or "").upper())
+
+def alpha_prefix(code): # leading letters of a code: WDW2310 -> WDW ; 5255-16 -> ""
+ m = re.match(r"[A-Za-z]+", code.strip())
+ return m.group(0).upper() if m else ""
+
+def brand_regex(name): # vendor name -> flexible OCR detection pattern
+ words = [w.upper() for w in re.findall(r"[A-Za-z]+", name) if len(w) >= 3]
+ if not words: return None
+ # single short word (ARTE, ROMO) is noisy — require ≥4 chars; multi-word is safe at ≥3
+ if len(words) == 1 and len(words[0]) < 4: return None
+ return r"\s*".join(re.escape(w) for w in words)
+
+# ── 1) bulk export: vendor + mfr metafields + variant skus ────────────────────
+BULK_Q = '''
+{
+ products {
+ edges { node {
+ id status vendor
+ mf: metafield(namespace:"custom", key:"manufacturer_sku"){ value }
+ mf2: metafield(namespace:"dwc", key:"manufacturer_sku"){ value }
+ variants { edges { node { sku } } }
+ }}
+ }
+}'''
+start = gql('mutation { bulkOperationRunQuery(query: """%s""") { bulkOperation{ id status } userErrors{ field message } } }' % BULK_Q)
+ue = start.get("data", {}).get("bulkOperationRunQuery", {}).get("userErrors", [])
+if ue:
+ print("bulk start errors:", ue)
+ print("current:", gql('{ currentBulkOperation { id status } }')["data"]["currentBulkOperation"])
+ sys.exit(1)
+print("bulk op started, polling…")
+
+url = None
+for _ in range(180):
+ time.sleep(5)
+ cur = gql('{ currentBulkOperation { id status errorCode objectCount url } }')["data"]["currentBulkOperation"]
+ print(f" status={cur['status']} objects={cur.get('objectCount')}")
+ if cur["status"] == "COMPLETED": url = cur["url"]; break
+ if cur["status"] in ("FAILED", "CANCELED"): print("bulk failed:", cur); sys.exit(1)
+assert url, "bulk op did not complete in time"
+
+# ── 2) parse JSONL: collect codes per vendor ──────────────────────────────────
+# Keep the two code namespaces SEPARATE: the manufacturer code (printed on the physical
+# swatch — what the scanner reads) vs the DW house SKU (what we resolve to). The profile
+# describes the SAMPLE, so we learn from mfr codes first and only fall back to house codes.
+data = urllib.request.urlopen(url, timeout=300).read().decode()
+prod_vendor = {} # gid -> vendor
+mfr_by_vendor = defaultdict(list) # vendor -> [manufacturer code, …] (on the swatch)
+house_by_vendor = defaultdict(list) # vendor -> [DW house sku, …] (fallback)
+for line in data.splitlines():
+ if not line.strip(): continue
+ o = json.loads(line)
+ if "__parentId" in o and "sku" in o: # variant child = house sku
+ ven = prod_vendor.get(o["__parentId"])
+ sku = (o.get("sku") or "")
+ if ven and sku and not sku.lower().endswith("-sample"):
+ house_by_vendor[ven].append(sku)
+ elif "id" in o and ("vendor" in o or "status" in o): # product line = mfr metafields
+ ven = (o.get("vendor") or "").strip()
+ prod_vendor[o["id"]] = ven
+ if not ven: continue
+ for k in ("mf", "mf2"):
+ v = (o.get(k) or {}).get("value")
+ if v:
+ for c in parts(v): mfr_by_vendor[ven].append(c)
+
+# ── 3) induce a profile per vendor ────────────────────────────────────────────
+profiles = {}
+for vendor in set(mfr_by_vendor) | set(house_by_vendor):
+ mfr = [norm(c) for c in mfr_by_vendor.get(vendor, []) if len(norm(c)) >= 4]
+ house = [norm(c) for c in house_by_vendor.get(vendor, []) if len(norm(c)) >= 4]
+ # learn from the manufacturer codes (the swatch); only fall back to house if too thin
+ codes = mfr if len(set(mfr)) >= 3 else house
+ code_source = "mfr" if len(set(mfr)) >= 3 else "house"
+ if len(codes) < 3: continue # too thin to learn anything reliable
+ uniq = sorted(set(codes))
+ pre = Counter(alpha_prefix(c) for c in codes if alpha_prefix(c))
+ numeric = sum(1 for c in codes if not alpha_prefix(c))
+ # keep prefixes that are common enough to be a real signal (≥3 hits AND ≥4% of codes)
+ keep = [(p, n) for p, n in pre.most_common(8) if n >= 3 and n >= 0.04 * len(codes)]
+ lens = Counter(len(c) for c in codes)
+ profiles[vendor] = {
+ "n": len(uniq),
+ "aliases": [vendor.upper()],
+ "alias_re": brand_regex(vendor),
+ "prefixes": {p: n for p, n in keep},
+ "numeric_share": round(numeric / max(1, len(codes)), 2),
+ "common_len": lens.most_common(1)[0][0] if lens else 0,
+ "examples": uniq[:6],
+ "private_label": bool(PRIVATE_LABEL.search(vendor)),
+ "source": "catalog",
+ "code_source": code_source, # "mfr" = learned from real swatch codes; "house" = fallback
+ "learned_scans": 0,
+ "updated_at": datetime.now(timezone.utc).isoformat(),
+ }
+
+meta = {"_meta": {"vendors": len(profiles), "products": len(prod_vendor),
+ "built_at": datetime.now(timezone.utc).isoformat(), "source": "catalog-bulk"}}
+json.dump({**meta, "profiles": profiles}, open(OUT, "w"), indent=0)
+print(f"\nlearned {len(profiles)} vendor profiles from {len(prod_vendor)} products -> {OUT}")
+for probe in ("Winfield Thybony", "Schumacher", "Phillip Jeffries", "Thibaut", "Kravet"):
+ p = profiles.get(probe)
+ if p: print(f" {probe:22} n={p['n']:5} prefixes={list(p['prefixes'])} ex={p['examples'][:3]}")
diff --git a/data/vendor_profiles.json b/data/vendor_profiles.json
new file mode 100644
index 0000000..37555de
--- /dev/null
+++ b/data/vendor_profiles.json
@@ -0,0 +1,4520 @@
+{
+ "_meta": {
+ "vendors": 180,
+ "products": 131515,
+ "built_at": "2026-06-26T06:01:30.211846+00:00",
+ "source": "catalog-bulk",
+ "updated_at": "2026-06-26T06:02:15.340Z"
+ },
+ "profiles": {
+ "Fentucci": {
+ "n": 607,
+ "aliases": [
+ "FENTUCCI"
+ ],
+ "alias_re": "FENTUCCI",
+ "prefixes": {
+ "TRUE": 2069
+ },
+ "numeric_share": 0.2,
+ "common_len": 4,
+ "examples": [
+ "1014-001834",
+ "1014-001858",
+ "145-44151",
+ "149-62141",
+ "19-87404",
+ "20232-27"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.714205+00:00"
+ },
+ "Versace": {
+ "n": 432,
+ "aliases": [
+ "VERSACE"
+ ],
+ "alias_re": "VERSACE",
+ "prefixes": {
+ "SANCAR": 184,
+ "VERSACE": 62,
+ "YORK": 41
+ },
+ "numeric_share": 0.57,
+ "common_len": 6,
+ "examples": [
+ "1202935221",
+ "1202935241",
+ "1202935244",
+ "1202935461",
+ "1202935465",
+ "1202935472"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.716310+00:00"
+ },
+ "Elitis": {
+ "n": 243,
+ "aliases": [
+ "ELITIS"
+ ],
+ "alias_re": "ELITIS",
+ "prefixes": {
+ "ELIT": 488
+ },
+ "numeric_share": 0,
+ "common_len": 15,
+ "examples": [
+ "ELIT-A-L-AUBE-VIBRANTE-VP-731-85",
+ "ELIT-AUTHENTIQUE-APPARENCE-VP-633-03",
+ "ELIT-BOIS-D-AUTOMNE-VP-1030-07",
+ "ELIT-COMME-UNE-PERLE-AMBREE-VP-633-80",
+ "ELIT-COUCHER-DE-SOLEIL-SUR-LE-PACIFIQUE-VP-1043-01",
+ "ELIT-DANS-LE-SOUFFLE-DU-VENT-VP-1048-05"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.717518+00:00"
+ },
+ "Brand McKenzie": {
+ "n": 5,
+ "aliases": [
+ "BRAND MCKENZIE"
+ ],
+ "alias_re": "BRAND\\s*MCKENZIE",
+ "prefixes": {
+ "BMTD": 86,
+ "BMPP": 74,
+ "BMCF": 71,
+ "BMHD": 70,
+ "BMGI": 26
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "BMCF003",
+ "BMGI006",
+ "BMHD002",
+ "BMPP004",
+ "BMTD001"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.718520+00:00"
+ },
+ "Mind the Gap": {
+ "n": 1157,
+ "aliases": [
+ "MIND THE GAP"
+ ],
+ "alias_re": "MIND\\s*THE\\s*GAP",
+ "prefixes": {
+ "WP": 942,
+ "TRUE": 110
+ },
+ "numeric_share": 0.09,
+ "common_len": 7,
+ "examples": [
+ "2020100",
+ "2020101",
+ "2020102",
+ "2020103",
+ "2020104",
+ "2020105"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.722661+00:00"
+ },
+ "Wolf Gordon": {
+ "n": 1658,
+ "aliases": [
+ "WOLF GORDON"
+ ],
+ "alias_re": "WOLF\\s*GORDON",
+ "prefixes": {
+ "AZ": 314,
+ "Y": 108
+ },
+ "numeric_share": 0.1,
+ "common_len": 9,
+ "examples": [
+ "031307",
+ "10002",
+ "10003",
+ "10200",
+ "10201",
+ "10202"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.729467+00:00"
+ },
+ "Nicolette Mayer Fabrics": {
+ "n": 57,
+ "aliases": [
+ "NICOLETTE MAYER FABRICS"
+ ],
+ "alias_re": "NICOLETTE\\s*MAYER\\s*FABRICS",
+ "prefixes": {
+ "N": 48,
+ "NM": 9
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "N4AG10-007",
+ "N4AG10-027",
+ "N4AG10-029",
+ "N4AG10-036",
+ "N4AG10-038",
+ "N4BL10-039"
+ ],
+ "private_label": true,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.729645+00:00"
+ },
+ "Brunschwig & Fils": {
+ "n": 4198,
+ "aliases": [
+ "BRUNSCHWIG & FILS"
+ ],
+ "alias_re": "BRUNSCHWIG\\s*FILS",
+ "prefixes": {
+ "BR": 625,
+ "T": 475,
+ "JAG": 218
+ },
+ "numeric_share": 0.7,
+ "common_len": 12,
+ "examples": [
+ "1001.CS.0",
+ "1002.CS.0",
+ "10020.CS.0",
+ "1003.CS.0",
+ "1004.CS.0",
+ "1006.CS.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.741669+00:00"
+ },
+ "Printy6": {
+ "n": 13,
+ "aliases": [
+ "PRINTY6"
+ ],
+ "alias_re": "PRINTY",
+ "prefixes": {
+ "SNP": 3
+ },
+ "numeric_share": 0,
+ "common_len": 13,
+ "examples": [
+ "SNP2ZSYCFA6LL",
+ "SNP3K0WXRPIIF",
+ "SNP4P2EECCZFG",
+ "SNPAOWGS6CV8R",
+ "SNPBOBJML11I3",
+ "SNPD8HIBUELMC"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.741785+00:00"
+ },
+ "Donghia": {
+ "n": 161,
+ "aliases": [
+ "DONGHIA"
+ ],
+ "alias_re": "DONGHIA",
+ "prefixes": {
+ "DG": 233,
+ "P": 84
+ },
+ "numeric_share": 0.01,
+ "common_len": 12,
+ "examples": [
+ "6021126",
+ "6021127.11.0",
+ "DG-09700.003",
+ "DG-09700.018",
+ "DG-09702.008",
+ "DG-09703.008"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.742683+00:00"
+ },
+ "Kirkby Design": {
+ "n": 3,
+ "aliases": [
+ "KIRKBY DESIGN"
+ ],
+ "alias_re": "KIRKBY\\s*DESIGN",
+ "prefixes": {
+ "WK": 5
+ },
+ "numeric_share": 0,
+ "common_len": 5,
+ "examples": [
+ "WK810",
+ "WK813",
+ "WK820"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.742765+00:00"
+ },
+ "Laura Ashley Wallpaper": {
+ "n": 130,
+ "aliases": [
+ "LAURA ASHLEY WALLPAPER"
+ ],
+ "alias_re": "LAURA\\s*ASHLEY\\s*WALLPAPER",
+ "prefixes": {
+ "LAURA": 27
+ },
+ "numeric_share": 0.85,
+ "common_len": 6,
+ "examples": [
+ "118469",
+ "118470",
+ "118471",
+ "118472",
+ "118473",
+ "118475"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.743358+00:00"
+ },
+ "Boråstapeter": {
+ "n": 28,
+ "aliases": [
+ "BORÅSTAPETER"
+ ],
+ "alias_re": "BOR\\s*STAPETER",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 4,
+ "examples": [
+ "1960",
+ "2078",
+ "2092",
+ "3119",
+ "4587",
+ "5350"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.743466+00:00"
+ },
+ "Threads": {
+ "n": 79,
+ "aliases": [
+ "THREADS"
+ ],
+ "alias_re": "THREADS",
+ "prefixes": {
+ "EW": 68,
+ "NARROWCORD": 12
+ },
+ "numeric_share": 0,
+ "common_len": 13,
+ "examples": [
+ "CABLECORD.COFFEE.0",
+ "EW15005_905",
+ "EW15013.140.0",
+ "EW15013.680.0",
+ "EW15018.225.0",
+ "EW15018.615.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.743755+00:00"
+ },
+ "Designers Guild": {
+ "n": 676,
+ "aliases": [
+ "DESIGNERS GUILD"
+ ],
+ "alias_re": "DESIGNERS\\s*GUILD",
+ "prefixes": {
+ "PDG": 901,
+ "P": 600
+ },
+ "numeric_share": 0.05,
+ "common_len": 6,
+ "examples": [
+ "985621",
+ "985631",
+ "985641",
+ "985651",
+ "985661",
+ "985761"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.749250+00:00"
+ },
+ "Witch & Watchman": {
+ "n": 10,
+ "aliases": [
+ "WITCH & WATCHMAN"
+ ],
+ "alias_re": "WITCH\\s*WATCHMAN",
+ "prefixes": {},
+ "numeric_share": 0,
+ "common_len": 29,
+ "examples": [
+ "AMAZONIA-DARK",
+ "AMAZONIA-LIGHT-JUNGLE-WALLPAPER",
+ "BELLA-DONNA-FANTASY-WALLPAPER",
+ "BELLA-DONNA-LIGHT-FANTASY-WALLPAPER",
+ "FOLIA-DARK-JUNGLE",
+ "FOLIA-LIGHT-JUNGLE-WALLPAPER"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.749316+00:00"
+ },
+ "Architectural Fabrics": {
+ "n": 478,
+ "aliases": [
+ "ARCHITECTURAL FABRICS"
+ ],
+ "alias_re": "ARCHITECTURAL\\s*FABRICS",
+ "prefixes": {
+ "PI": 296,
+ "BY": 116,
+ "OTHER": 72,
+ "KINDA": 42,
+ "SUNNY": 40
+ },
+ "numeric_share": 0,
+ "common_len": 17,
+ "examples": [
+ "ACQUISITIONS-220",
+ "ACQUISITIONS-7",
+ "BLOODLINE-CREAM",
+ "BLOODLINE-FAWN",
+ "BLOODLINE-FOG",
+ "BLOODLINE-MINERAL"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.752778+00:00"
+ },
+ "Et Cie Wall Panels": {
+ "n": 451,
+ "aliases": [
+ "ET CIE WALL PANELS"
+ ],
+ "alias_re": "CIE\\s*WALL\\s*PANELS",
+ "prefixes": {},
+ "numeric_share": 0.98,
+ "common_len": 5,
+ "examples": [
+ "19000",
+ "190001",
+ "190002",
+ "190003",
+ "190004",
+ "190005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.755758+00:00"
+ },
+ "Roberto Cavalli Wallpaper": {
+ "n": 194,
+ "aliases": [
+ "ROBERTO CAVALLI WALLPAPER"
+ ],
+ "alias_re": "ROBERTO\\s*CAVALLI\\s*WALLPAPER",
+ "prefixes": {
+ "RC": 149
+ },
+ "numeric_share": 0.33,
+ "common_len": 7,
+ "examples": [
+ "0RC18092",
+ "16001",
+ "16003",
+ "16009",
+ "16013",
+ "16021"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.756899+00:00"
+ },
+ "1838 Wallcoverings": {
+ "n": 412,
+ "aliases": [
+ "1838 WALLCOVERINGS"
+ ],
+ "alias_re": "WALLCOVERINGS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 11,
+ "examples": [
+ "1001200",
+ "1001201",
+ "1001202",
+ "1001203",
+ "1001204",
+ "1001205"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.758648+00:00"
+ },
+ "Hospitality Wallcoverings": {
+ "n": 98,
+ "aliases": [
+ "HOSPITALITY WALLCOVERINGS"
+ ],
+ "alias_re": "HOSPITALITY\\s*WALLCOVERINGS",
+ "prefixes": {},
+ "numeric_share": 0.99,
+ "common_len": 5,
+ "examples": [
+ "30001",
+ "30002",
+ "30003",
+ "30004",
+ "30005",
+ "30006"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.759072+00:00"
+ },
+ "Los Angeles Fabrics": {
+ "n": 1958,
+ "aliases": [
+ "LOS ANGELES FABRICS"
+ ],
+ "alias_re": "LOS\\s*ANGELES\\s*FABRICS",
+ "prefixes": {
+ "JD": 4266
+ },
+ "numeric_share": 0,
+ "common_len": 19,
+ "examples": [
+ "JD-ABRAXAS-AMAZON",
+ "JD-ABRAXAS-AVOCADO",
+ "JD-ABRAXAS-CHOCO",
+ "JD-ABRAXAS-DESERT",
+ "JD-ABRAXAS-EMBER",
+ "JD-ABRAXAS-PARIS"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.772900+00:00"
+ },
+ "Hand Crafted": {
+ "n": 45,
+ "aliases": [
+ "HAND CRAFTED"
+ ],
+ "alias_re": "HAND\\s*CRAFTED",
+ "prefixes": {},
+ "numeric_share": 0.98,
+ "common_len": 5,
+ "examples": [
+ "50401",
+ "50402",
+ "50403",
+ "50404",
+ "50405",
+ "50406"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.773239+00:00"
+ },
+ "Newwall": {
+ "n": 62,
+ "aliases": [
+ "NEWWALL"
+ ],
+ "alias_re": "NEWWALL",
+ "prefixes": {
+ "A": 46
+ },
+ "numeric_share": 0.26,
+ "common_len": 6,
+ "examples": [
+ "2200-1",
+ "2200-2",
+ "2200-4",
+ "2200-5",
+ "2200-6",
+ "2200-7"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.773439+00:00"
+ },
+ "Fentucci Fabrics": {
+ "n": 8,
+ "aliases": [
+ "FENTUCCI FABRICS"
+ ],
+ "alias_re": "FENTUCCI\\s*FABRICS",
+ "prefixes": {
+ "TRUE": 367
+ },
+ "numeric_share": 0.03,
+ "common_len": 4,
+ "examples": [
+ "67317",
+ "67326",
+ "67330",
+ "67331",
+ "67336",
+ "67340"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.774547+00:00"
+ },
+ "Sister Parish": {
+ "n": 144,
+ "aliases": [
+ "SISTER PARISH"
+ ],
+ "alias_re": "SISTER\\s*PARISH",
+ "prefixes": {
+ "DWPH": 144
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "DWPH-10001",
+ "DWPH-10001-S",
+ "DWPH-10002",
+ "DWPH-10002-S",
+ "DWPH-10003",
+ "DWPH-10003-S"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.774888+00:00"
+ },
+ "Baker Lifestyle": {
+ "n": 5,
+ "aliases": [
+ "BAKER LIFESTYLE"
+ ],
+ "alias_re": "BAKER\\s*LIFESTYLE",
+ "prefixes": {
+ "PW": 9
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "PW78000.5",
+ "PW78025.3",
+ "PW78033.5.0",
+ "PW78034.3.0",
+ "PW78034.5.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.774929+00:00"
+ },
+ "Harlequin": {
+ "n": 584,
+ "aliases": [
+ "HARLEQUIN"
+ ],
+ "alias_re": "HARLEQUIN",
+ "prefixes": {},
+ "numeric_share": 0.94,
+ "common_len": 6,
+ "examples": [
+ "110101",
+ "110104",
+ "110108",
+ "110367",
+ "110379",
+ "110556"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.777079+00:00"
+ },
+ "Kravet": {
+ "n": 4846,
+ "aliases": [
+ "KRAVET"
+ ],
+ "alias_re": "KRAVET",
+ "prefixes": {
+ "W": 4357,
+ "TP": 448
+ },
+ "numeric_share": 0.05,
+ "common_len": 9,
+ "examples": [
+ "2002172.16.0",
+ "2012175.11.0",
+ "2017119.40.0",
+ "2019105.134.0",
+ "2019153.133.0",
+ "23956.101.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.796971+00:00"
+ },
+ "Ralph Lauren": {
+ "n": 158,
+ "aliases": [
+ "RALPH LAUREN"
+ ],
+ "alias_re": "RALPH\\s*LAUREN",
+ "prefixes": {
+ "PRL": 242,
+ "FRL": 194
+ },
+ "numeric_share": 0.01,
+ "common_len": 7,
+ "examples": [
+ "19779",
+ "20132",
+ "48780",
+ "FRL009",
+ "FRL118",
+ "FRL123"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.798572+00:00"
+ },
+ "Flavor Paper": {
+ "n": 57,
+ "aliases": [
+ "FLAVOR PAPER"
+ ],
+ "alias_re": "FLAVOR\\s*PAPER",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 6,
+ "examples": [
+ "302001",
+ "302002",
+ "302004",
+ "302005",
+ "302006",
+ "302007"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.798827+00:00"
+ },
+ "Phyllis Morris": {
+ "n": 8,
+ "aliases": [
+ "PHYLLIS MORRIS"
+ ],
+ "alias_re": "PHYLLIS\\s*MORRIS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "75900",
+ "75905",
+ "75906",
+ "75910",
+ "75917",
+ "75922"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.798893+00:00"
+ },
+ "DW Bespoke Studio": {
+ "n": 100,
+ "aliases": [
+ "DW BESPOKE STUDIO"
+ ],
+ "alias_re": "BESPOKE\\s*STUDIO",
+ "prefixes": {
+ "DIG": 166,
+ "TRUE": 100,
+ "DIGITALPRINTONCORK": 14
+ },
+ "numeric_share": 0.06,
+ "common_len": 4,
+ "examples": [
+ "16457",
+ "16458",
+ "1800SGREENGOLDLEAFCREST.JPG",
+ "2023",
+ "60088",
+ "62108"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.817055+00:00"
+ },
+ "GP & J Baker": {
+ "n": 1885,
+ "aliases": [
+ "GP & J BAKER"
+ ],
+ "alias_re": "BAKER",
+ "prefixes": {
+ "BF": 949,
+ "BP": 504,
+ "PF": 329,
+ "BW": 272,
+ "PP": 114
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "ALDINE_PLUM",
+ "B0860.1.0",
+ "BF10010_1",
+ "BF10010_3",
+ "BF10014_450",
+ "BF10036_990"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.824367+00:00"
+ },
+ "Designtex": {
+ "n": 351,
+ "aliases": [
+ "DESIGNTEX"
+ ],
+ "alias_re": "DESIGNTEX",
+ "prefixes": {},
+ "numeric_share": 0.76,
+ "common_len": 7,
+ "examples": [
+ "2693103",
+ "2693105",
+ "2693106",
+ "2693301",
+ "2693302",
+ "2693304"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.825431+00:00"
+ },
+ "Scalamandre Wallpaper": {
+ "n": 819,
+ "aliases": [
+ "SCALAMANDRE WALLPAPER"
+ ],
+ "alias_re": "SCALAMANDRE\\s*WALLPAPER",
+ "prefixes": {
+ "WP": 781,
+ "WRK": 195,
+ "WTT": 189,
+ "WH": 113,
+ "WTW": 70
+ },
+ "numeric_share": 0.05,
+ "common_len": 7,
+ "examples": [
+ "0001G1183",
+ "0001G1184",
+ "0001G1185",
+ "0001G1186",
+ "0001G1188",
+ "0001G1189"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.829151+00:00"
+ },
+ "Missoni Home": {
+ "n": 3,
+ "aliases": [
+ "MISSONI HOME"
+ ],
+ "alias_re": "MISSONI\\s*HOME",
+ "prefixes": {
+ "MIS": 3
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "MIS-18312",
+ "MIS-18358",
+ "MIS-18378"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.829193+00:00"
+ },
+ "Franquemont London": {
+ "n": 26,
+ "aliases": [
+ "FRANQUEMONT LONDON"
+ ],
+ "alias_re": "FRANQUEMONT\\s*LONDON",
+ "prefixes": {
+ "JAVA": 22,
+ "VINE": 14,
+ "VERSTER": 10,
+ "FLORAL": 4
+ },
+ "numeric_share": 0,
+ "common_len": 15,
+ "examples": [
+ "FLORAL-STRIPE-MIDNIGHT-TRUFFLE",
+ "FLORAL-ZIGZAG-SLATE-BLUE",
+ "JAVA-ARCTIC",
+ "JAVA-BLUSH",
+ "JAVA-BURNT-ORANGE",
+ "JAVA-GLOWING-EMBER"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.829333+00:00"
+ },
+ "FallingStar Studio": {
+ "n": 21,
+ "aliases": [
+ "FALLINGSTAR STUDIO"
+ ],
+ "alias_re": "FALLINGSTAR\\s*STUDIO",
+ "prefixes": {
+ "FS": 20
+ },
+ "numeric_share": 0,
+ "common_len": 14,
+ "examples": [
+ "DWRA-1001",
+ "FS-DP-W1006-04",
+ "FS-DP-W1006-05",
+ "FS-DP-W1007-01",
+ "FS-DP-W1007-02",
+ "FS-DP-W1007-03"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.829434+00:00"
+ },
+ "Holly Hunt Walls": {
+ "n": 770,
+ "aliases": [
+ "HOLLY HUNT WALLS"
+ ],
+ "alias_re": "HOLLY\\s*HUNT\\s*WALLS",
+ "prefixes": {
+ "W": 654
+ },
+ "numeric_share": 0.32,
+ "common_len": 6,
+ "examples": [
+ "800001",
+ "800002",
+ "800004",
+ "800005",
+ "800006",
+ "800007"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.833408+00:00"
+ },
+ "Limited Stock": {
+ "n": 122,
+ "aliases": [
+ "LIMITED STOCK"
+ ],
+ "alias_re": "LIMITED\\s*STOCK",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "75600",
+ "75601",
+ "75602",
+ "75603",
+ "75604",
+ "75605"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.833922+00:00"
+ },
+ "Missoni Wallpaper": {
+ "n": 112,
+ "aliases": [
+ "MISSONI WALLPAPER"
+ ],
+ "alias_re": "MISSONI\\s*WALLPAPER",
+ "prefixes": {
+ "MI": 25,
+ "YORK": 14
+ },
+ "numeric_share": 0.66,
+ "common_len": 5,
+ "examples": [
+ "13500",
+ "13501",
+ "13502",
+ "13504",
+ "13505",
+ "13506"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.834366+00:00"
+ },
+ "Romo": {
+ "n": 295,
+ "aliases": [
+ "ROMO"
+ ],
+ "alias_re": "ROMO",
+ "prefixes": {
+ "W": 618,
+ "MW": 229,
+ "ZW": 70,
+ "WK": 52
+ },
+ "numeric_share": 0,
+ "common_len": 4,
+ "examples": [
+ "02FP",
+ "03FP",
+ "MW100",
+ "MW101",
+ "MW102",
+ "MW103"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.837501+00:00"
+ },
+ "Ronald Redding": {
+ "n": 514,
+ "aliases": [
+ "RONALD REDDING"
+ ],
+ "alias_re": "RONALD\\s*REDDING",
+ "prefixes": {
+ "RRD": 82,
+ "AC": 82,
+ "GV": 82,
+ "NZ": 45,
+ "ZA": 40,
+ "KT": 38,
+ "MX": 36
+ },
+ "numeric_share": 0.2,
+ "common_len": 6,
+ "examples": [
+ "5804",
+ "5851",
+ "5855",
+ "5873",
+ "66100",
+ "66102"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.839568+00:00"
+ },
+ "Nicolette Mayer Wallpaper": {
+ "n": 156,
+ "aliases": [
+ "NICOLETTE MAYER WALLPAPER"
+ ],
+ "alias_re": "NICOLETTE\\s*MAYER\\s*WALLPAPER",
+ "prefixes": {
+ "WNM": 151
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "ARCADIA-NICOLETTE-MAYER-WALLPAPER",
+ "WNM0001BLOM",
+ "WNM0001BLOO",
+ "WNM0001BOSP",
+ "WNM0001BOUD",
+ "WNM0001CMAI"
+ ],
+ "private_label": true,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.840110+00:00"
+ },
+ "Nobilis": {
+ "n": 176,
+ "aliases": [
+ "NOBILIS"
+ ],
+ "alias_re": "NOBILIS",
+ "prefixes": {
+ "COS": 38,
+ "PBS": 36,
+ "PAN": 24,
+ "GRD": 22,
+ "MAP": 18,
+ "MHP": 18,
+ "QNT": 16
+ },
+ "numeric_share": 0,
+ "common_len": 5,
+ "examples": [
+ "ABA33",
+ "ABS44",
+ "ABS54",
+ "ABS82",
+ "ARC10",
+ "ARC23"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.840961+00:00"
+ },
+ "Phillip Jeffries": {
+ "n": 3456,
+ "aliases": [
+ "PHILLIP JEFFRIES"
+ ],
+ "alias_re": "PHILLIP\\s*JEFFRIES",
+ "prefixes": {
+ "DWJP": 465
+ },
+ "numeric_share": 0.91,
+ "common_len": 4,
+ "examples": [
+ "10000",
+ "10001",
+ "10002",
+ "10003",
+ "10004",
+ "10005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.850492+00:00"
+ },
+ "Zeuxis Parrhasius Europe": {
+ "n": 25,
+ "aliases": [
+ "ZEUXIS PARRHASIUS EUROPE"
+ ],
+ "alias_re": "ZEUXIS\\s*PARRHASIUS\\s*EUROPE",
+ "prefixes": {
+ "ZEU": 25
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "ZEU-34007",
+ "ZEU-34008",
+ "ZEU-34014",
+ "ZEU-34023",
+ "ZEU-34025",
+ "ZEU-34028"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.850620+00:00"
+ },
+ "Quadrille": {
+ "n": 42,
+ "aliases": [
+ "QUADRILLE"
+ ],
+ "alias_re": "QUADRILLE",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 10,
+ "examples": [
+ "303300F-00",
+ "303300F-03",
+ "303300F-05",
+ "303300F-09",
+ "303300F-11",
+ "304250F-24"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.850778+00:00"
+ },
+ "Graduate Collection UK": {
+ "n": 34,
+ "aliases": [
+ "GRADUATE COLLECTION UK"
+ ],
+ "alias_re": "GRADUATE\\s*COLLECTION",
+ "prefixes": {
+ "COPY": 9,
+ "VISITORIAN": 4,
+ "AB": 4,
+ "SAVANNAH": 3,
+ "STAG": 3,
+ "LH": 3
+ },
+ "numeric_share": 0,
+ "common_len": 22,
+ "examples": [
+ "AB1LEOAUB",
+ "AB1LEOBROWN",
+ "COPY-OF-ALL-OVER-LEOPARD-BLUE",
+ "COPY-OF-ALL-OVER-LEOPARD-CHARCOAL",
+ "COPY-OF-DACHSHUND-NATURAL",
+ "COPY-OF-DIPPED-IN-MOONLIGHT-CHARCOAL"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.850941+00:00"
+ },
+ "York Contract": {
+ "n": 137,
+ "aliases": [
+ "YORK CONTRACT"
+ ],
+ "alias_re": "YORK\\s*CONTRACT",
+ "prefixes": {
+ "MRE": 154,
+ "SG": 16,
+ "MCD": 16,
+ "BX": 12
+ },
+ "numeric_share": 0.24,
+ "common_len": 7,
+ "examples": [
+ "19-210",
+ "19-211",
+ "61-J01",
+ "61-J03",
+ "61-J04",
+ "61-J05"
+ ],
+ "private_label": true,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.851515+00:00"
+ },
+ "Fabricut": {
+ "n": 46,
+ "aliases": [
+ "FABRICUT"
+ ],
+ "alias_re": "FABRICUT",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 7,
+ "examples": [
+ "2112503",
+ "2112506",
+ "2112706",
+ "2566001",
+ "2566003",
+ "2566004"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.851666+00:00"
+ },
+ "Marimekko Exclusive": {
+ "n": 36,
+ "aliases": [
+ "MARIMEKKO EXCLUSIVE"
+ ],
+ "alias_re": "MARIMEKKO\\s*EXCLUSIVE",
+ "prefixes": {
+ "DWC": 36
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "DWC-14100X",
+ "DWC-14105X",
+ "DWC-14106X",
+ "DWC-23300X",
+ "DWC-23305X",
+ "DWC-23306X"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.851760+00:00"
+ },
+ "Tres Tintas": {
+ "n": 14,
+ "aliases": [
+ "TRES TINTAS"
+ ],
+ "alias_re": "TRES\\s*TINTAS",
+ "prefixes": {
+ "M": 20
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "JO2703-2",
+ "M2503-1",
+ "M2503-2",
+ "M2506-1",
+ "M2506-2",
+ "M2510-1"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.852381+00:00"
+ },
+ "Fentucci Naturals": {
+ "n": 148,
+ "aliases": [
+ "FENTUCCI NATURALS"
+ ],
+ "alias_re": "FENTUCCI\\s*NATURALS",
+ "prefixes": {
+ "TW": 54,
+ "TSJ": 38,
+ "SG": 28,
+ "MD": 20,
+ "BA": 18,
+ "HBD": 16,
+ "C": 14,
+ "EG": 14
+ },
+ "numeric_share": 0.03,
+ "common_len": 7,
+ "examples": [
+ "20232-27",
+ "20232-30",
+ "20232-31",
+ "6863-44",
+ "6863-52",
+ "BA206"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.853180+00:00"
+ },
+ "Fentucci Wallpaper": {
+ "n": 6,
+ "aliases": [
+ "FENTUCCI WALLPAPER"
+ ],
+ "alias_re": "FENTUCCI\\s*WALLPAPER",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "10113",
+ "10114",
+ "10119",
+ "39935",
+ "39936",
+ "43499"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.853220+00:00"
+ },
+ "Mulberry": {
+ "n": 482,
+ "aliases": [
+ "MULBERRY"
+ ],
+ "alias_re": "MULBERRY",
+ "prefixes": {
+ "FD": 316,
+ "FG": 259
+ },
+ "numeric_share": 0,
+ "common_len": 12,
+ "examples": [
+ "584.A127.0",
+ "ASPENDEVORE_OFFWHI",
+ "BREEZYCHECK_SOFTGO",
+ "CHA.0",
+ "CHALETSHEER_MILK",
+ "FADEDCHEQUERS_BISCUIT"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.855054+00:00"
+ },
+ "York": {
+ "n": 75,
+ "aliases": [
+ "YORK"
+ ],
+ "alias_re": "YORK",
+ "prefixes": {
+ "OG": 12,
+ "MH": 12,
+ "AF": 10,
+ "Y": 8,
+ "CI": 8,
+ "BW": 8,
+ "DM": 8,
+ "DI": 8
+ },
+ "numeric_share": 0.05,
+ "common_len": 6,
+ "examples": [
+ "2823-6247",
+ "2824-6244",
+ "331593",
+ "488-31249",
+ "AC9132",
+ "AF1908"
+ ],
+ "private_label": true,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.855415+00:00"
+ },
+ "Telefina Fine Fabrics": {
+ "n": 64,
+ "aliases": [
+ "TELEFINA FINE FABRICS"
+ ],
+ "alias_re": "TELEFINA\\s*FINE\\s*FABRICS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 7,
+ "examples": [
+ "1001871",
+ "1001872",
+ "1001873",
+ "1001874",
+ "1001875",
+ "1001876"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.855689+00:00"
+ },
+ "Alan Campbell": {
+ "n": 36,
+ "aliases": [
+ "ALAN CAMPBELL"
+ ],
+ "alias_re": "ALAN\\s*CAMPBELL",
+ "prefixes": {
+ "AC": 72
+ },
+ "numeric_share": 0,
+ "common_len": 8,
+ "examples": [
+ "AC122-01",
+ "AC122-02",
+ "AC122-04",
+ "AC122-05",
+ "AC850-00",
+ "AC850-01"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.855857+00:00"
+ },
+ "Holland and Sherry": {
+ "n": 3,
+ "aliases": [
+ "HOLLAND AND SHERRY"
+ ],
+ "alias_re": "HOLLAND\\s*AND\\s*SHERRY",
+ "prefixes": {},
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "DE13458",
+ "DE13465",
+ "WP1038"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.855892+00:00"
+ },
+ "Schumacher": {
+ "n": 2252,
+ "aliases": [
+ "SCHUMACHER"
+ ],
+ "alias_re": "SCHUMACHER",
+ "prefixes": {},
+ "numeric_share": 0.72,
+ "common_len": 7,
+ "examples": [
+ "1450",
+ "1451",
+ "1452",
+ "1453",
+ "1454",
+ "1456"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.866878+00:00"
+ },
+ "Lee Jofa": {
+ "n": 3666,
+ "aliases": [
+ "LEE JOFA"
+ ],
+ "alias_re": "LEE\\s*JOFA",
+ "prefixes": {
+ "GWF": 774,
+ "P": 410,
+ "BFC": 391,
+ "TL": 302,
+ "GWP": 213
+ },
+ "numeric_share": 0.53,
+ "common_len": 13,
+ "examples": [
+ "2000162.23.0",
+ "2000163.23.0",
+ "2001150_1",
+ "2001154_12",
+ "2001180_4",
+ "2001199_3"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.880609+00:00"
+ },
+ "Thibaut": {
+ "n": 3742,
+ "aliases": [
+ "THIBAUT"
+ ],
+ "alias_re": "THIBAUT",
+ "prefixes": {
+ "T": 6279,
+ "AT": 417
+ },
+ "numeric_share": 0.01,
+ "common_len": 6,
+ "examples": [
+ "9010",
+ "9012",
+ "9020",
+ "9022",
+ "9055",
+ "9070"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.898246+00:00"
+ },
+ "Caroline Cecil Textiles": {
+ "n": 3,
+ "aliases": [
+ "CAROLINE CECIL TEXTILES"
+ ],
+ "alias_re": "CAROLINE\\s*CECIL\\s*TEXTILES",
+ "prefixes": {
+ "CCP": 6
+ },
+ "numeric_share": 0,
+ "common_len": 13,
+ "examples": [
+ "CCP-2346.16.0",
+ "CCP-2347.16.0",
+ "CCP-2348.11.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.898375+00:00"
+ },
+ "Madagascar Walls": {
+ "n": 16,
+ "aliases": [
+ "MADAGASCAR WALLS"
+ ],
+ "alias_re": "MADAGASCAR\\s*WALLS",
+ "prefixes": {
+ "FD": 7
+ },
+ "numeric_share": 0.5,
+ "common_len": 5,
+ "examples": [
+ "14011",
+ "73091",
+ "73093",
+ "73095",
+ "73100",
+ "73101"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.898557+00:00"
+ },
+ "British Walls": {
+ "n": 495,
+ "aliases": [
+ "BRITISH WALLS"
+ ],
+ "alias_re": "BRITISH\\s*WALLS",
+ "prefixes": {
+ "ALA": 61,
+ "SAINT": 40,
+ "PLACE": 33,
+ "NAKURA": 31
+ },
+ "numeric_share": 0,
+ "common_len": 39,
+ "examples": [
+ "42841",
+ "ALA-FERRARA-WALLPAPER-ELE-42837",
+ "ALA-FERRARA-WALLPAPER-ELE-42838",
+ "ALA-FERRARA-WALLPAPER-ELE-42839",
+ "ALA-FERRARA-WALLPAPER-ELE-42840",
+ "ALA-MESSINA-WALLPAPER-ELE-42805"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.901170+00:00"
+ },
+ "Hygge & West": {
+ "n": 11,
+ "aliases": [
+ "HYGGE & WEST"
+ ],
+ "alias_re": "HYGGE\\s*WEST",
+ "prefixes": {
+ "BACK": 4,
+ "JAWS": 3
+ },
+ "numeric_share": 0,
+ "common_len": 44,
+ "examples": [
+ "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-BLACK",
+ "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-DENIM",
+ "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-RED",
+ "BACK-TO-THE-FUTURE-HILL-VALLEY-WALLPAPER-SKY",
+ "COPY-OF-JAWS-AMITY-WALLPAPER-INDIGO",
+ "ET-BE-GOOD-WALLPAPER-DUSK"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.901245+00:00"
+ },
+ "Zeuxis Parrhasius at DW": {
+ "n": 5,
+ "aliases": [
+ "ZEUXIS PARRHASIUS AT DW"
+ ],
+ "alias_re": "ZEUXIS\\s*PARRHASIUS",
+ "prefixes": {
+ "ZEU": 5
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "ZEU-34036",
+ "ZEU-34051",
+ "ZEU-34094",
+ "ZEU-34095",
+ "ZEU-34104"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.901270+00:00"
+ },
+ "Fentucci Naturals Walls": {
+ "n": 38,
+ "aliases": [
+ "FENTUCCI NATURALS WALLS"
+ ],
+ "alias_re": "FENTUCCI\\s*NATURALS\\s*WALLS",
+ "prefixes": {
+ "LX": 38
+ },
+ "numeric_share": 0,
+ "common_len": 6,
+ "examples": [
+ "LX1090",
+ "LX1091",
+ "LX1092",
+ "LX1093",
+ "LX1094",
+ "LX1095"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.901370+00:00"
+ },
+ "Ralph Lauren Fabric": {
+ "n": 218,
+ "aliases": [
+ "RALPH LAUREN FABRIC"
+ ],
+ "alias_re": "RALPH\\s*LAUREN\\s*FABRIC",
+ "prefixes": {
+ "RLDF": 415
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "LCF65064F",
+ "LCF65282F",
+ "LCF65812F",
+ "LCF65893F",
+ "LCF67346F",
+ "LCF67409F"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.902529+00:00"
+ },
+ "SUGARBOO": {
+ "n": 10,
+ "aliases": [
+ "SUGARBOO"
+ ],
+ "alias_re": "SUGARBOO",
+ "prefixes": {
+ "WP": 10
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "WP20270",
+ "WP20271",
+ "WP20272",
+ "WP20273",
+ "WP20274",
+ "WP20275"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.902582+00:00"
+ },
+ "PS Removable Wallpaper": {
+ "n": 737,
+ "aliases": [
+ "PS REMOVABLE WALLPAPER"
+ ],
+ "alias_re": "REMOVABLE\\s*WALLPAPER",
+ "prefixes": {
+ "NW": 515,
+ "LN": 79,
+ "SG": 77,
+ "HG": 47
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "AX10800",
+ "AX10900",
+ "AX10902",
+ "DB20100",
+ "DB20101",
+ "DB20102"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.904952+00:00"
+ },
+ "Traditional Whimsy": {
+ "n": 105,
+ "aliases": [
+ "TRADITIONAL WHIMSY"
+ ],
+ "alias_re": "TRADITIONAL\\s*WHIMSY",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "11360APUG'SLIFEMULTI",
+ "12380FLAMINGOLAKEDUCKEGGPINK",
+ "12381FLAMINGOLAKEGREYCORAL",
+ "12382FLAMINGOLAKEMIDNIGHTBLUE",
+ "37259",
+ "37260"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.905510+00:00"
+ },
+ "PR Faux Leather": {
+ "n": 188,
+ "aliases": [
+ "PR FAUX LEATHER"
+ ],
+ "alias_re": "FAUX\\s*LEATHER",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "40194",
+ "40195",
+ "40196",
+ "40197",
+ "40198",
+ "40199"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.906639+00:00"
+ },
+ "Osborne & Little Fabrics": {
+ "n": 1101,
+ "aliases": [
+ "OSBORNE & LITTLE FABRICS"
+ ],
+ "alias_re": "OSBORNE\\s*LITTLE\\s*FABRICS",
+ "prefixes": {
+ "OSB": 1101
+ },
+ "numeric_share": 0,
+ "common_len": 12,
+ "examples": [
+ "OSB-F6137",
+ "OSB-F6150-02",
+ "OSB-F6244-0146",
+ "OSB-F6681-10",
+ "OSB-F6681-11",
+ "OSB-F6681-12"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.909250+00:00"
+ },
+ "Luxury Murals": {
+ "n": 56,
+ "aliases": [
+ "LUXURY MURALS"
+ ],
+ "alias_re": "LUXURY\\s*MURALS",
+ "prefixes": {
+ "MUR": 56
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "MUR-200299",
+ "MUR-200399",
+ "MUR-200499",
+ "MUR-200599",
+ "MUR-200699",
+ "MUR-200799"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.909415+00:00"
+ },
+ "Marburg": {
+ "n": 119,
+ "aliases": [
+ "MARBURG"
+ ],
+ "alias_re": "MARBURG",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "32002",
+ "32003",
+ "32044",
+ "33701",
+ "33702",
+ "33703"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.909784+00:00"
+ },
+ "Malibu": {
+ "n": 3,
+ "aliases": [
+ "MALIBU"
+ ],
+ "alias_re": "MALIBU",
+ "prefixes": {},
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "CN31304-2",
+ "DA61204",
+ "JB20204"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.909802+00:00"
+ },
+ "Artmura": {
+ "n": 161,
+ "aliases": [
+ "ARTMURA"
+ ],
+ "alias_re": "ARTMURA",
+ "prefixes": {
+ "DWXW": 161
+ },
+ "numeric_share": 0,
+ "common_len": 12,
+ "examples": [
+ "DWXW-1005370",
+ "DWXW-1005371",
+ "DWXW-1005372",
+ "DWXW-1005373",
+ "DWXW-1005374",
+ "DWXW-1005375"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.910190+00:00"
+ },
+ "Hollywood Acoustical": {
+ "n": 50,
+ "aliases": [
+ "HOLLYWOOD ACOUSTICAL"
+ ],
+ "alias_re": "HOLLYWOOD\\s*ACOUSTICAL",
+ "prefixes": {
+ "XPV": 23,
+ "XKL": 9,
+ "XJZ": 8,
+ "XKU": 5,
+ "ACT": 4
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "ACT-73255",
+ "ACT-73256",
+ "ACT-73260",
+ "ACT-73261",
+ "XJZ-47385",
+ "XJZ-47386"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.910316+00:00"
+ },
+ "Arte International": {
+ "n": 530,
+ "aliases": [
+ "ARTE INTERNATIONAL"
+ ],
+ "alias_re": "ARTE\\s*INTERNATIONAL",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "11530",
+ "11531",
+ "15711",
+ "15712",
+ "18300",
+ "18301"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.912319+00:00"
+ },
+ "Glass Beaded": {
+ "n": 34,
+ "aliases": [
+ "GLASS BEADED"
+ ],
+ "alias_re": "GLASS\\s*BEADED",
+ "prefixes": {
+ "L": 5,
+ "J": 3
+ },
+ "numeric_share": 0.81,
+ "common_len": 5,
+ "examples": [
+ "16500",
+ "16501",
+ "16502",
+ "16503",
+ "16504",
+ "16505"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.912539+00:00"
+ },
+ "Nina Campbell Wallcoverings": {
+ "n": 111,
+ "aliases": [
+ "NINA CAMPBELL WALLCOVERINGS"
+ ],
+ "alias_re": "NINA\\s*CAMPBELL\\s*WALLCOVERINGS",
+ "prefixes": {
+ "DWC": 111
+ },
+ "numeric_share": 0,
+ "common_len": 14,
+ "examples": [
+ "DWC-NCF4280-02",
+ "DWC-NCF4280-03",
+ "DWC-NCF4280-04",
+ "DWC-NCF4280-05",
+ "DWC-NCF4280-06",
+ "DWC-NCF4281-01"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.912819+00:00"
+ },
+ "Bespoke": {
+ "n": 631,
+ "aliases": [
+ "BESPOKE"
+ ],
+ "alias_re": "BESPOKE",
+ "prefixes": {
+ "DIG": 1142
+ },
+ "numeric_share": 0,
+ "common_len": 16,
+ "examples": [
+ "BOOK-3001",
+ "BOOK-3002",
+ "CUSTOM-001",
+ "CUSTOM-002",
+ "CUSTOM-003",
+ "CUSTOMDIGITALFABRIC-SAMPLE"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.915899+00:00"
+ },
+ "Scalamandre": {
+ "n": 244,
+ "aliases": [
+ "SCALAMANDRE"
+ ],
+ "alias_re": "SCALAMANDRE",
+ "prefixes": {
+ "CH": 172,
+ "H": 164,
+ "A": 84,
+ "B": 22
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "90001",
+ "A91968-003",
+ "A91969-003",
+ "A91971-003",
+ "A91972-003",
+ "A91973-003"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.918114+00:00"
+ },
+ "Florence Broadhurst": {
+ "n": 25,
+ "aliases": [
+ "FLORENCE BROADHURST"
+ ],
+ "alias_re": "FLORENCE\\s*BROADHURST",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "28031",
+ "28032",
+ "28033",
+ "28034",
+ "28035",
+ "28036"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.918233+00:00"
+ },
+ "Grasscloth": {
+ "n": 5,
+ "aliases": [
+ "GRASSCLOTH"
+ ],
+ "alias_re": "GRASSCLOTH",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 14,
+ "examples": [
+ "303815G-04GRAS",
+ "303815G-05GRAS",
+ "303815G-06GRAS",
+ "303815G-10GRAS",
+ "303815G-15GRAS"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.918260+00:00"
+ },
+ "Suncloth": {
+ "n": 36,
+ "aliases": [
+ "SUNCLOTH"
+ ],
+ "alias_re": "SUNCLOTH",
+ "prefixes": {
+ "AC": 72
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "AC302-13SUN",
+ "AC302-15SUN",
+ "AC302-16SUN",
+ "AC302-16WSUN",
+ "AC302-17WSUN",
+ "AC302-32WSUN"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.918431+00:00"
+ },
+ "NLXL": {
+ "n": 9,
+ "aliases": [
+ "NLXL"
+ ],
+ "alias_re": "NLXL",
+ "prefixes": {
+ "MRV": 6
+ },
+ "numeric_share": 0.67,
+ "common_len": 7,
+ "examples": [
+ "1001705",
+ "1001706",
+ "1001707",
+ "1001712",
+ "1001739",
+ "1001830"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.918485+00:00"
+ },
+ "Carlisle & Co. Walls": {
+ "n": 442,
+ "aliases": [
+ "CARLISLE & CO. WALLS"
+ ],
+ "alias_re": "CARLISLE\\s*WALLS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 6,
+ "examples": [
+ "805001",
+ "805002",
+ "805003",
+ "805004",
+ "805005",
+ "805006"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.919876+00:00"
+ },
+ "Zinc Textile": {
+ "n": 3,
+ "aliases": [
+ "ZINC TEXTILE"
+ ],
+ "alias_re": "ZINC\\s*TEXTILE",
+ "prefixes": {
+ "W": 3
+ },
+ "numeric_share": 0,
+ "common_len": 4,
+ "examples": [
+ "W144",
+ "W146",
+ "ZW135"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.919906+00:00"
+ },
+ "Charles Burger": {
+ "n": 36,
+ "aliases": [
+ "CHARLES BURGER"
+ ],
+ "alias_re": "CHARLES\\s*BURGER",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 7,
+ "examples": [
+ "1208-001",
+ "1208-009",
+ "1208-011",
+ "1208-013",
+ "1238",
+ "1716-01"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.920032+00:00"
+ },
+ "Natural Paint": {
+ "n": 26,
+ "aliases": [
+ "NATURAL PAINT"
+ ],
+ "alias_re": "NATURAL\\s*PAINT",
+ "prefixes": {
+ "NCR": 26
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "NCR-100",
+ "NCR-102",
+ "NCR-1025",
+ "NCR-104",
+ "NCR-105",
+ "NCR-106"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.920107+00:00"
+ },
+ "Retro Walls": {
+ "n": 938,
+ "aliases": [
+ "RETRO WALLS"
+ ],
+ "alias_re": "RETRO\\s*WALLS",
+ "prefixes": {
+ "TRUE": 945
+ },
+ "numeric_share": 0.5,
+ "common_len": 4,
+ "examples": [
+ "106393",
+ "30331",
+ "332201",
+ "332208",
+ "332209",
+ "332214"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.925820+00:00"
+ },
+ "Mid Century Modern": {
+ "n": 6,
+ "aliases": [
+ "MID CENTURY MODERN"
+ ],
+ "alias_re": "MID\\s*CENTURY\\s*MODERN",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 6,
+ "examples": [
+ "820001",
+ "820002",
+ "820003",
+ "820004",
+ "820006",
+ "820007"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.925992+00:00"
+ },
+ "Clarke And Clarke": {
+ "n": 846,
+ "aliases": [
+ "CLARKE AND CLARKE"
+ ],
+ "alias_re": "CLARKE\\s*AND\\s*CLARKE",
+ "prefixes": {
+ "F": 3542,
+ "W": 382
+ },
+ "numeric_share": 0.5,
+ "common_len": 5,
+ "examples": [
+ "01.CAC.0",
+ "02.CAC.0",
+ "03.CAC.0",
+ "04.CAC.0",
+ "05.CAC.0",
+ "06.CAC.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.944667+00:00"
+ },
+ "Steve Abrams Studios": {
+ "n": 509,
+ "aliases": [
+ "STEVE ABRAMS STUDIOS"
+ ],
+ "alias_re": "STEVE\\s*ABRAMS\\s*STUDIOS",
+ "prefixes": {
+ "ARTWORKID": 468
+ },
+ "numeric_share": 0.44,
+ "common_len": 7,
+ "examples": [
+ "11920433516380454476",
+ "13282691209491780458",
+ "14043440517780191149",
+ "16345310375004124922",
+ "17720673451185294920",
+ "21058139638669983550"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.948009+00:00"
+ },
+ "Nina Campbell": {
+ "n": 554,
+ "aliases": [
+ "NINA CAMPBELL"
+ ],
+ "alias_re": "NINA\\s*CAMPBELL",
+ "prefixes": {
+ "NCW": 865,
+ "NCF": 268
+ },
+ "numeric_share": 0.15,
+ "common_len": 10,
+ "examples": [
+ "1001322",
+ "1001323",
+ "1001324",
+ "1001325",
+ "1001326",
+ "1001327"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.951529+00:00"
+ },
+ "Peel and Stick": {
+ "n": 92,
+ "aliases": [
+ "PEEL AND STICK"
+ ],
+ "alias_re": "PEEL\\s*AND\\s*STICK",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "83500",
+ "83501",
+ "83502",
+ "83503",
+ "83504",
+ "83505"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.951951+00:00"
+ },
+ "Andrew Martin": {
+ "n": 7,
+ "aliases": [
+ "ANDREW MARTIN"
+ ],
+ "alias_re": "ANDREW\\s*MARTIN",
+ "prefixes": {
+ "AM": 4
+ },
+ "numeric_share": 0.15,
+ "common_len": 5,
+ "examples": [
+ "10055",
+ "AM100329.13.0",
+ "AM100444.15.0",
+ "AMW10001.1611.0",
+ "GOING-TO-THE-LIBRARY-COCOA-AMA",
+ "KKMYLA"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.952000+00:00"
+ },
+ "Armani Casa": {
+ "n": 3,
+ "aliases": [
+ "ARMANI CASA"
+ ],
+ "alias_re": "ARMANI\\s*CASA",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "93322",
+ "9612_CAPRI_ANTRACITE_LQ_2",
+ "9613_CAPRI_ORO-LIME-NERO_LQ"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.952229+00:00"
+ },
+ "Trikes-DL Couch-Eykon-Tower": {
+ "n": 807,
+ "aliases": [
+ "TRIKES-DL COUCH-EYKON-TOWER"
+ ],
+ "alias_re": "TRIKES\\s*COUCH\\s*EYKON\\s*TOWER",
+ "prefixes": {
+ "XTW": 807
+ },
+ "numeric_share": 0,
+ "common_len": 19,
+ "examples": [
+ "XTW-989020-T2-AL-01-1",
+ "XTW-989023-T2-AL-02",
+ "XTW-989024-T2-AL-03",
+ "XTW-989025-T2-AL-04",
+ "XTW-989026-T2-AL-05",
+ "XTW-989027-T2-AL-06"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.954232+00:00"
+ },
+ "Anna French": {
+ "n": 714,
+ "aliases": [
+ "ANNA FRENCH"
+ ],
+ "alias_re": "ANNA\\s*FRENCH",
+ "prefixes": {
+ "AT": 1236,
+ "AF": 197
+ },
+ "numeric_share": 0.09,
+ "common_len": 7,
+ "examples": [
+ "73500",
+ "73501",
+ "73502",
+ "73503",
+ "73504",
+ "73505"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.958568+00:00"
+ },
+ "Glambeads by DW": {
+ "n": 11,
+ "aliases": [
+ "GLAMBEADS BY DW"
+ ],
+ "alias_re": "GLAMBEADS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "20001",
+ "20002",
+ "20003",
+ "20004",
+ "20005",
+ "20006"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.958696+00:00"
+ },
+ "Novasuede": {
+ "n": 169,
+ "aliases": [
+ "NOVASUEDE"
+ ],
+ "alias_re": "NOVASUEDE",
+ "prefixes": {
+ "NOVASUEDE": 262
+ },
+ "numeric_share": 0,
+ "common_len": 16,
+ "examples": [
+ "AMBER(T3Q8W)",
+ "BLANKSLATE(T3L0W)",
+ "BLISS(T3Q7W)",
+ "BLUSHROSE(T3RFW)",
+ "CEMENT(T3LAW)",
+ "COLONIALBLUE(T3C9W)"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.960355+00:00"
+ },
+ "Jeffrey Stevens": {
+ "n": 4246,
+ "aliases": [
+ "JEFFREY STEVENS"
+ ],
+ "alias_re": "JEFFREY\\s*STEVENS",
+ "prefixes": {
+ "DWJS": 3889
+ },
+ "numeric_share": 0.19,
+ "common_len": 10,
+ "examples": [
+ "015398",
+ "148-32817",
+ "148-32818",
+ "148-32832",
+ "148-96292",
+ "148-96293"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.978909+00:00"
+ },
+ "Malibu Walls": {
+ "n": 115,
+ "aliases": [
+ "MALIBU WALLS"
+ ],
+ "alias_re": "MALIBU\\s*WALLS",
+ "prefixes": {},
+ "numeric_share": 0.97,
+ "common_len": 5,
+ "examples": [
+ "172A7EA62D678328BA2EFF9ECBF5D3A3",
+ "19119",
+ "19139",
+ "19159",
+ "19169",
+ "19179"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.979526+00:00"
+ },
+ "Paul Montgomery": {
+ "n": 80,
+ "aliases": [
+ "PAUL MONTGOMERY"
+ ],
+ "alias_re": "PAUL\\s*MONTGOMERY",
+ "prefixes": {
+ "DA": 47,
+ "OT": 17,
+ "MO": 9,
+ "NT": 4
+ },
+ "numeric_share": 0,
+ "common_len": 45,
+ "examples": [
+ "DA-AD1-BBANTIQUEDAMASK1ONSILVERSISALBLUEBEIGE",
+ "DA-AD1-BEANTIQUEDAMASK1ONSILVERSISALBLUEWHITE",
+ "DA-AD1-BGANTIQUEDAMASK1ONSILVERSISALBLUEGOLD",
+ "DA-AD1-BNANTIQUEDAMASK1ONSILVERSISALBLUEBROWN",
+ "DA-AD1-BRANTIQUEDAMASK1ONSILVERSISALBROWNGOLD",
+ "DA-AD1-BTANTIQUEDAMASK1ONSILVERSISALBLUETAUPE"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.979925+00:00"
+ },
+ "Osborne & Little": {
+ "n": 1016,
+ "aliases": [
+ "OSBORNE & LITTLE"
+ ],
+ "alias_re": "OSBORNE\\s*LITTLE",
+ "prefixes": {
+ "W": 972
+ },
+ "numeric_share": 0,
+ "common_len": 8,
+ "examples": [
+ "-02--METALLICSILVER",
+ "-03--",
+ "-04--METALLICGOLD",
+ "CRANESCREAMWALLPAPER",
+ "CW5410-08-QUARTZ-",
+ "CW5410-09-QUARTZ-"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.983211+00:00"
+ },
+ "Contrado": {
+ "n": 17,
+ "aliases": [
+ "CONTRADO"
+ ],
+ "alias_re": "CONTRADO",
+ "prefixes": {
+ "MENS": 8,
+ "LOAFER": 4,
+ "WOMENS": 4,
+ "KIKA": 4
+ },
+ "numeric_share": 0,
+ "common_len": 20,
+ "examples": [
+ "BEANIE",
+ "FLARED-SKIRT-3",
+ "HOLDALLS",
+ "KIKA-TOTE-4",
+ "KIKA-TOTE-5",
+ "LOAFER-ESPADRILLES-3"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.983644+00:00"
+ },
+ "AS Creation": {
+ "n": 449,
+ "aliases": [
+ "AS CREATION"
+ ],
+ "alias_re": "CREATION",
+ "prefixes": {
+ "AS": 770,
+ "DD": 223
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "AS143211-0",
+ "AS169020-0",
+ "AS184818-0",
+ "AS224064-0",
+ "AS251718-0",
+ "AS272355-0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:29.985860+00:00"
+ },
+ "Scalamandre Fabrics": {
+ "n": 8040,
+ "aliases": [
+ "SCALAMANDRE FABRICS"
+ ],
+ "alias_re": "SCALAMANDRE\\s*FABRICS",
+ "prefixes": {
+ "H": 4732,
+ "CH": 3733,
+ "A": 1592,
+ "B": 1546
+ },
+ "numeric_share": 0.01,
+ "common_len": 10,
+ "examples": [
+ "1098MM-001",
+ "1098MM-002",
+ "1098MM-004",
+ "1098MM-005",
+ "1098MM-006",
+ "1098MM-013",
+ "CH27148"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 1,
+ "updated_at": "2026-06-26T06:02:15.339Z"
+ },
+ "Armani/Casa": {
+ "n": 9,
+ "aliases": [
+ "ARMANI/CASA"
+ ],
+ "alias_re": "ARMANI\\s*CASA",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 4,
+ "examples": [
+ "9320",
+ "9322",
+ "9370",
+ "9371",
+ "9372",
+ "9373"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.021994+00:00"
+ },
+ "Plains": {
+ "n": 36,
+ "aliases": [
+ "PLAINS"
+ ],
+ "alias_re": "PLAINS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 7,
+ "examples": [
+ "009868T",
+ "009870T",
+ "009874T",
+ "009876T",
+ "009877T",
+ "010450T"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.022126+00:00"
+ },
+ "Vahallan": {
+ "n": 4,
+ "aliases": [
+ "VAHALLAN"
+ ],
+ "alias_re": "VAHALLAN",
+ "prefixes": {
+ "UNEARTHED": 3
+ },
+ "numeric_share": 0,
+ "common_len": 40,
+ "examples": [
+ "RHYTHM-FLUENT-WALLCOVERING-VAHALLAN",
+ "UNEARTHED-ROANOKE-WALLCOVERING-VAHALLAN",
+ "UNEARTHED-SALUDA-WALLCOVERING-VAHALLAN",
+ "UNEARTHED-WOODBURN-WALLCOVERING-VAHALLAN"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.022150+00:00"
+ },
+ "Wallpaper NYC": {
+ "n": 87,
+ "aliases": [
+ "WALLPAPER NYC"
+ ],
+ "alias_re": "WALLPAPER\\s*NYC",
+ "prefixes": {
+ "AT": 12
+ },
+ "numeric_share": 0.92,
+ "common_len": 5,
+ "examples": [
+ "56833",
+ "56834",
+ "56835",
+ "56836",
+ "56837",
+ "56838"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.022502+00:00"
+ },
+ "Daisy Bennett": {
+ "n": 70,
+ "aliases": [
+ "DAISY BENNETT"
+ ],
+ "alias_re": "DAISY\\s*BENNETT",
+ "prefixes": {
+ "DB": 19
+ },
+ "numeric_share": 0.83,
+ "common_len": 7,
+ "examples": [
+ "1001225",
+ "1001226",
+ "1001228",
+ "1001233",
+ "1001234",
+ "1001235"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.022820+00:00"
+ },
+ "Sandberg": {
+ "n": 980,
+ "aliases": [
+ "SANDBERG"
+ ],
+ "alias_re": "SANDBERG",
+ "prefixes": {
+ "P": 598,
+ "S": 150
+ },
+ "numeric_share": 0.41,
+ "common_len": 6,
+ "examples": [
+ "101-13",
+ "101-16",
+ "101-18",
+ "101-21",
+ "102-11",
+ "102-21"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.026931+00:00"
+ },
+ "DW Home": {
+ "n": 52,
+ "aliases": [
+ "DW HOME"
+ ],
+ "alias_re": "HOME",
+ "prefixes": {
+ "TRUE": 40
+ },
+ "numeric_share": 0.6,
+ "common_len": 5,
+ "examples": [
+ "49100",
+ "49102",
+ "49115",
+ "50201",
+ "50208",
+ "50209"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.027298+00:00"
+ },
+ "Versa Designed Surfaces": {
+ "n": 873,
+ "aliases": [
+ "VERSA DESIGNED SURFACES"
+ ],
+ "alias_re": "VERSA\\s*DESIGNED\\s*SURFACES",
+ "prefixes": {
+ "A": 913
+ },
+ "numeric_share": 0,
+ "common_len": 8,
+ "examples": [
+ "A119-038",
+ "A119-136",
+ "A119-198",
+ "A119-200",
+ "A119-231",
+ "A119-231-258"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.029381+00:00"
+ },
+ "Showroom Line": {
+ "n": 42,
+ "aliases": [
+ "SHOWROOM LINE"
+ ],
+ "alias_re": "SHOWROOM\\s*LINE",
+ "prefixes": {
+ "DWP": 7,
+ "DURALEE": 6,
+ "PIERREFREY": 6
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "CARLTONV",
+ "CAROLEFABRICS",
+ "DURALEE-1",
+ "DURALEE-2",
+ "DURALEE-3",
+ "DURALEE-4"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.029534+00:00"
+ },
+ "Lincrusta": {
+ "n": 49,
+ "aliases": [
+ "LINCRUSTA"
+ ],
+ "alias_re": "LINCRUSTA",
+ "prefixes": {
+ "RD": 161,
+ "WM": 12,
+ "RDPRM": 8
+ },
+ "numeric_share": 0,
+ "common_len": 8,
+ "examples": [
+ "RD1583FR",
+ "RD1639FR",
+ "RD1640FR",
+ "RD1650FR",
+ "RD1805FR",
+ "RD1827FR"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.030057+00:00"
+ },
+ "Apartment Wallpaper": {
+ "n": 7,
+ "aliases": [
+ "APARTMENT WALLPAPER"
+ ],
+ "alias_re": "APARTMENT\\s*WALLPAPER",
+ "prefixes": {
+ "PSW": 14
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "PSW1052RL",
+ "PSW1053RL",
+ "PSW1054RL",
+ "PSW1055RL",
+ "PSW1083RL",
+ "PSW1109RL"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.030195+00:00"
+ },
+ "Villa Nova": {
+ "n": 3,
+ "aliases": [
+ "VILLA NOVA"
+ ],
+ "alias_re": "VILLA\\s*NOVA",
+ "prefixes": {
+ "W": 5
+ },
+ "numeric_share": 0,
+ "common_len": 4,
+ "examples": [
+ "W517",
+ "W538",
+ "W635"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.030217+00:00"
+ },
+ "Graham & Brown": {
+ "n": 1607,
+ "aliases": [
+ "GRAHAM & BROWN"
+ ],
+ "alias_re": "GRAHAM\\s*BROWN",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 6,
+ "examples": [
+ "101448",
+ "102145",
+ "102146",
+ "102147",
+ "102148",
+ "102149"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.036179+00:00"
+ },
+ "Zoffany": {
+ "n": 327,
+ "aliases": [
+ "ZOFFANY"
+ ],
+ "alias_re": "ZOFFANY",
+ "prefixes": {
+ "ZOW": 302
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "313114",
+ "ZFOW312941",
+ "ZFOW312943",
+ "ZGUV08004",
+ "ZHIW312994",
+ "ZHIW312995"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.037413+00:00"
+ },
+ "Paul Montgomery Art Prints": {
+ "n": 397,
+ "aliases": [
+ "PAUL MONTGOMERY ART PRINTS"
+ ],
+ "alias_re": "PAUL\\s*MONTGOMERY\\s*ART\\s*PRINTS",
+ "prefixes": {
+ "DWART": 222,
+ "DWPM": 175
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "DWART-6000",
+ "DWART-6001",
+ "DWART-6002",
+ "DWART-6003",
+ "DWART-6004",
+ "DWART-6005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.038356+00:00"
+ },
+ "Martyn Lawrence Bullard": {
+ "n": 77,
+ "aliases": [
+ "MARTYN LAWRENCE BULLARD"
+ ],
+ "alias_re": "MARTYN\\s*LAWRENCE\\s*BULLARD",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 6,
+ "examples": [
+ "210000",
+ "210001",
+ "210002",
+ "210003",
+ "210004",
+ "210005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.038690+00:00"
+ },
+ "Phillipe Romano": {
+ "n": 14140,
+ "aliases": [
+ "PHILLIPE ROMANO"
+ ],
+ "alias_re": "PHILLIPE\\s*ROMANO",
+ "prefixes": {
+ "PI": 1703,
+ "XXP": 1565,
+ "XTY": 1486,
+ "LXPR": 1246,
+ "PRN": 1170,
+ "PRW": 1161
+ },
+ "numeric_share": 0.2,
+ "common_len": 9,
+ "examples": [
+ "*LCK*",
+ "-BEC51530.00",
+ "-BEC51538.00",
+ "-BEC51544.00",
+ "-MAD20052.00",
+ "01.CAC.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.099450+00:00"
+ },
+ "LA Walls": {
+ "n": 1246,
+ "aliases": [
+ "LA WALLS"
+ ],
+ "alias_re": "WALLS",
+ "prefixes": {
+ "SRC": 130,
+ "CHR": 87,
+ "MAN": 76,
+ "HAS": 76,
+ "VIR": 65
+ },
+ "numeric_share": 0.65,
+ "common_len": 5,
+ "examples": [
+ "23000",
+ "23001",
+ "23002",
+ "23003",
+ "23004",
+ "23005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.103206+00:00"
+ },
+ "Emiliana Parati": {
+ "n": 15,
+ "aliases": [
+ "EMILIANA PARATI"
+ ],
+ "alias_re": "EMILIANA\\s*PARATI",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "86001",
+ "86006",
+ "86014",
+ "86031",
+ "86062",
+ "86065"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.103287+00:00"
+ },
+ "Home Couture": {
+ "n": 36,
+ "aliases": [
+ "HOME COUTURE"
+ ],
+ "alias_re": "HOME\\s*COUTURE",
+ "prefixes": {
+ "HC": 72
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "HC1280L-05TAJ",
+ "HC1280L-07TAJ",
+ "HC1280L-09TAJ",
+ "HC1280T-01",
+ "HC1280T-03",
+ "HC1280T-04"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.103468+00:00"
+ },
+ "Glitter Walls": {
+ "n": 49,
+ "aliases": [
+ "GLITTER WALLS"
+ ],
+ "alias_re": "GLITTER\\s*WALLS",
+ "prefixes": {
+ "ASTEK": 6
+ },
+ "numeric_share": 0.92,
+ "common_len": 5,
+ "examples": [
+ "51300",
+ "51301",
+ "51302",
+ "51304",
+ "51306",
+ "51307"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.104196+00:00"
+ },
+ "Architectural Wallcoverings": {
+ "n": 9,
+ "aliases": [
+ "ARCHITECTURAL WALLCOVERINGS"
+ ],
+ "alias_re": "ARCHITECTURAL\\s*WALLCOVERINGS",
+ "prefixes": {
+ "JD": 5,
+ "PNT": 4
+ },
+ "numeric_share": 0,
+ "common_len": 6,
+ "examples": [
+ "JD-AURA",
+ "JD-BAHARA-CAMACHA",
+ "JD-BAHARA-HAVILAND",
+ "JD-BAHARA-MARTINA",
+ "JD-BALBOA",
+ "PNT-01"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.104244+00:00"
+ },
+ "Malibu Wallpaper": {
+ "n": 2107,
+ "aliases": [
+ "MALIBU WALLPAPER"
+ ],
+ "alias_re": "MALIBU\\s*WALLPAPER",
+ "prefixes": {
+ "LN": 510,
+ "TS": 256,
+ "LW": 202,
+ "BV": 192,
+ "RY": 179,
+ "TG": 164
+ },
+ "numeric_share": 0.1,
+ "common_len": 7,
+ "examples": [
+ "0075853_CAF-27-TWILIGHT_400",
+ "0075855_CAF-27-CRYSTAL_400",
+ "0075857_CAF-27-AQUA_400",
+ "0075859_CAF-27-WICKER_400",
+ "0075861_CAF-27-OYSTER_400",
+ "0075866_CAF-27-VIRIDIAN_400"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.115988+00:00"
+ },
+ "Koroseal": {
+ "n": 2516,
+ "aliases": [
+ "KOROSEAL"
+ ],
+ "alias_re": "KOROSEAL",
+ "prefixes": {
+ "SG": 517,
+ "SRD": 224
+ },
+ "numeric_share": 0.28,
+ "common_len": 7,
+ "examples": [
+ "0204D096",
+ "0204D097",
+ "0204D098",
+ "0204D099",
+ "0204D100",
+ "0204D101"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.127948+00:00"
+ },
+ "Sancar": {
+ "n": 42,
+ "aliases": [
+ "SANCAR"
+ ],
+ "alias_re": "SANCAR",
+ "prefixes": {
+ "BM": 82
+ },
+ "numeric_share": 0.01,
+ "common_len": 7,
+ "examples": [
+ "32001",
+ "BM29001",
+ "BM29003",
+ "BM29004",
+ "BM29005",
+ "BM29006"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.128238+00:00"
+ },
+ "Fentucci Murals": {
+ "n": 87,
+ "aliases": [
+ "FENTUCCI MURALS"
+ ],
+ "alias_re": "FENTUCCI\\s*MURALS",
+ "prefixes": {
+ "DIG": 87
+ },
+ "numeric_share": 0,
+ "common_len": 23,
+ "examples": [
+ "DIG-269685-PAPER",
+ "DIG-269685-SAMPLE-PAPER",
+ "DIG-269685-SAMPLE-VINYL",
+ "DIG-269685-VINYL",
+ "DIG-269686-PAPER",
+ "DIG-269686-SAMPLE-PAPER"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.128559+00:00"
+ },
+ "LEED Walls": {
+ "n": 174,
+ "aliases": [
+ "LEED WALLS"
+ ],
+ "alias_re": "LEED\\s*WALLS",
+ "prefixes": {
+ "LLN": 20,
+ "LSL": 15,
+ "REVERE": 14,
+ "BEXHILL": 13,
+ "BRILLIANCE": 10,
+ "SPICE": 10,
+ "LANCASTER": 10,
+ "FACET": 10
+ },
+ "numeric_share": 0.1,
+ "common_len": 14,
+ "examples": [
+ "47277",
+ "47278",
+ "47279",
+ "49115",
+ "49116",
+ "49117"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.129070+00:00"
+ },
+ "China Seas Fabrics": {
+ "n": 4,
+ "aliases": [
+ "CHINA SEAS FABRICS"
+ ],
+ "alias_re": "CHINA\\s*SEAS\\s*FABRICS",
+ "prefixes": {
+ "DWCS": 4
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "DWCS-900048",
+ "DWCS-900049",
+ "DWCS-962048",
+ "DWCS-962049"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.129102+00:00"
+ },
+ "Paul Montgomery Original Art": {
+ "n": 49,
+ "aliases": [
+ "PAUL MONTGOMERY ORIGINAL ART"
+ ],
+ "alias_re": "PAUL\\s*MONTGOMERY\\s*ORIGINAL\\s*ART",
+ "prefixes": {
+ "DWORIG": 49
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "DWORIG-7000",
+ "DWORIG-7001",
+ "DWORIG-7002",
+ "DWORIG-7003",
+ "DWORIG-7004",
+ "DWORIG-7005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.129225+00:00"
+ },
+ "Primo Leathers": {
+ "n": 145,
+ "aliases": [
+ "PRIMO LEATHERS"
+ ],
+ "alias_re": "PRIMO\\s*LEATHERS",
+ "prefixes": {
+ "LEA": 209
+ },
+ "numeric_share": 0.12,
+ "common_len": 9,
+ "examples": [
+ "98400",
+ "98401",
+ "98402",
+ "98403",
+ "98404",
+ "98405"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.129899+00:00"
+ },
+ "Cole & Son": {
+ "n": 498,
+ "aliases": [
+ "COLE & SON"
+ ],
+ "alias_re": "COLE\\s*SON",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 9,
+ "examples": [
+ "1001.CS.0",
+ "1001M.CS.0",
+ "1002.CS.0",
+ "10020.CS.0",
+ "10021.CS.0",
+ "10022.CS.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.136941+00:00"
+ },
+ "Arte": {
+ "n": 3,
+ "aliases": [
+ "ARTE"
+ ],
+ "alias_re": "ARTE",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "28034",
+ "38240",
+ "40313"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.137025+00:00"
+ },
+ "Backdrop": {
+ "n": 9,
+ "aliases": [
+ "BACKDROP"
+ ],
+ "alias_re": "BACKDROP",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 7,
+ "examples": [
+ "5016840",
+ "5016890",
+ "5017350",
+ "5017400",
+ "5017510",
+ "5017840"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.137072+00:00"
+ },
+ "China Seas": {
+ "n": 1805,
+ "aliases": [
+ "CHINA SEAS"
+ ],
+ "alias_re": "CHINA\\s*SEAS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 6,
+ "examples": [
+ "020070WP",
+ "700121",
+ "700221",
+ "700321",
+ "700421",
+ "700521"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.142615+00:00"
+ },
+ "Big Sur Beans": {
+ "n": 3,
+ "aliases": [
+ "BIG SUR BEANS"
+ ],
+ "alias_re": "BIG\\s*SUR\\s*BEANS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 20,
+ "examples": [
+ "29681700033311501200",
+ "35856857178923376630",
+ "44650038665030506303"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.142655+00:00"
+ },
+ "Designer Wallcoverings": {
+ "n": 1195,
+ "aliases": [
+ "DESIGNER WALLCOVERINGS"
+ ],
+ "alias_re": "DESIGNER\\s*WALLCOVERINGS",
+ "prefixes": {},
+ "numeric_share": 0.98,
+ "common_len": 5,
+ "examples": [
+ "10000",
+ "10001",
+ "10002",
+ "10003",
+ "10004",
+ "10005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.148533+00:00"
+ },
+ "Pierre Frey": {
+ "n": 3,
+ "aliases": [
+ "PIERRE FREY"
+ ],
+ "alias_re": "PIERRE\\s*FREY",
+ "prefixes": {
+ "FP": 4
+ },
+ "numeric_share": 0,
+ "common_len": 13,
+ "examples": [
+ "FP767002-ROSE",
+ "FP767003-BLEU",
+ "LES-FEUILLAGES-WALLCOVERING-PIERRE-FREY"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.148593+00:00"
+ },
+ "Black Edition": {
+ "n": 5,
+ "aliases": [
+ "BLACK EDITION"
+ ],
+ "alias_re": "BLACK\\s*EDITION",
+ "prefixes": {
+ "W": 9
+ },
+ "numeric_share": 0,
+ "common_len": 4,
+ "examples": [
+ "W366",
+ "W393",
+ "W916",
+ "W930",
+ "W952"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.148628+00:00"
+ },
+ "Surface Stick": {
+ "n": 751,
+ "aliases": [
+ "SURFACE STICK"
+ ],
+ "alias_re": "SURFACE\\s*STICK",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "21500",
+ "21501",
+ "21502",
+ "21503",
+ "21504",
+ "21505"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.150522+00:00"
+ },
+ "Christian Lacroix Europe": {
+ "n": 88,
+ "aliases": [
+ "CHRISTIAN LACROIX EUROPE"
+ ],
+ "alias_re": "CHRISTIAN\\s*LACROIX\\s*EUROPE",
+ "prefixes": {
+ "PCL": 169
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "FCL7083",
+ "LESCENTAUREES03BLACKGOLDWALLPAPER",
+ "PCL004",
+ "PCL005",
+ "PCL005-03",
+ "PCL006"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.150935+00:00"
+ },
+ "William Morris": {
+ "n": 395,
+ "aliases": [
+ "WILLIAM MORRIS"
+ ],
+ "alias_re": "WILLIAM\\s*MORRIS",
+ "prefixes": {},
+ "numeric_share": 0.95,
+ "common_len": 6,
+ "examples": [
+ "#REF!",
+ "210270",
+ "210347",
+ "210349",
+ "210355",
+ "210362"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.152292+00:00"
+ },
+ "MC Escher Wallpaper": {
+ "n": 50,
+ "aliases": [
+ "MC ESCHER WALLPAPER"
+ ],
+ "alias_re": "ESCHER\\s*WALLPAPER",
+ "prefixes": {
+ "DWSC": 6
+ },
+ "numeric_share": 0.88,
+ "common_len": 45,
+ "examples": [
+ "23100_FISH_RED_NERO_CREAMAT$208NETAFTER20%DISCOUNT",
+ "23101_FISH_DARK-GREENAT$208NETAFTER20%DISCOUNT",
+ "23102_FISH_ORANGE-GREENAT$208NETAFTER20%DISCOUNT",
+ "23103_FISH_BLU_REDAT$208NETAFTER20%DISCOUNT",
+ "23104_FISH_LIGHT-GREYAT$208NETAFTER20%DISCOUNT",
+ "23110_SCALES_GREENAT$208NETAFTER20%DISCOUNT"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.152552+00:00"
+ },
+ "Limited Stock Flocked": {
+ "n": 13,
+ "aliases": [
+ "LIMITED STOCK FLOCKED"
+ ],
+ "alias_re": "LIMITED\\s*STOCK\\s*FLOCKED",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "67004",
+ "67005",
+ "67007",
+ "67008",
+ "67011",
+ "67016"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.152605+00:00"
+ },
+ "Graduate Collection": {
+ "n": 50,
+ "aliases": [
+ "GRADUATE COLLECTION"
+ ],
+ "alias_re": "GRADUATE\\s*COLLECTION",
+ "prefixes": {
+ "COPY": 9,
+ "SHOWGIRLS": 8,
+ "THESOIR": 6,
+ "EXOTIC": 4,
+ "VESTIGE": 3
+ },
+ "numeric_share": 0,
+ "common_len": 28,
+ "examples": [
+ "AB1LEOBROWN",
+ "BWLUXECHARCOAL",
+ "COPY-OF-AT-THE-ART-GALLERY-BURGUNDY",
+ "COPY-OF-AT-THE-ART-GALLERY-CHARCOAL",
+ "COPY-OF-AT-THE-ART-GALLERY-TEAL",
+ "COPY-OF-CAVALCADE-OF-CATS-BLUE"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.152816+00:00"
+ },
+ "Colefax and Fowler": {
+ "n": 360,
+ "aliases": [
+ "COLEFAX AND FOWLER"
+ ],
+ "alias_re": "COLEFAX\\s*AND\\s*FOWLER",
+ "prefixes": {
+ "W": 117
+ },
+ "numeric_share": 0.68,
+ "common_len": 24,
+ "examples": [
+ "1909124BELLFLOWERWALLPAPER",
+ "1909183BELLFLOWERWALLPAPER",
+ "1909214BELLFLOWERWALLPAPER",
+ "1909275BELLFLOWERWALLPAPER",
+ "1909305BELLFLOWERWALLPAPER",
+ "1909489DELANCEYWALLPAPER"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.153829+00:00"
+ },
+ "Porsche™ Paint - Speed Yellow": {
+ "n": 9,
+ "aliases": [
+ "PORSCHE™ PAINT - SPEED YELLOW"
+ ],
+ "alias_re": "PORSCHE\\s*PAINT\\s*SPEED\\s*YELLOW",
+ "prefixes": {
+ "PAINT": 9
+ },
+ "numeric_share": 0,
+ "common_len": 14,
+ "examples": [
+ "PAINT-302023-1",
+ "PAINT-302023-2",
+ "PAINT-302023-3",
+ "PAINT-302023-4",
+ "PAINT-302023-5",
+ "PAINT-302023-6"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "house",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.153864+00:00"
+ },
+ "Pixels": {
+ "n": 27,
+ "aliases": [
+ "PIXELS"
+ ],
+ "alias_re": "PIXELS",
+ "prefixes": {
+ "ARTWORKID": 40,
+ "WASHINGTON": 6,
+ "TEA": 4
+ },
+ "numeric_share": 0,
+ "common_len": 174,
+ "examples": [
+ "ARTWORKID[65264779]-PRODUCTID[PUZZLE-11-15]-IMAGEWIDTH[793]-IMAGEHEIGHT[1000]-TARGETX[-21]-TARGETY[0]-MODELWIDTH[750]-MODELHEIGHT[1000]-BACKGROUNDCOLOR[676350]-ORIENTATION[1]",
+ "ARTWORKID[65264819]-PRODUCTID[DUVETCOVER-KING]-IMAGEWIDTH[995]-IMAGEHEIGHT[666]-TARGETX[0]-TARGETY[89]-MODELWIDTH[995]-MODELHEIGHT[845]-BACKGROUNDCOLOR[656559]-ORIENTATION[0]",
+ "ARTWORKID[65264857]-PRODUCTID[CANVASPRINTSTRETCHED]-IMAGEWIDTH[6.5]-IMAGEHEIGHT[8]-PAPERID[GLOSSYCANVAS]-WRAPWIDTH[1.5]-WRAPCOLOR[MIRRORED]",
+ "ARTWORKID[65264857]-PRODUCTID[THROWPILLOW-14-14]-IMAGEWIDTH[479]-IMAGEHEIGHT[579]-TARGETX[0]-TARGETY[-50]-MODELWIDTH[479]-MODELHEIGHT[479]-BACKGROUNDCOLOR[51290E]-ORIENTATION[0]-INSERT[1]",
+ "ARTWORKID[65264903]-PRODUCTID[PUZZLE-11-15]-IMAGEWIDTH[778]-IMAGEHEIGHT[1000]-TARGETX[-14]-TARGETY[0]-MODELWIDTH[750]-MODELHEIGHT[1000]-BACKGROUNDCOLOR[A8926C]-ORIENTATION[1]",
+ "ARTWORKID[65264903]-PRODUCTID[YOGAMAT]-IMAGEWIDTH[1027]-IMAGEHEIGHT[1320]-TARGETX[-293]-TARGETY[0]-MODELWIDTH[440]-MODELHEIGHT[1320]-BACKGROUNDCOLOR[A8926C]-ORIENTATION[0]"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.158065+00:00"
+ },
+ "Innovations USA": {
+ "n": 300,
+ "aliases": [
+ "INNOVATIONS USA"
+ ],
+ "alias_re": "INNOVATIONS\\s*USA",
+ "prefixes": {
+ "TRUE": 45,
+ "SOA": 25,
+ "ZIO": 23
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "AGA-001",
+ "AGA-004",
+ "ARIN-3",
+ "ARIN-4",
+ "ARIN-7",
+ "ASR-001"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.159221+00:00"
+ },
+ "Coordonné Europe": {
+ "n": 29,
+ "aliases": [
+ "COORDONNÉ EUROPE"
+ ],
+ "alias_re": "COORDONN\\s*EUROPE",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "23013",
+ "23014",
+ "23015",
+ "23016",
+ "23057",
+ "23058"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.159359+00:00"
+ },
+ "Ultrasuede": {
+ "n": 65,
+ "aliases": [
+ "ULTRASUEDE"
+ ],
+ "alias_re": "ULTRASUEDE",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 8,
+ "examples": [
+ "5538-124",
+ "5538-133",
+ "5538-136",
+ "5538-232",
+ "5538-233",
+ "5538-253"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.159721+00:00"
+ },
+ "Newmor Wallcoverings": {
+ "n": 528,
+ "aliases": [
+ "NEWMOR WALLCOVERINGS"
+ ],
+ "alias_re": "NEWMOR\\s*WALLCOVERINGS",
+ "prefixes": {
+ "CZN": 54,
+ "BST": 32,
+ "DEL": 31,
+ "TEL": 29,
+ "CAS": 26,
+ "COR": 25,
+ "COS": 24,
+ "KOT": 24
+ },
+ "numeric_share": 0,
+ "common_len": 7,
+ "examples": [
+ "AR-101",
+ "AR-102",
+ "AR-103",
+ "AR-104",
+ "AR-105",
+ "AR-106"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.161641+00:00"
+ },
+ "Clarke and Clarke": {
+ "n": 4,
+ "aliases": [
+ "CLARKE AND CLARKE"
+ ],
+ "alias_re": "CLARKE\\s*AND\\s*CLARKE",
+ "prefixes": {
+ "W": 6
+ },
+ "numeric_share": 0.5,
+ "common_len": 5,
+ "examples": [
+ "01.CAC.0",
+ "02.CAC.0",
+ "W0201",
+ "W0202"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.161690+00:00"
+ },
+ "Innovations": {
+ "n": 9,
+ "aliases": [
+ "INNOVATIONS"
+ ],
+ "alias_re": "INNOVATIONS",
+ "prefixes": {
+ "R": 7,
+ "NDAL": 3
+ },
+ "numeric_share": 0,
+ "common_len": 6,
+ "examples": [
+ "NDAL-2",
+ "NDAL-5",
+ "NDAL-7",
+ "R78901",
+ "R78902",
+ "R78903"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.161733+00:00"
+ },
+ "Gaston Y Daniela": {
+ "n": 2285,
+ "aliases": [
+ "GASTON Y DANIELA"
+ ],
+ "alias_re": "GASTON\\s*DANIELA",
+ "prefixes": {
+ "GDT": 1455,
+ "LCT": 549,
+ "GDW": 220
+ },
+ "numeric_share": 0,
+ "common_len": 13,
+ "examples": [
+ "1004.CS.0",
+ "GDT1191.006.0",
+ "GDT1597.002.0",
+ "GDT1597.003.0",
+ "GDT3255.001.0",
+ "GDT3941.001.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.169244+00:00"
+ },
+ "Belarte Studio": {
+ "n": 11,
+ "aliases": [
+ "BELARTE STUDIO"
+ ],
+ "alias_re": "BELARTE\\s*STUDIO",
+ "prefixes": {
+ "BAS": 11
+ },
+ "numeric_share": 0,
+ "common_len": 11,
+ "examples": [
+ "BAS08501066",
+ "BAS08502070",
+ "BAS08503095",
+ "BAS08506040",
+ "BAS08507130",
+ "BAS08902103"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.169331+00:00"
+ },
+ "Parkertex": {
+ "n": 29,
+ "aliases": [
+ "PARKERTEX"
+ ],
+ "alias_re": "PARKERTEX",
+ "prefixes": {
+ "PF": 16,
+ "PT": 5,
+ "PP": 4,
+ "M": 3
+ },
+ "numeric_share": 0,
+ "common_len": 13,
+ "examples": [
+ "M5669_680",
+ "M7671_720",
+ "M7800_104",
+ "PF50004.1.0",
+ "PF50019.290.0",
+ "PF50020.390.0"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.169441+00:00"
+ },
+ "Sacha Walckhoff": {
+ "n": 3,
+ "aliases": [
+ "SACHA WALCKHOFF"
+ ],
+ "alias_re": "SACHA\\s*WALCKHOFF",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 13,
+ "examples": [
+ "113470-MASTER",
+ "113472-MASTER",
+ "113476-MASTER"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.169458+00:00"
+ },
+ "Maya Romanoff": {
+ "n": 745,
+ "aliases": [
+ "MAYA ROMANOFF"
+ ],
+ "alias_re": "MAYA\\s*ROMANOFF",
+ "prefixes": {
+ "MR": 202,
+ "FV": 62,
+ "TY": 59,
+ "W": 53,
+ "AC": 31
+ },
+ "numeric_share": 0,
+ "common_len": 10,
+ "examples": [
+ "-BEADAZZLEDGEODE-",
+ "-GRANDSCALEAJIROCHEVRON-",
+ "-WEATHEREDMETALSII-",
+ "ABH-1245",
+ "ABH-1410",
+ "ABH-1510"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.171235+00:00"
+ },
+ "Florentina Feathers": {
+ "n": 33,
+ "aliases": [
+ "FLORENTINA FEATHERS"
+ ],
+ "alias_re": "FLORENTINA\\s*FEATHERS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "20001",
+ "20003",
+ "20004",
+ "20005",
+ "20006",
+ "20009"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.171396+00:00"
+ },
+ "Hollywood Wallcoverings": {
+ "n": 6897,
+ "aliases": [
+ "HOLLYWOOD WALLCOVERINGS"
+ ],
+ "alias_re": "HOLLYWOOD\\s*WALLCOVERINGS",
+ "prefixes": {
+ "WHF": 296
+ },
+ "numeric_share": 0.32,
+ "common_len": 5,
+ "examples": [
+ "01099",
+ "09199309",
+ "09199903",
+ "100000",
+ "100001",
+ "100002"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.190123+00:00"
+ },
+ "Cloth and Paper": {
+ "n": 36,
+ "aliases": [
+ "CLOTH AND PAPER"
+ ],
+ "alias_re": "CLOTH\\s*AND\\s*PAPER",
+ "prefixes": {
+ "CP": 72
+ },
+ "numeric_share": 0,
+ "common_len": 9,
+ "examples": [
+ "CP1000-01",
+ "CP1000-02",
+ "CP1000-03",
+ "CP1000-04",
+ "CP1000-05",
+ "CP1000-06"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.190366+00:00"
+ },
+ "Rebel Walls": {
+ "n": 3477,
+ "aliases": [
+ "REBEL WALLS"
+ ],
+ "alias_re": "REBEL\\s*WALLS",
+ "prefixes": {
+ "R": 3194,
+ "RS": 1039
+ },
+ "numeric_share": 0,
+ "common_len": 6,
+ "examples": [
+ "74138",
+ "74139",
+ "74140",
+ "74141",
+ "74142",
+ "74144"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.203781+00:00"
+ },
+ "Limited Stock Prints": {
+ "n": 60,
+ "aliases": [
+ "LIMITED STOCK PRINTS"
+ ],
+ "alias_re": "LIMITED\\s*STOCK\\s*PRINTS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "54999",
+ "55000",
+ "55001",
+ "55002",
+ "55003",
+ "55004"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.204042+00:00"
+ },
+ "Coordonné": {
+ "n": 1266,
+ "aliases": [
+ "COORDONNÉ"
+ ],
+ "alias_re": "COORDONN",
+ "prefixes": {
+ "B": 496,
+ "A": 398,
+ "YSP": 140
+ },
+ "numeric_share": 0.5,
+ "common_len": 19,
+ "examples": [
+ "23001",
+ "23002",
+ "23003",
+ "23004",
+ "23005",
+ "31000"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.211577+00:00"
+ },
+ "Dolce & Gabbana": {
+ "n": 30,
+ "aliases": [
+ "DOLCE & GABBANA"
+ ],
+ "alias_re": "DOLCE\\s*GABBANA",
+ "prefixes": {
+ "TCW": 30
+ },
+ "numeric_share": 0,
+ "common_len": 16,
+ "examples": [
+ "TCW001TCAI5UL005",
+ "TCW001TCAI5UL033",
+ "TCW001TCAI5UZ005",
+ "TCW001TCAI8UB003",
+ "TCW002TCAHPUC085",
+ "TCW003TCAHPUC072"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.211696+00:00"
+ },
+ "Peg Norriss": {
+ "n": 3,
+ "aliases": [
+ "PEG NORRISS"
+ ],
+ "alias_re": "PEG\\s*NORRISS",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 7,
+ "examples": [
+ "5015851",
+ "5015852",
+ "5015853"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.211720+00:00"
+ },
+ "Hermes": {
+ "n": 28,
+ "aliases": [
+ "HERMES"
+ ],
+ "alias_re": "HERMES",
+ "prefixes": {},
+ "numeric_share": 1,
+ "common_len": 5,
+ "examples": [
+ "15000",
+ "15001",
+ "15002",
+ "15003",
+ "15004",
+ "15005"
+ ],
+ "private_label": false,
+ "source": "catalog",
+ "code_source": "mfr",
+ "learned_scans": 0,
+ "updated_at": "2026-06-26T06:01:30.211838+00:00"
+ }
+ }
+}
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index d69d874..306c184 100644
--- a/public/index.html
+++ b/public/index.html
@@ -988,11 +988,11 @@ function chipTo(f){
async function scanResolve(cands){
for(const c of (cands||[])){ // pass 1 — TWIL catalog (dw_sku + mfr# + name + collection in hay)
try{ const d=await (await fetch('/api/lookup?q='+encodeURIComponent(c))).json();
- if(d&&d.items&&d.items.length) return {via:'any',q:c,n:d.items.length}; }catch(e){}
+ if(d&&d.items&&d.items.length) return {via:'any',q:c,n:d.items.length,vendor:(d.items[0]&&d.items[0].vendor)||''}; }catch(e){}
}
for(const c of (cands||[])){ // pass 2 — ALL Shopify (any vendor: dw sku / name / vendor)
try{ const d=await (await fetch('/api/shopify-search?q='+encodeURIComponent(c))).json();
- if(d&&d.items&&d.items.length) return {via:'shop',q:c,n:d.items.length}; }catch(e){}
+ if(d&&d.items&&d.items.length) return {via:'shop',q:c,n:d.items.length,vendor:(d.items[0]&&d.items[0].vendor)||''}; }catch(e){}
}
return null;
}
@@ -1006,6 +1006,10 @@ async function applyScan(d){
playUhoh(); chipTo('shop'); $('#q').value=cands[0]; toast('✗ No match for '+cands[0]+' — searching all Shopify'); return doShopSearch();
}
playYoohoo(); // ✓ resolved to a real product — the happy lock
+ // LEARN: this scan resolved to a known vendor — refine that vendor's sample profile
+ // (fire-and-forget; server folds in the on-swatch code prefix). See /learn.
+ if(hit.vendor){ fetch('/api/learn',{method:'POST',headers:{'Content-Type':'application/json'},
+ body:JSON.stringify({text:(d&&d.text)||'',sku:hit.q,vendor:hit.vendor})}).catch(()=>{}); }
$('#q').value=hit.q;
if(hit.via==='any'){ chipTo('any'); toast('✓ '+hit.q+' — '+hit.n+' on TWIL'); doLookup(); }
else { chipTo('shop'); toast('✓ '+hit.q+' — '+hit.n+' in Shopify'); doShopSearch(); }
diff --git a/public/learn.html b/public/learn.html
new file mode 100644
index 0000000..a22333a
--- /dev/null
+++ b/public/learn.html
@@ -0,0 +1,109 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
+<title>What the scanner has learned · DW</title>
+<style>
+ :root{ --bg:#0f0e0c; --card:#1b1916; --ink:#f3efe7; --muted:#9a9184; --line:#2e2a25;
+ --gold:#c8a24a; --green:#3fa06a; --red:#c0563f; --cols:3; }
+ *{box-sizing:border-box}
+ body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.45 -apple-system,BlinkMacSystemFont,"SF Pro Display",sans-serif}
+ header{position:sticky;top:0;z-index:5;background:rgba(15,14,12,.96);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);padding:14px 18px}
+ .h1{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
+ .h1 b{font:700 18px/1 "SF Pro Display";letter-spacing:.02em}.h1 b i{color:var(--gold);font-style:normal}
+ .sub{color:var(--muted);font-size:12.5px}
+ .ver{font:600 9px/1 ui-monospace,Menlo,monospace;background:#1b1407;color:var(--gold);border-radius:99px;padding:3px 6px}
+ .controls{display:flex;gap:10px;align-items:center;margin-top:11px;flex-wrap:wrap}
+ input,select{background:#16140f;border:1px solid var(--line);color:var(--ink);border-radius:9px;padding:8px 11px;font-size:13.5px}
+ input#q{flex:1;min-width:180px}
+ input[type=range]{accent-color:var(--gold);padding:0}
+ .lbl{color:var(--muted);font-size:11.5px}
+ .wrap{padding:16px 18px 60px}
+ .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:12px}
+ .card{background:var(--card);border:1px solid var(--line);border-radius:13px;padding:13px 14px;display:flex;flex-direction:column;gap:8px}
+ .card .top{display:flex;align-items:center;gap:8px}
+ .vn{font:700 15px/1.2 "SF Pro Display";flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+ .src{font:600 9.5px/1 ui-monospace,Menlo,monospace;padding:3px 7px;border-radius:99px;border:1px solid var(--line);color:var(--muted)}
+ .src.scan{color:var(--green);border-color:#274c39}.src.catalog{color:var(--gold);border-color:#3a2e10}
+ .pl{font:700 9.5px/1 sans-serif;color:#000;background:var(--red);padding:3px 7px;border-radius:99px}
+ .stats{display:flex;gap:14px;color:var(--muted);font-size:12px}
+ .stats b{color:var(--ink);font:600 13px/1 ui-monospace,Menlo,monospace}
+ .chips{display:flex;gap:6px;flex-wrap:wrap}
+ .chip{font:600 11.5px/1 ui-monospace,Menlo,monospace;background:#221d12;color:var(--gold);border:1px solid #3a2e10;border-radius:7px;padding:4px 7px}
+ .chip .n{color:var(--muted);font-weight:400}
+ .ex{font:400 11px/1.3 ui-monospace,Menlo,monospace;color:var(--muted);word-break:break-all}
+ .when{font:500 10.5px/1 ui-monospace,Menlo,monospace;color:var(--muted);display:inline-flex;gap:5px;align-items:center}
+ .empty{color:var(--muted);padding:40px 0;text-align:center}
+ a{color:var(--gold)}
+</style>
+</head>
+<body>
+ <header>
+ <div class="h1"><b><i>DW</i> Scanner</b> · what it's learned about each vendor's samples <span class="ver">__VER__</span></div>
+ <div class="sub" id="sub">loading…</div>
+ <div class="controls">
+ <input id="q" placeholder="🔎 filter vendor / prefix…">
+ <select id="sort">
+ <option value="learned">Most scan-learned</option>
+ <option value="n">Most catalog codes</option>
+ <option value="az">Vendor A→Z</option>
+ <option value="updated">Recently updated</option>
+ </select>
+ <label class="lbl">density</label>
+ <input type="range" id="dens" min="2" max="6" value="3" title="cards per row">
+ </div>
+ </header>
+ <div class="wrap"><div class="grid" id="grid"></div><div class="empty" id="empty" hidden></div></div>
+<script>
+const $=s=>document.querySelector(s);
+let ALL=[];
+const LS=(k,d)=>{try{return localStorage.getItem(k)??d}catch(e){return d}};
+function fmtWhen(iso){ if(!iso) return ''; const d=new Date(iso);
+ return d.toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'}); }
+function card(v){
+ const prefs=Object.entries(v.prefixes||{}).sort((a,b)=>b[1]-a[1])
+ .map(([p,n])=>`<span class="chip">${p}<span class="n"> ·${n}</span></span>`).join('')
+ || (v.numeric_share>=0.6?'<span class="chip">###<span class="n"> numeric</span></span>':'<span class="chip" style="opacity:.5">—</span>');
+ const ex=(v.examples||[]).slice(0,5).join(' ');
+ const src=(v.source==='scan'||v.learned_scans>0)?'scan':'catalog';
+ return `<div class="card">
+ <div class="top"><div class="vn" title="${v.name}">${v.name}</div>
+ ${v.private_label?'<span class="pl" title="private-label upstream — never customer-facing">PRIVATE</span>':''}
+ <span class="src ${src}">${src}</span></div>
+ <div class="stats"><span>codes <b>${v.n||0}</b></span><span>scans <b>${v.learned_scans||0}</b></span>
+ ${v.common_len?`<span>len <b>${v.common_len}</b></span>`:''}</div>
+ <div class="chips">${prefs}</div>
+ ${ex?`<div class="ex">${ex}</div>`:''}
+ <div class="when" title="${v.updated_at||''}">🕓 ${fmtWhen(v.updated_at)||'—'}</div>
+ </div>`;
+}
+function render(){
+ const q=$('#q').value.trim().toUpperCase(), sort=$('#sort').value;
+ let rows=ALL.filter(v=>!q || v.name.toUpperCase().includes(q) || Object.keys(v.prefixes||{}).some(p=>p.includes(q)));
+ const cmp={ learned:(a,b)=>(b.learned_scans||0)-(a.learned_scans||0)||(b.n||0)-(a.n||0),
+ n:(a,b)=>(b.n||0)-(a.n||0), az:(a,b)=>a.name.localeCompare(b.name),
+ updated:(a,b)=>String(b.updated_at||'').localeCompare(String(a.updated_at||'')) };
+ rows.sort(cmp[sort]||cmp.learned);
+ $('#grid').innerHTML=rows.map(card).join('');
+ $('#empty').hidden=rows.length>0; $('#empty').textContent=q?'No vendor matches that filter.':'Nothing learned yet — run build_vendor_profiles.py or scan a few samples.';
+}
+async function load(){
+ try{
+ const d=await (await fetch('/api/vendor-profiles')).json();
+ ALL=d.vendors||[];
+ const scans=ALL.reduce((s,v)=>s+(v.learned_scans||0),0);
+ $('#sub').textContent=`${d.total} vendors learned · ${d.seeded.length} curated seed · ${scans} live scan refinements`;
+ render();
+ }catch(e){ $('#sub').textContent='Could not load profiles.'; }
+}
+$('#q').addEventListener('input',render);
+$('#sort').addEventListener('change',()=>{ localStorage.setItem('learn_sort',$('#sort').value); render(); });
+$('#dens').addEventListener('input',e=>{ document.documentElement.style.setProperty('--cols',e.target.value); localStorage.setItem('learn_dens',e.target.value); });
+// restore persisted controls
+$('#sort').value=LS('learn_sort','learned'); $('#dens').value=LS('learn_dens','3');
+document.documentElement.style.setProperty('--cols',$('#dens').value);
+load(); setInterval(load,15000);
+</script>
+</body>
+</html>
diff --git a/server.js b/server.js
index e2ea11c..42ff2f2 100644
--- a/server.js
+++ b/server.js
@@ -291,7 +291,7 @@ function parseOcrRows(stdout) {
// Pure: OCR rows → { text, vendor, candidates, top, topStrong }. No I/O.
function analyzeOcr(rows) {
const text = rows.map(r => r.t).join('\n');
- const vlex = VENDOR_LEX.find(v => v.re.test(text.toUpperCase())) || null;
+ const vlex = LEXICON.find(v => v.re.test(text.toUpperCase())) || null;
const vendor = vlex ? vlex.name : null;
// SKU-likeness tie-breaker: brand-matching prefix first (the swatch told us the vendor),
// then known prefixes (GRS- = Fentucci, WD = Winfield Thybony), dashed/alnum, length.
@@ -323,6 +323,49 @@ function analyzeOcr(rows) {
return { text, vendor, candidates: codes.map(c => c.t), top: top ? top.t : null, topStrong };
}
+
+// ── Vendor sample profiles: "how each vendor labels their samples" ─────────────
+// Built broadly from the catalog by build_vendor_profiles.py and refined per-scan by
+// /api/learn. Merged with the curated seed VENDOR_LEX into the runtime LEXICON the
+// scanner consults — so brand detection + SKU prefix-boosting improve as we learn.
+const VENDOR_PROFILES_FILE = path.join(DATA, 'vendor_profiles.json');
+const PRIVATE_LABEL_RE = /BREWSTER|YORK|WALLQUEST|CHESAPEAKE|NEXTWALL|SEABROOK|COMMAND ?54|DESIMA|CARLSTEN|NICOLETTE ?MAYER/i;
+const escapeRe = s => String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+function brandRe(name) { // vendor name -> flexible OCR detection source string
+ const words = (String(name).match(/[A-Za-z]+/g) || []).filter(w => w.length >= 3).map(w => w.toUpperCase());
+ if (!words.length) return null;
+ if (words.length === 1 && words[0].length < 4) return null; // single short word = noisy
+ return words.map(escapeRe).join('\\s*');
+}
+let VENDOR_PROFILES = (loadJSON(VENDOR_PROFILES_FILE, {}).profiles) || {};
+function saveVendorProfiles() {
+ const meta = loadJSON(VENDOR_PROFILES_FILE, {})._meta || {};
+ meta.updated_at = new Date().toISOString(); meta.vendors = Object.keys(VENDOR_PROFILES).length;
+ saveJSON(VENDOR_PROFILES_FILE, { _meta: meta, profiles: VENDOR_PROFILES });
+}
+// Compile one learned profile into the seed's {name, re, pfx} shape.
+function profileToLex(name, p) {
+ let re = null; try { re = p.alias_re ? new RegExp(p.alias_re) : null; } catch (e) { re = null; }
+ const prefs = Object.keys(p.prefixes || {}).filter(Boolean).sort((a, b) => b.length - a.length); // WDW before WD
+ // A vendor can be BOTH prefixed AND numeric-dominant (Schumacher: DWLK house code + bare
+ // numbers on the swatch) — express both so the scanner matches either form it sees.
+ const alts = prefs.map(escapeRe);
+ if ((p.numeric_share || 0) >= 0.3) alts.push('\\d{3,}');
+ let pfx = null;
+ if (alts.length) { try { pfx = new RegExp('^(' + alts.join('|') + ')'); } catch (e) { pfx = null; } }
+ if (!re && !pfx) return null;
+ return { name, re: re || /(?!)/, pfx: pfx || /(?!)/, learned: true, private_label: !!p.private_label };
+}
+// LEXICON = curated seed first (trusted), then learned profiles not already seeded.
+let LEXICON = [];
+function rebuildLexicon() {
+ const seeded = new Set(VENDOR_LEX.map(v => v.name.toUpperCase()));
+ const learned = Object.entries(VENDOR_PROFILES).map(([n, p]) => profileToLex(n, p))
+ .filter(Boolean).filter(e => !seeded.has(e.name.toUpperCase()));
+ LEXICON = VENDOR_LEX.concat(learned);
+}
+rebuildLexicon();
+
const appHandler = (req, res) => {
// public (no-auth) paths: health + the home-screen-install assets iOS fetches without creds
const PUBLIC = ['/healthz', '/icon-180.png', '/icon-512.png', '/apple-touch-icon.png', '/manifest.webmanifest'];
@@ -417,6 +460,46 @@ const appHandler = (req, res) => {
return res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' }), res.end(html);
}
+ // ── Vendor-profile learning surface ──
+ // What the app has learned about how each vendor labels their samples.
+ if (u.pathname === '/api/vendor-profiles' && req.method === 'GET') {
+ const vendors = Object.entries(VENDOR_PROFILES).map(([name, p]) => Object.assign({ name }, p))
+ .sort((a, b) => (b.learned_scans || 0) - (a.learned_scans || 0) || (b.n || 0) - (a.n || 0));
+ return send(res, 200, { total: vendors.length, seeded: VENDOR_LEX.map(v => v.name), vendors });
+ }
+ // Refine a vendor's profile from a scan that resolved to a real product. Conservative:
+ // we only fold in structured signal (the on-swatch code prefix), never raw OCR prose.
+ if (u.pathname === '/api/learn' && req.method === 'POST') {
+ let body = ''; req.on('data', c => { body += c; if (body.length > 64 * 1024) req.destroy(); });
+ req.on('end', () => {
+ let p; try { p = JSON.parse(body); } catch (e) { return send(res, 400, { err: 'bad json' }); }
+ const vendor = String(p.vendor || '').trim();
+ const sku = String(p.sku || '').toUpperCase().replace(/\s+/g, '');
+ if (!vendor || !sku) return send(res, 400, { err: 'vendor + sku required' });
+ const prof = VENDOR_PROFILES[vendor] || (VENDOR_PROFILES[vendor] = {
+ n: 0, aliases: [vendor.toUpperCase()], alias_re: brandRe(vendor), prefixes: {},
+ numeric_share: 0, common_len: 0, examples: [], private_label: PRIVATE_LABEL_RE.test(vendor),
+ source: 'scan', learned_scans: 0
+ });
+ const pre = (sku.match(/^[A-Z]+/) || [''])[0];
+ if (pre) prof.prefixes[pre] = (prof.prefixes[pre] || 0) + 1;
+ else prof.numeric_share = Math.min(1, (prof.numeric_share || 0) + 0.05);
+ if (!prof.examples.includes(sku) && prof.examples.length < 8) prof.examples.push(sku);
+ prof.learned_scans = (prof.learned_scans || 0) + 1;
+ prof.updated_at = new Date().toISOString();
+ saveVendorProfiles(); rebuildLexicon();
+ return send(res, 200, { ok: true, vendor, learned_prefix: pre || null, learned_scans: prof.learned_scans });
+ });
+ return;
+ }
+ // Learning viewer page (admin, behind the existing basic-auth).
+ if (u.pathname === '/learn') {
+ const f = path.join(ROOT, 'public/learn.html');
+ if (!fs.existsSync(f)) return send(res, 404, { err: 'learn.html missing' });
+ const html = fs.readFileSync(f, 'utf8').replace(/__VER__/g, buildLabel());
+ return res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' }), res.end(html);
+ }
+
// /selfcheck — re-runnable health report. Verifies data integrity + AUTO-CLEANS stale
// photo refs (progress entries pointing at a deleted /photos file = the dead-link class).
if (u.pathname === '/selfcheck') {
← 47a5ecf Ask-the-SKU: voice Q&A about a product via local Ollama ($0)
·
back to Dw Photo Capture
·
auto-save: 2026-06-25T23:07:50 (4 files) — bin/ocr bin/ocr.s 8fae114 →