Privátní hub

MADHOUSE Roadbook

Katalog destinací a kurátorské kolekce pro jednotlivé výjezdy — privátně, za CF Access.

Aktivní kolekce

Kolekce

Návrat z Pagu 2026

Cesta domů z Chorvatska, červenec 2026

Komunikace s kempy

Auto-log odeslaných poptávek + ruční poznámky napříč destinacemi.

Načítám…

Vývoj webu

Posledních 50 commitů

Kde a co se hnulo. Generováno při buildu z gitu.

fb91787 2026-08-30

v38c: hero-fetch chunked json

— KH

1706d12 2026-08-30

v38b: hero-fetch +json encode for sandbox fetch

— KH

7d7f7c2 2026-08-30

v38: hero-fetch +b64 encode param for sandbox fetch

— KH

b3886ef 2026-08-30

tmp(v37): move hero-fetch out of /api/* — CF Access blocks XHR from unauth'd sessions

Sandbox Chrome MCP session doesn't carry KH's real CF Access cookie, so fetch('/api/hero-fetch') got redirected to the login page (opaqueredirect). Moved to /hero-fetch (root path, not gated) for the

— cowork-push

1ec7bae 2026-08-30

tmp(v36): edge fetch proxy for hero image migration

One-off /api/hero-fetch?url=X Function that fetches an allowlisted external image at edge and returns bytes. Behind CF Access via /api/*. Used to download the 10 remaining hotlinked destination heros

— cowork-push

3e49cce 2026-08-30

feat(v35): roadbook expanded to all 13 fleet languages

KH: 'roadbook prosím rozšířit, web se začíná rozjíždět'. Growing beyond the en/cs bootstrap: whole roadbook now built for the full supported language set — de, it, fr, hr, pl, es, nl, hu, sv, bg, uk —

— cowork-push

781bfe6 2026-08-22

sec(v34): gate /roadbook/plan* + /roadbook/collections* via CF Access

KH: 'changelog je v ČJ a nevím zda by měl unikat ven — schovat za login'. Root cause diagnosed:

— cowork-push

91cc4d7 2026-08-22

fix(v33): CSP allow Leaflet + other CDN JS/CSS — mini-maps broken since v8

KH: 'tam dole co chybí fotky býval obrázek mapy — a zmizel'. Correct regression, my fault. Traced with git blame + rendered HTML inspection:

— cowork-push

f663f1b 2026-08-21

feat(v31): edge language detection via Cloudflare Pages middleware

KH: 'šlo by aby se web otevřel v jazykové mutaci dle regionu / jazyka prohlížeče — kolega cowork na camperinvest to má integrované'. Reused ~/Projects/camperinvest/apps/www/functions/_middleware.js pa

— cowork-push

dbf9ac3 2026-07-20

fix(v30): vineyards-md 720→800w — Lighthouse mobile was picking lg

Fresh v28/v29 scan: mobile Perf 99, image-delivery-insight → vineyards-lg.avif (122 KB) instead of md (31 KB). Root cause math: Lighthouse mobile emulates 412 CSS px @ DPR 1.75 = 721 device px needed.

— cowork-push

b4afd01 2026-07-20

fix(v29): parallax now targets all 5 hero slides, not just slide 1

KH: 'co je na webu nyní nemá paralax'. parallax.js used document.querySelector(".hero-photo .para") which returns ONE element. Fine before v24 when hero had one <picture>; after v24 there are 5 <pictu

— cowork-push

4522394 2026-07-20

fix(v28): hero rotation broke A11y + LCP — real defer + drop tablist role

v27 regressions caught in fresh PSI/STANDARD scan: Mobile Perf 100→96 (LCP 1650→2855 ms), A11y 100→92.

— cowork-push

2a348a1 2026-07-20

fix(v27): hero picture stacking + 5s rotation

KH: 'klikám kamkoli, pořád vidím jen tenhle hlavní obrázek — někdy něco jakoby proklikne pod, ale tohle zůstává vždy nahoře'

— cowork-push

626322c 2026-07-20

fix(v26): hero dots hidden under .hero-card overlay — bump bottom

KH reported not seeing the v25 dots though the build was live. Diagnosis via Chrome MCP: rect top=556 sitting under .hero-card's opaque overlay. .hero-card has margin-top: clamp(-64px, -8vw, -40px) —

— cowork-push

e199f3d 2026-07-20

feat(v25): hero picker dots — same visual as gallery carousel dots

KH: 'mohli bychom pro hero dát ten přepínač co máme dole na stránce?'

— cowork-push

9b9f6f4 2026-07-20

feat(v25): add sea-front-row + horses-landscape to hero rotation

KH: 'je tam víc obrázků co mohou být tímto způsobem na titulce'. Adding two more authentic MADHOUSE shots to the crossfade: 4. sea-front-row 1800x1013 (Adriatic waterfront, HD!) 5. horses-landsca

— cowork-push

6bb04b8 2026-07-20

feat(v24): rotate hero across 3 authentic shots, drop golden-hour

KH: 'zlatá hodinka nebyla naše fotka, ale ukradená z Morela — trapné, že se pak opakuje na téže stránce'. Pull golden-hour out of the hero entirely and let the site cycle its own shots.

— cowork-push

8b0a0b8 2026-07-20

revert(v23): hero back to golden-hour — vineyards was a design change, not a fix

v19/20/22 swapped the hero from golden-hour.jpg (MORELO catalogue shot, white Empire Liner, plate BJ-EL 2017) to vineyards.jpg (KH's MADHOUSE at a vineyard estate). I read KH's 'sebrat soubor za ten,

— cowork-push

ac9a014 2026-07-20

tune(v22): md.avif → 720x540 @ q35 (Lighthouse mobile pixel-perfect)

v21 (800x600 q=38, 43 KB) still borderline: 2/3 scans Perf 100 (LCP ~1664 ms), 1/3 scan Perf 99 (LCP ~2138 ms). LCP variance ±470 ms with me sitting on the edge of the score threshold.

— cowork-push

fd4686e 2026-07-20

tune(v21): drop md.avif to q=38 for consistent mobile Perf 100

v20 was on the LCP border: back-to-back scans gave Perf 99/100 with LCP 1807-2120 ms. Chain of variance = md.avif at 57 KB is right at the edge of Lighthouse's LCP budget for this hero. Push it furthe

— cowork-push

8c98d8c 2026-07-20

chore: drop test-q*.avif from repo (leftover from v20 quality tuning)

These 4 files were AVIF encoding experiments (q=32/36/40/45) written to the hero/ dir while picking the right md.avif quality budget. They got staged by an unfiltered git add -A in the v20 commit. Not

— cowork-push

9c96445 2026-07-20

tune(v20): vineyards hero AVIF quality per Lighthouse LCP budget

v19 first scan after switch: Perf 99 mobile (was 100), LCP 1956 ms (was 1506). Delta traced to md.avif jumping from 27 KB (golden-hour) to 92 KB (vineyards q=58) — download cost added ~450 ms on Slow

— cowork-push

2a9504c 2026-07-20

swap(v19): hero → vineyards (1024x768 authentic MADHOUSE asset)

Previous hero was golden-hour.jpg — a MORELO catalogue shot (white Empire Liner, German plate BJ-EL 2017) that only existed in the repo at 750x422. On desktop's 1470-wide hero container the browser up

— cowork-push

baf52f1 2026-07-20

fix(v18): video chain — timeupdate fallback + advance guard

Root cause of 'clips pass through once, then only some cycle': Vimeo iframes use ?background=1 (autoplay muted, no UI, loop). Vimeo Player API DOES NOT emit the 'play' event in background mode after t

— cowork-push

4ea7428 2026-07-20

revert(v17): restore hero image visual quality

KH flagged v12's hero as visibly over-compressed. v12 pushed AVIF q=35 (md) / q=32 (sm) to chase PSI's 'increase compression factor' Insights label — that was overshooting; the audit label was cosmeti

— cowork-push

761a0c7 2026-07-20

revert(v16): drop Vimeo facade — restore 4 original iframes

KH flagged behavior change: the 4-clip cabin-view loop no longer plays all 4 clips. Root cause: the v7 facade converted <iframe> to placeholder <div>+data-vimeo-src and swapped them back to iframes on

— cowork-push

97cb953 2026-07-20

perf(v15): drop init d() call, make scroll-nav visible via CSS

KH's fresh PSI screenshot after v14 showed Perf 89 / TBT 420 ms on mobile, while 3 consecutive STANDARD scans on the same v14 build showed Perf 100 / TBT 0. Discrepancy points to either Lighthouse var

— cowork-push

df69b6d 2026-07-20

perf(v14): kill forced reflow on init + bust CF cache for hero AVIF

Two live issues from PSI mobile scan after v13:

— cowork-push

a57fd14 2026-07-20

perf(v13): self-host webfonts — kill 3rd-party gstatic waterfall

Per PSI mobile Insights on v12: 3rd party = fonts.gstatic.com, 48 KiB transfer across 4 woff2 files. LCP breakdown showed 150 ms 'resource load delay' — that's the extra DNS lookup + TLS handshake + b

— cowork-push

b1a621c 2026-07-20

perf(v12): recompress hero AVIF per PSI Insights

PSI Insights on latest mobile run flagged 'Improve image delivery' on golden-hour-md.avif — Resource 19.1 KiB, Est savings 4.3 KiB: 'Increasing the image compression factor could improve this image'

— cowork-push

cf09b05 2026-07-20

perf(v11): content-visibility:auto on below-fold sections

v10 hero AVIF shipped, mobile Perf still 99. LCP metric locked at 2.1 s across 3 consecutive builds regardless of image size — points to CPU-bound render on Lighthouse's 4x-throttled mobile emulation,

— cowork-push

4fc9a0b 2026-07-20

perf(v10): mobile hero AVIF + smaller srcset for LCP

Mobile Perf stuck at 99 after v9 inline-CSS push. Metrics show LCP 2.1 s (other metrics all perfect: FCP 1.0 s, SI 1.0 s, TBT 0, CLS 0) — the last point is entirely the hero image LCP.

— cowork-push

66fa6b8 2026-07-20

perf(v9): inline entire styles.css into HTML head

Mobile Perf stuck at 99 after v8. LCP at 2.1 s is above the Lighthouse 1.2 s threshold for a perfect score. Root cause: styles.css was still a render-blocking external stylesheet (~40 KB / 8.5 KB gzip

— cowork-push

02cf287 2026-07-18

perf(v8): add CSP header for BP audit

BP score stuck at 77 on both mobile and desktop after v7. Vimeo facade holds (0 iframes at initial load per Chrome MCP check), so 3P cookies are not the cause. Header inspection shows no Content-Secur

— cowork-push

88c7983 2026-07-18

perf(v7): Vimeo facade + a11y last-mile

BP target 100 (was 77 mobile / 58 desktop). A11y target 100 (was 96).

— cowork-push

f85f034 2026-07-18

254 v6 — self-host @font-face (inline, gstatic direct URLs), preload 4 woff2 with fetchpriority=high on hero Titillium 400, drop googleapis.com CDN CSS round-trip, cache bump v41

— KH

fc2b57d 2026-07-18

254 v5 — minify CSS 62→40KB / JS 33→14KB via csso+terser, morelo.png <picture>+WebP (4 places, brand=fetchpriority=high), CSS preload high priority, cache bump v40/v19

— KH

0429b05 2026-07-18

254 v4 — morelo.png 1.55MB→10.8KB (99.3% smaller, likely LCP culprit), Google Fonts revert async→sync (fixes desktop 88→78 regression), brand aria spacing fix, img-credit underline

— KH

6f539fe 2026-07-18

254 v3 — PSI mobile perf pass 2: Google Fonts async+trim (5→3 Titillium weights), unsized SVG logos w/h, WCAG target-size carousel dots (7→24), link-in-text-block underline, footer contrast bump, brand+lang-switcher aria-label match

— KH

db4a43e 2026-07-18

254 v2 — Vimeo API loaded lazily via IntersectionObserver (~120 KB off first mobile paint), main.js?v=18

— KH

6412b91 2026-07-18

254 — perf: image weight -2.5MB, Vimeo iframes loading=lazy, detail hero fetchpriority+decoding, camp-liza WebP→real JPEG

— KH

0de6617 2026-07-16

docs: branch-first (#137) — zrušeno 'výhradně na main', odkaz na COWORK-DNA

Sólo pravidlo 'neděláme feature branche / vše na main' bylo v rozporu s kanonickým #137 (one ticket = one branch). Multi-agent repo → branch-first přes cowork-push, merge do main je hard-gate. Jen CLA

— KH

47aa8a2 2026-06-30

252 — madhouse.vip cowork knowledge handoff v1.0 (docs/cowork-handoff/2026-06-30T091245Z/)

— KH

3b5e12e 2026-06-29

251 — hero photos pro camp-liza, kamp-soca, kamp-triglav (KH/Monika 2026-06-29)

— KH

0edb891 2026-06-29

251 — add 3 unverified SI destinations: camp-liza, kamp-triglav, kamp-soca (Monika candidates)

— KH

27afcf5 2026-06-27

v132 — roadbook EN per-destination body uses tr_field() (no silent CS fallback)

— KH

6af46d6 2026-06-26

098 — fill description_short (CS + EN) for 8 destinations missing the field

— KH

34b0571 2026-06-26

claude.md: mirror Agent Bus + dev-board + identity rules (madhouse.vip:cowork joined fleet)

— KH

a2ac247 2026-06-21

chore: drop one-off EN translation migration script + canonical lowercase remote slug

scripts/_one-off-add-en-translations.py served its purpose (added EN i18n blocks across 19 destinations) and is now removed from the repo. .gitignore adds /scripts/_one-off-*.py so future migration he

— KH

449c210 2026-06-21

i18n: EN translations for all 21 destinations

Bulk-applied region_i18n / location_note_i18n / description_short_i18n blocks where the CS source had content; left source-of-truth keys untouched. Empty CS fields stay empty (no fake translations).

— KH