Close Made for the next sale, too
Open catalog.html directly. No installation or server is needed. The HTML embeds the catalog data; images and source links need internet. Select a sale in the sticky Order by sale selector. Every sale has an independent saved plan, subtotal, copy/CSV/print output and shop link. Adding from the all-sales browsing view focuses that item's sale. Switching sales preserves the other plans; it never combines their totals.
Shortlist and sale plans stay in this browser's local storage. Sharing the public page shares the catalog, not your saved selections: each device has its own shortlist and plans. Use Copy plan or Export plan CSV to send your selections. Different browsers, file locations or origins may have different saved plans; export each sale before moving the file.
Whole-sale score distributions: every sale card breaks down its available wines by exact Vivino wine-level score, showing the number of distinct bottlings and the price range at each score. The 4.0+ headline measures choice across several wines, not the sale's single highest score. Counts deduplicate Vivino wine IDs across vintages; price ranges include all available listed vintages. Coverage shows how many listings have usable scores, so missing evidence is not mistaken for poor quality. Sold-out wines, proxies, unpublished scores and samples below ten ratings are excluded. Price comparison follows the single-bottle / best-pack setting; marked rows may require packs, whose full totals are on the wine cards. Other browsing filters do not change these sale-wide summaries. Sales stay in source order rather than receiving a misleading one-wine ranking.
Recommended complete update: ask Copilot to update the Bakbookim catalog using the personal bakbookim-sales-update skill. It refreshes retailer data, investigates new or changed wines through vivino-lookup, stages uncertain decisions in a resumable review queue, checks the release subset and verifies publication. High-confidence matches can proceed automatically; flagged identities need explicit human confirmation. Existing ratings retain their own capture dates.
Refresh prices, stock and the list of active sales python catalog.py refresh Run from this folder, or right-click Refresh.ps1 and choose Run with PowerShell. Python 3 is required; no packages are required. Refresh reads only public store endpoints, captures every active project, saves a dated raw snapshot and rebuilds HTML, JSON and CSV. It never logs in, modifies the shop cart or places an order.
Publish an update to the shared GitHub Pages site .\Publish.ps1 After reviewing inputs, run python catalog.py build and python catalog.py validate, then publish from this folder with an authenticated GitHub CLI (gh). The publisher uploads the existing built HTML; it does not rebuild or enforce the human-review queue. Its low-level -Refresh shortcut fetches and publishes without pausing for source review, so prefer the complete skill workflow. Only the public index.html is replaced. GitHub Pages redeploys after the commit; verify the live page rather than treating the commit as delivery. Local plans, credentials, raw captures and review queues are not uploaded.
Vivino is deliberately a separate refresh. Its capture date is visible per wine. Rebuilding the shop catalog reuses saved Vivino evidence and reviewed identity decisions; it does not pretend to have fetched fresh ratings.
Update wine identities, notes or Vivino Edit annotations.json for descriptions, curated picks and exact, proxy, needs-review or no-candidate decisions. A product-level kosher label can record an explicit retailer exception; changed sale terms or listing text suppress it until checked. candidate_reviews records candidate-specific agree/conflict/unknown checks and evidence. Omitted wording is not contradictory evidence. Keep unapproved exact proposals outside release annotations, with their links and open questions in review-queue.json and the readable review-queue.csv. raw contains search and page/taste evidence; vivino-cache.json preserves successful captures over failed retries. identity-lock.json records reviewed source names and description hashes. After actually checking a new or changed listing, update only its annotation and corresponding lock entry; do not reset locks to hide warnings.
For additional Vivino captures, use vivino-browser-helper.js in one warm browser tab at Vivino. It searches through the site's search input, paces requests, saves raw responses in IndexedDB and stops on challenges. Export its search/capture files into raw; then:
python catalog.py build
python catalog.py validate
Keep producer, cuvee, vineyard/designation, colour and grape identity aligned. A proxy is never a ranked exact match. Generic, reused or misassigned pictures are unknown evidence, not a reason to reject aligned metadata. Producer-portfolio discoveries are kept separately from literal autocomplete searches. Preserve user_verified: true and its user_confirmation provenance; the build rejects a changed or downgraded confirmed wine ID. project-lock.json separately flags changed sale titles or terms so an old delivery estimate cannot silently appear current.
Files and change history template.html is the UI; catalog.py is the refresh/build pipeline; source.json is the latest shop snapshot; catalog.json and wines.csv are reusable outputs. changes.json records added/removed offers and stock/price changes against the previous build. Dated shop snapshots remain under raw.