refactor(landing): redesign sections below the hero
Give everything below the (unchanged) hero a cohesive radar/monitoring
visual language: shared app.css utilities (radar grid, signal pulse, hover
edge) and a reusable SectionEyebrow, applied across features, configurations,
statistics, screenshots, FAQ and the open-source banner.
Replace the five shaking metric cards with a grounded, full-width social-proof
band flush under the hero showing four rounded figures (users, active alerts,
alerts sent, auctions tracked) — approximate, never exact. Unify all sections
to max-w-5xl for consistent edges. Spec in docs/specs/landing-redesign.md.
feat(configurations): rank by intent using CPU benchmark scores
Rework /configurations so the highlighted "best deals" actually reflect
what they claim. The old queries had two concrete bugs — the D1 path
pre-filtered to the top-100 cheapest and dedupeed per-category inside
that biased sample, while the DuckDB fallback used `DISTINCT ON (cpu)
ORDER BY seen DESC` which kept a near-random row per CPU instead of
the cheapest. Neither path used the Geekbench scores that phase 2-3 of
the CPU enrichment work already populated.
Consolidate both paths behind a shared category module and swap the
five component-focused categories for six intent-focused ones:
best price/performance, most affordable (with a GB5 multicore floor to
exclude Atom-class chips), best €/core, best €/GB RAM, best €/TB NVMe,
and best €/TB bulk storage (SATA + HDD combined). Ranking happens in
SQL with ROW_NUMBER() partitioned on (cpu, ram_size, is_ecc, storage
shape), so variants of the same CPU can coexist when they genuinely
win different categories. Per-query failures no longer crash the page
loader; the DuckDB fallback takes over cleanly. A "snapshot updated"
timestamp and an optional GPU deep-link round out the page.
Spec at specs/configurations-rework.md captures the full rationale,
decisions, and open follow-ups (per-CPU and per-config landing pages
for SEO).
feat: enrich servers with CPU cores, threads, generation, and benchmark scores (#256)
* feat: enrich servers with CPU cores, threads, generation, and benchmark scores
Add CPU enrichment from Geekbench data for both auction and standard servers.
Enables filtering by core/thread count, sorting by CPU score, and displays
CPU details (cores/threads, architecture family, GB6 score) on server cards
and detail drawer.
- Add generate_cpu_specs.py to fetch and match Geekbench data
- Enrich auction servers in update_incremental.py via cpu-specs.json
- Enrich in CF Worker via AuctionDataTransformer.lookupCpuSpecs()
- D1 migration for cpu_cores, cpu_threads, cpu_generation, cpu_score columns
- Add cores/threads range sliders to filter UI
- Add CPU Score sort option
- Add CPU row to ServerFactSheet (both layouts)
- Add cpuCores/cpuThreads alert matching in MATCH_ALERTS_SQL
- Weekly GHA workflow to update cpu-specs.json from Geekbench
* fix: resolve CI failures for CPU enrichment
- Copy cpu-specs.json into worker/src/ instead of symlinking through
gitignored data/ directory
- Fix prettier formatting
* fix: resolve flaky Playwright tests
- landing.spec.ts: update text matchers to match current page content
("Dedicated Servers" not "Dedicated Server Auctions",
"check cloud availability" not "check cloud server availability")
- server-interactions.spec.ts: remove non-existent table lookup in
drawer, wait for loading state instead of arbitrary timeout
- advanced-filtering.spec.ts: replace networkidle + waitForTimeout with
waitForFilterUpdate helper that polls until count stabilizes
- fixtures.ts: add waitForFilterUpdate helper for reliable DuckDB waits
refactor(landing): redesign sections below the hero
Give everything below the (unchanged) hero a cohesive radar/monitoring
visual language: shared app.css utilities (radar grid, signal pulse, hover
edge) and a reusable SectionEyebrow, applied across features, configurations,
statistics, screenshots, FAQ and the open-source banner.
Replace the five shaking metric cards with a grounded, full-width social-proof
band flush under the hero showing four rounded figures (users, active alerts,
alerts sent, auctions tracked) — approximate, never exact. Unify all sections
to max-w-5xl for consistent edges. Spec in docs/specs/landing-redesign.md.
feat: enrich servers with CPU cores, threads, generation, and benchmark scores (#256)
* feat: enrich servers with CPU cores, threads, generation, and benchmark scores
Add CPU enrichment from Geekbench data for both auction and standard servers.
Enables filtering by core/thread count, sorting by CPU score, and displays
CPU details (cores/threads, architecture family, GB6 score) on server cards
and detail drawer.
- Add generate_cpu_specs.py to fetch and match Geekbench data
- Enrich auction servers in update_incremental.py via cpu-specs.json
- Enrich in CF Worker via AuctionDataTransformer.lookupCpuSpecs()
- D1 migration for cpu_cores, cpu_threads, cpu_generation, cpu_score columns
- Add cores/threads range sliders to filter UI
- Add CPU Score sort option
- Add CPU row to ServerFactSheet (both layouts)
- Add cpuCores/cpuThreads alert matching in MATCH_ALERTS_SQL
- Weekly GHA workflow to update cpu-specs.json from Geekbench
* fix: resolve CI failures for CPU enrichment
- Copy cpu-specs.json into worker/src/ instead of symlinking through
gitignored data/ directory
- Fix prettier formatting
* fix: resolve flaky Playwright tests
- landing.spec.ts: update text matchers to match current page content
("Dedicated Servers" not "Dedicated Server Auctions",
"check cloud availability" not "check cloud server availability")
- server-interactions.spec.ts: remove non-existent table lookup in
drawer, wait for loading state instead of arbitrary timeout
- advanced-filtering.spec.ts: replace networkidle + waitForTimeout with
waitForFilterUpdate helper that polls until count stabilizes
- fixtures.ts: add waitForFilterUpdate helper for reliable DuckDB waits