# VIDP Web Tool — Changelog

The free reference implementation of the Verified Image Disclosure Protocol.
Distributed under CC BY 4.0 at https://www.vidp.org/downloads/vidp-web-tool.html

---

## v1.5.1 — 2026-05-10

**Critical patch — restores reliable QR scannability after MLS/Zillow recompression.**

Field reports indicated that QR codes generated by v1.5.0 were scanning at delivery but failing intermittently after MLS and Zillow recompression. Empirical analysis confirmed default settings produced QR module densities below the post-compression decoder threshold (~2.5 px/module) for any URL longer than approximately 30 characters. In multi-trial testing of the worst-case syndication chain (CRMLS → Zillow hero), v1.5.0 settings produced **0 successful decodes out of 10 trials**. v1.5.1 produces **10 out of 10**.

**Fixed**
- QR symbol opacity is now locked at 100% regardless of the slider setting. In v1.5.0, the "QR opacity" slider applied alpha to the QR symbol itself, destroying the luminance contrast decoders rely on. The slider now controls only the white plate underneath the QR.
- Default QR size raised from 5% to 10% of the shorter image dimension. Empirically validated as the floor for 100% scan rate against the worst-case syndication chain.
- Slider minimum raised from 1% to 6%. Below 6% is unscannable for any practical URL length.
- Standard error correction raised from level L (7%) to level M (15%). L cannot recover from JPEG ringing artifacts in QR timing patterns.
- Internal QR margin raised from 2 modules to 4 modules (the QR specification minimum quiet zone).

**Added**
- Optional "Short-link prefix" field in the defaults section. When configured, the tool generates a 6-character base62 short code per image and encodes the short URL in QR payloads instead of the full slug URL. Reduces QR module count by approximately 40% for typical listing URLs, which dramatically improves post-compression scan reliability.
- Netlify-format `_redirects` file in exports (when short-link prefix is set). Producer uploads it once to their verifier host; short codes resolve to the full gallery URL with image fragment at scan time.
- Pre-export survival check. Every export runs a synthetic CRMLS → Zillow hero compression simulation against the actual configured QR settings, decodes the result with the bundled `jsQR` library, and writes the verdict to `audit.json` under a new `qr_survival_check` field. Provides an audit trail proving the export was validated before delivery.
- New audit.json fields: `short_links` (when applicable), `qr_url_strategy`, `qr_internal_margin_modules`, `qr_symbol_opacity_percent`, and `qr_survival_check`.

**Changed**
- "QR opacity" slider relabeled to "QR plate opacity" with helper text "QR symbol always 100% — slider affects white plate only" to make the behavior change visible to producers.
- "QR size" slider helper text updated to "% of shorter dimension (min 6.0% — survives MLS recompression)".
- v1.5.0 → v1.5.1 migration: on first load, a saved `qrSize` below 6.0% is silently clamped to 6.0% and a console message explains the change.
- `audit.json` `generated_by` field now reads `"VIDP Web Tool v1.5.1"`.
- Tool version display in masthead updated to `v1.5.1`.

**Did not change**
- VIDP specification version (still v1.2.2).
- v1.5.0 workflow improvements (saved producer defaults, persistent storage URL, package naming, listing rename model, export controls).
- MLS variant settings introduced in v1.4 — already conservative and unaffected by this patch. v1.5.1 extends the same hardening philosophy to the standard variant for non-MLS surfaces (Zillow direct, agent websites, social) that also recompress.
- QR placement, pill rendering, or any other compositing behavior unrelated to the QR survival fix.

---

## v1.5.0 — 2026

**Workflow refinement release.** Formalized the persistence/naming model around producer-account-style defaults vs. per-listing data. Built on top of the v1.4 multi-variant output and saved-defaults architecture.

**Added**
- "Saved defaults" panel surfacing browser-stored producer identity, verification destination, and output preferences as a clear set of account-like defaults.
- "New listing" quick-start block under the defaults panel.
- Distinct `Final package name` field for export naming, separate from the URL-oriented `slug`. The slug stays canonical for QR target URLs; the package name controls the exported zip filename and top-level folder.
- Folder-save export option (where browser support exists), with `.zip` export as the universal fallback.
- Top-level folder inside zip exports named from the final package name. Avoids collisions when multiple listings unzip into the same folder.
- Three distinct reset actions: New listing, Reset export naming, Clear saved defaults.
- Interactive QR survivability test (Section 09). Producer can run a configurable stress test that simulates resize and JPEG passes against the resolved QR target, then reports a confidence verdict. (v1.5.1 adds an automatic version that runs at export time.)

**Changed**
- Persistent producer config and listing-session data more clearly separated in the UI (the underlying storage architecture from v1.4 is now surfaced as "Saved defaults").
- Slug auto-derivation made the central naming workflow rather than a secondary detail.

**Did not change**
- Core VIDP package model (audit.json, gallery, QR generation, image variants — all carry forward from v1.4).

---

## v1.4.0 — 2026-05-05

MLS recompression survival. Multi-variant deliverables.

**The problem this release solves**

Real-world testing of v1.3 deliveries through the Paragon → Zillow pipeline revealed that QR codes were being destroyed by the multi-step recompression chain. A buyer could see a VIDP-disclosed listing on Zillow but be unable to scan the QR — the verification mechanism failing precisely where it mattered most. v1.4 addresses this with a hardened MLS variant alongside the standard producer-controlled output. (v1.5.1 later extended the same approach to the standard variant for non-MLS surfaces that also recompress.)

**Added**
- **MLS Mode toggle** (default ON). Generates a second hardened variant of every delivered image alongside the standard output. Producer cannot adjust MLS settings — they're locked at values designed to survive Paragon, Matrix, Flexmls, Zillow, Realtor.com, Redfin, and other MLS/aggregator recompression chains. Settings: 5% pill, 10% QR, error correction Q (25% damage recovery), 100% opacity, 8% white quiet zone.
- **Pill size slider**. Range 1.5% to 8.0% of shorter image dimension, default 3.0%, 0.5% increments. Replaces the previous hardcoded 1.2% pill size which was too small to survive recompression and too small to be visible on full-resolution deliveries.
- **Pill stack direction** toggle (vertical or horizontal). Producer can choose how multiple pills arrange on the image. Vertical stacks (default) work well for portrait/square images; horizontal layouts save vertical space on wide aspect ratios common in land listings.
- **QR quiet zone padding**. Every QR now has white padding around it (6% of QR size for standard, 8% for MLS) to ensure scanners can identify the QR boundaries cleanly even after JPEG re-encoding artifacts blend the edges into the surrounding image.
- **Multi-variant output structure**. Delivered images now go to `delivered/standard/` (always) and `delivered/mls/` (when MLS Mode is ON). Producer chooses the right variant for each downstream use.

**Changed**
- QR size slider range expanded from 3-8% to 1-15%, allowing both tighter compositions and aggressive MLS-friendly sizing.
- Verification gallery now references `delivered/standard/` for the comparison slider (not the raw `delivered/` path).
- README.txt updated to explain both variants, when to use each, and why MLS variant exists.
- Audit.json schema extended with a `variants` block recording the settings used for each variant; `placement` block now records pill stack direction.

**Fixed**
- QR codes from v1.3 deliveries failing to scan after the Paragon → Zillow pipeline. Confirmed reproducible on production Zillow listings; v1.4's MLS variant resolves it for MLS-bound images.

**Spec implication**
- The MLS recompression survivability findings should make their way into a future spec revision (proposed §5.5 or addendum). Reference values: pill ≥5%, QR ≥10%, ECC level Q+, opacity 100%, white quiet zone ≥8%. Consolidated into v1.5.1 spec addendum below.

---

## v1.3.0 — 2026-05-03

Workflow improvements based on real-world production feedback.

**Added**
- "Start new listing" button at the top of Section 02 and after successful generation. Clears listing-specific data (uploaded images, address, MLS, agent, brokerage) while preserving producer info, storage URL, and pill placement settings. Confirmation prompt prevents accidental loss.
- Editable slug field. The slug is auto-derived from address + shoot date by default, but can be manually overridden when a listing needs a non-standard identifier (e.g., multi-variant listings, custom naming conventions). A "Reset to auto" link restores the derived value.
- Storage URL validation. The tool now refuses to proceed if the storage URL doesn't start with `http://` or `https://`. Inline error message appears next to the field. This prevents a class of silent failures where QR codes pointed to URLs that phones interpret as search queries instead of opening directly.
- Persistent settings across browser sessions. Storage URL, pill placement, opacity sliders, and JPEG quality now persist in localStorage and reload automatically the next time the tool opens.

**Changed**
- Slug now derives from the shoot date (Section 02) rather than the current date. Previously, a listing shot in April but processed in May would receive a `2026-05` slug; now it correctly receives `2026-04`. Falls back to current date if shoot date is empty.
- Updated Section 02 description to reflect the editable slug behavior.
- Default JPEG quality slider value adjusted from 92% to 95% (the size-cap encoder added in v1.1.0 will automatically reduce quality if needed to fit within the input file's size).

**Fixed**
- Slug field now displays the actual slug that will be used (override or auto-derived), not just the auto-derived value.

---

## v1.2.0 — 2026-05-02

**Added**
- Anonymous aggregate scan tracking. Every gallery generated by the tool fires a fire-and-forget POST to `vidp.org/api/scan` on page load. No cookies, no PII, no individual session tracking. Aggregated counters feed the public scan counter that will eventually launch on vidp.org. Producers can opt out by setting `window.VIDP_NO_TRACK = true` before the gallery script loads.

---

## v1.1.0 — 2026-05-02

Image preservation improvements.

**Added**
- `encodeWithSizeCap()` JPEG encoder that caps output file size at the source input size. Producers can now upload MLS-ready files (e.g., under 9.5 MB) with confidence that the composited output won't exceed the original file's size. The quality slider auto-tunes downward (in 5-point steps, floor at 70%) only when needed to stay within the size budget.

**Changed**
- Default JPEG quality raised from 92 to 95 (since the size cap is automatic).
- Quality slider label clarifies the auto-cap behavior.
- Gallery introduction copy is now placement-agnostic. Previous text "Color-coded pills above each image..." assumed a fixed placement; the tool actually allows producers to choose pill placement. New copy: "Color-coded pills disclose specific adjustments applied during post-production. Each pilled image is paired with a QR code linking to this verification record."

---

## v1.0.0 — 2026-04-21

Initial public release alongside vidp.org launch and VIDP specification v1.2.

**Includes**
- Producer info, listing details, storage URL, image upload (delivered + base), pill assignment per image, placement controls, JPEG quality, preview, and package generation.
- Full VIDP-compliant package output: gallery HTML with before/after comparison slider, audit.json, audit-summary.html, QR codes (SVG and PNG at 120/180/300px), README.txt.
- Browser-only: no upload, no server, no tracking. CC BY 4.0.
