v1.12.0
4 May 2026
Pricing engine
Adaptive Bayesian shrinkage for thin segments
What changed
The pricing engine now applies per-segment shrinkage, tuned from observed
within-segment and between-segment variance. Common cars (lots of comparables) keep
their score. Rare cars (a handful of comparables) get pulled toward a sensible prior
instead of producing wild bargains-by-accident.
Why it matters
Before: one underpriced unicorn could drag the whole segment median, spawning
false "Steal" badges across thin slices of the market. After: scores
are quieter on thin data and louder where the data is genuinely strong.
Safety, privacy & data handling
No new data is collected. No new fields are exposed. The change reduces the
rate of falsely-loud "deal" badges, which lowers the surface for buyers being
lured into low-quality listings on price-signal alone. Defence in depth, not
a security fix per se.
v1.11.0
22 Apr 2026
Crawler · dedupe
Cross-platform de-duplication
What changed
Listings of the same physical car across different sources are now unified
into a single vehicle record. The matcher combines image fingerprints, normalised
contact matching, and structured spec match, with a "two signals or one strong +
identity" rule. About 1,300 same-car merges are live across sources.
Why it matters
The same Mercedes posted three times by three accounts used to count as
three cars in your search results, polluting price charts and inflating
the impression of supply. Now you see one vehicle, one timeline, the
lowest live price.
Safety, privacy & data handling
Image fingerprints are one-way perceptual hashes — the original
images are not retained as personal data. Contact normalisation operates only on what's
already publicly visible on a listing; no new personal data is collected,
and no new identifiers are stored. Single-signal merges are explicitly
forbidden, which lowers the chance of two unrelated cars being collapsed
into one record.
v1.10.3
9 Apr 2026
Matcher · data integrity
Body-type veto in the matcher
What changed
The matcher now hard-rejects merges where both sides have a known body type
and they differ — a coupe and a cabriolet can no longer be merged into
the same vehicle, regardless of how strongly other signals agree. The same
rule applies to fuel and colour. Pre-existing merges were re-checked; about
450 colour conflicts were auto-split in the same pass.
Why it matters
A Frankenstein price chart that flips between two unrelated cars was rare
but real. The vehicle record you read should belong to one physical car,
not a confusing average of two.
Safety, privacy & data handling
Strictly improves data integrity: some incorrect merges are removed, no
new merges are created. No new data collected. The buyer-visible effect is
cleaner price histories and slightly fewer collapsed listings — small,
measurable, in the right direction.
v1.10.0
18 Mar 2026
Pricing engine
Lemon flag (V × Q)
What changed
Deal scoring now decomposes into Value
(price relative to comps) and Quality
(everything else: photo count, mileage relative to age, description signals).
The two combine multiplicatively, so a low-quality listing can no longer
ride a low price to a "Steal" badge.
Why it matters
Akerlof's market for lemons, applied to a Cyprus car listing.
Cheap doesn't always mean good. The score now reflects that.
Safety, privacy & data handling
Scoring change only. No new data collected. Reduces the likelihood that
a buyer drives across the island for a "great deal" that's actually a
lemon shouting buy-me. Indirect safety improvement, not a privacy or
auth change.
v1.9.0
28 Feb 2026
Ingest · validation
Validation gate at the door
What changed
Every listing now passes through a strict validation gate before it
reaches the index. Future-dated model years, mileages beyond what a car
can physically survive, and descriptions that are nothing but a town
name are rejected at ingest, not patched up downstream.
Why it matters
Upstream parsers drift. Without a gate, weird records leak into search
results and price charts. The gate keeps the index honest even when an
upstream source briefly misbehaves.
Safety, privacy & data handling
Tighter input validation reduces the defensive logic downstream stages
have to carry, and cuts a class of malformed-data bugs at the boundary.
Defence in depth. No change to how data is stored or who can read it.
v1.8.0
2 Feb 2026
Ops · reliability
Watchdogs and quality floors
What changed
Daily jobs now have three independent health checks: did the artifact
change, is the success ratio within the rolling baseline, and did the
schedule actually fire. Exit codes are no longer the only signal.
Why it matters
Listings stay fresh because the index is monitored on outputs, not
on whether a script returned cleanly. A job that exits zero while
producing nothing useful no longer hides on a green dashboard.
Safety, privacy & data handling
Reliability layer only. No data added, exposed, or moved. Improves the
odds that the listing you see is actually current — the
unspoken contract for a car aggregator.
Older releases collapsed for brevity. Anything that touches authentication,
stored personal data, third-party integrations, or external endpoints
is documented at this level of detail by default; small bug fixes and
copy tweaks are not. If you're a security researcher and want a deeper
account of a specific change, contact the team.