Issue 01·Pattaya Coffee··Anonymous Customers·Paid Bills·No Comps
// Build Log · Issue 01

What we’ve shipped.

Every version since this site began. The build log of an empire in eight rounds.

v2.23
SEO push — the 2026 shortlist article + Issue 02 watchlist
· current
  • New flagship article — “The Best Coffee Shops in Pattaya, 2026” leads the guide series: the ranked shortlist in article form, with quick answers, FAQ schema, and an ItemList of the top ten.
  • Issue 02 watchlist — eight cafes other lists rank and we don’t yet (BRU, XIN, Kissaten, GIM Brewing Room, North Roasters, Common Café, Good Morning Katfé, Sunny Brew) each get a public research entry at /issue/02-watchlist.
  • Homepage — “Best of 2026” takes a core Explore tile; the compare duel moves into More routes.
  • Guide series — now eleven articles; reading order, rel prev/next, TOC, and ItemList regenerate from one list.
v2.22
Mobile fix — cafe profiles no longer hidden in a fold
  • Critical mobile bug — on 29 of 30 cafe pages the section after the hero is the whole profile; the mobile rank-notice fold was collapsing all of it behind one closed accordion.
  • Fix — the fold now only wraps a true banner (no info-grid/brief/actions inside); profile content renders directly on phones.
v2.21
Cafe profile redesign — one designed column
  • Fact chips — info grid rebuilt as individual cards; the broken empty-cell void and run-on “View on map” text are gone.
  • Unverified collapsed — three “Unconfirmed” cells become one honest muted chip; Area no longer shows a street address.
  • Visit brief designed — the raw auditor playbook dump is now a card with mono section labels and a numbered checklist grid.
  • Page rhythm — every cafe section shares the same centered 880px measure; headings drop to article scale; hero meta loses its orphan separator.
v2.20
Fold summaries pass AA — last mobile contrast fix
  • Collapse folds — mobile ux-collapse summaries (rank fold, about folds, quick jumps) move from --accent (3.17:1) to --accent-ink.
  • Homepage Explore — same ink applied to the “more hubs” summary for consistency.
v2.19
AA contrast pass — hub manifesto + mobile dock
  • Hub manifesto — intro/pillar panels were rendering dark text on the dark editorial card; now light-on-dark as designed.
  • Mobile dock — label color darkened from --fg-3 (4.35:1) to --fg-2; active state uses --accent-ink.
v1.57
Directory grid fix + Thai guide inlinks
  • Layout — closed unclosed hub-intro wrappers on area/vibe/roaster hubs so listing grids align with the manifesto column.
  • CSS — global .listing-grid and guide Thai-note styles in site.css (no more one-off inline rails).
  • Thai SEO — full cross-link nav on all 10 /th/guide/ articles; index nav lists every stub.
  • Build guardvalidateDirectoryLayout blocks listing-grid inside hub-intro.
v1.56
Fix — directory listing layout on /coffee/
  • Layout.listing now shares the same centered --max rail as tier entries; manifesto + intro copy sit in a two-column grid on desktop.
  • Network strip — moved inside hub-intro on The 30 index; styled via site.css instead of inline widths that floated left.
  • Hero — extra top padding on directory heroes so the title clears the sticky nav.
v1.55
Hotfix — desk panel duplication on cafe pages
  • Fixed sync-desk-panel-v146 regex that stopped at the first </div> and stacked ~18 copies of the desk-research notice on each cafe page.
  • Repaired corrupted info grids on 29 cafe pages; one desk panel + full Area/Address/Bean grid restored.
  • Build guard — desk panel count must be exactly one per cafe; fails build if duplicates return.
  • Authority credit — footer “Built & Maintained by” links use the case study URL across the site (121 pages).
v1.54
Hotfix — remove broken homepage visa strip
  • Removed orphan visa-context paragraph above the hero (unstyled, malformed Visa Help URLs).
  • Build guardvalidateHomepageIntegrity blocks that pattern from shipping again.
  • Guide only — one contextual DTV link in work-from-cafe where nomads actually read it.
v1.53
Thai guide series complete — 10/10 stubs + feed discovery
  • Thai guides 7–10 — scene, glossary, specialty 101, tasting stubs at /th/guide/{slug}.
  • hreflang — all ten English guides + guide index point at Thai summaries.
  • Subscribe block — homepage links JSON Feed, RSS, Atom, Thai guides, and llms.txt.
v1.53
14-site network mesh + /now Issue 02 prep
  • Network — Footer credits point at Pattaya Authority case study; full 14-property sister list aligned with TimPaemi network deploy.
  • /now — Issue 02 prep documents live cross-links (Authority, Villa Stream, visa, gym, etc.).
  • IndexNow — Sitemap ping on every production build.
v1.51
Thai JSON-LD, 6 guide stubs, TOP30 hreflang fix
  • JSON-LD — WebPage + BreadcrumbList on every /th/coffee/* and /th/guide/* page.
  • TOP30 fix — ranks 17–30 English cafe pages now get hreflang="th" and discover-more Thai links (was stuck at TOP16).
  • Thai guides +3 — how-to-order, iced coffee in heat, Beach Road walking tour stubs.
  • GSC stubnpm run gsc-ingest for export CSV or future API creds.
v1.50
Thai 30 — complete directory mirror (ranks 17–30 research)
  • Thai 17–30 — fourteen research-candidate stubs at /th/coffee/{id}.
  • Full mirror/th/coffee/ lists all three tiers; hreflang on every English cafe page.
  • Research inlinks — coffee index #17–#30 strip links to Thai summaries.
v1.49
Thai 1–16 — full published-preview mirror + inlink pass
  • Thai cafes 6–16 — eleven new /th/coffee/{id} stubs for published previews (Benjamit → Secret).
  • Directory inlinks — coffee index, guides, and hreflang on all rank 1–16 English cafe pages.
  • llms.txt — Thai section documents ranks 1–16 coverage.
v1.48
Thai expansion — top 5 cafes, guide stubs, llms hubs, weekly desk CI
  • Thai top 5/th/coffee/{id} stubs for ranks 1–5 with hreflang on English cafe pages.
  • Thai guides/th/guide/ index plus three summary stubs linking to full English articles.
  • llms.txt — SEO hub URLs, Thai entry, and npm run ops loop documented for AI crawlers.
  • Desk enrich workflow — Monday scheduled GitHub Action runs ops + build (warns if tree is dirty).
v1.47
Internal linking — hub index, vanity compare URLs, weak inlink fix
  • Hub index/hub/ landing links work-friendly, garden, and Beach Road shortlists.
  • Contextual links — homepage, coffee index, vibes, guides, compare, and Thai entry now point at hub pages (fixes zero-inlink hubs in SEO audit).
  • Compare vanity — featured strip surfaces /compare/albatross-vs-nitan and three sibling vanity URLs from _redirects.
v1.46
Autonomous ops — desk research, hubs, Thai entry, network intent
  • Desk pipelinedesk-research-enrich syncs data/index.json; provenance panels on all 30 cafe pages; visit briefs in _research/briefs/.
  • SEO hubs/hub/work-friendly-cafes, /hub/garden-cafes, /hub/beach-road-coffee (programmatic from vibe/area data).
  • Thai/th/ and /th/coffee/ with hreflang on homepage.
  • Compare vanity URLs — four /compare/* redirects in _redirects.
  • Network — Pattaya Authority intent strip on key guides + coffee index; npm run ops runs before every build.
v1.44
Editorial alignment pass — unified rail, directory layout
  • Layout — directory heroes and listings left-aligned on desktop (same rail as cafe pages); hero max-width unified to --max (was --max-wide on some hubs).
  • Cafe pages — hero, body, and tail share --max-narrow so copy and cards line up.
  • The 30 index — manifesto block uses .hub-intro / .hub-body; tier notes use .tier-note; flush breadcrumbs sitewide.
v1.43
Custom 404 on unknown URLs + utility head cleanup
  • Edge_redirects catch-all /* → /404.html 404 so random paths get the styled Pattaya Coffee 404 (not Cloudflare generic).
  • Utility pages — removed duplicate site.css on 404.html and offline.html; build validates a single stylesheet link.
v1.42
Content design pass — cafe rail, hub intros, fix async CSS
  • Bug fix — six hub index pages loaded site.css with media="print" (unstyled flash); restored blocking stylesheet.
  • Cafe pages — shared styles in site.css; body.page-cafe left-aligned editorial rail; unified .cafe-tail-panel (rank nav + explore chips + quick links); upgraded info grid.
  • Hub / directory.hub-intro + .hub-body on roaster, area, vibe, and coffee index pages; manifesto + prose aligned to --max-narrow.
  • Nav — slightly larger, heavier primary links for readability on wide screens.
v1.41
Lighthouse pass — self-hosted fonts, perf head, contrast fixes
  • Performance — Google Fonts removed; latin woff2 under /fonts/; @font-face bundled into site.css at build; defer on site.js; speculation rules prerender removed; homepage JSON-LD moved before </body>.
  • Accessibility — drawer inert on homepage; hero/cafe eyebrow AA contrast; footer network link underline; Issue 02 block uses shared classes.
  • CSP — self-hosted fonts only; Cloudflare Web Analytics allowed in script-src (fixes console/CSP noise on Pages).
  • Toolingsync-post-v141.mjs, validatePerfHead, SW network-first /fonts/*.
v1.40
Audit pass — utility DOM fix, ai.txt, sync chain trim
  • Bug fix — 404/offline missing </div> before </main> (invalid HTML from v1.39 utility sync).
  • SEO / AI — map OG alt: 30 cafes; /.well-known/ai.txt + redirect to /llms.txt.
  • Toolingsync-post-v140.mjs replaces duplicate SW tail steps; AUDIT.md records site health.
  • Build — utility pages must close wrapper before </main>.
v1.39
Utility pages, SW asset strategy, adjacent prefetch, share fallback
  • 404 / offlinepage-utility layout on site.css?v=139; brand bar; Beach Road tour on 404.
  • Service worker — network-first /assets/* with unversioned fallback; precache /404.
  • Cafe pagesrel="prefetch" for prev/next rank in The 30.
  • PWA UX — reload banner when a new SW installs; share buttons copy URL when Web Share unavailable.
  • BuildvalidateUtilityPages, validateCafePrefetch, validateSwAssetFetch.
v1.38
Footer shell, versioned precache, prose + PWA tour shortcut
  • Footer.ftr-inner wraps grid, network, trust, and bottom bar; trust pills and copyright row center on wide screens.
  • SW — precache site.css?v=138 + legacy paths; site-version.mjs single source for release + build checks.
  • llms.txt — eight compare duels, .cafe-tail layout, PNG research OG accuracy.
  • PWA — manifest shortcut for Beach Road map tour (/map?walk=beach-road).
  • Lighthouse CI — audits research cafe koons-cafe for layout regression.
v1.37
Cafe tail layout — rank nav, explore strip, footer centering
  • Cafe pages.cafe-tail wraps rank nav, explore strip, and quick links inside <main> with centered max-width.
  • Footer — grid, network block, trust pills, and bottom bar share a centered shell on wide viewports.
  • Cache bustsite.css?v=137 / site.js?v=137 so returning visitors pick up layout CSS after SW update.
v1.36
Deep pass — PNG research OG, map tour UX, SW precache, prose validation
  • Research OG PNGsharp rasterizes per-cafe SVGs for social crawlers; meta prefers .png.
  • Map tour — Beach Road polyline, first-stop popup, list filter, copy-link button, mobile pan-to-pin.
  • Compare — single 8-duel strip; shared compare-duels.mjs.
  • Masthead JSON-LD — full network sameAs; eleven-platform bio.
  • SW — auto-generated precache (~70 URLs incl. research OG + tour map).
  • BuildvalidateNetworkProse(), validateSwPrecache(); humans.txt tagline.
  • Thai — lang notice on Thai coffee guide; reciprocal hreflang.
v1.35
Network prose sync, research OG, map tour, compare + mobile
  • Press + llms + manifest — eleven-platform copy; Villa Stream naming; tagline in llms.txt and PWA description.
  • JSON-LD — guide/colophon publisher gets slogan + network sameAs from network-footer.mjs.
  • Research OG — per-cafe /og/research/{id}.svg (14 files); build validates assets.
  • Compare — two featured duels (work-friendly #01 vs #14, central #14 vs #09).
  • Map?walk=beach-road filters Beach Road tour stops; guide links to map.
  • Issue 02 — roadmap block on /now; homepage manifesto hook when scorecards file.
  • Mobile — footer network grid, info-grid, compare featured stack at narrow widths.
  • OpsNETWORK.md Cloudflare table; Lighthouse URLs; sister rollout + Albatross audit checklists in _research/.
  • Thaihreflang="th" stub → Thai coffee guide article.
v1.34
Pattaya Authority network footer — 11 platforms
  • Network taglineBuilt in Pattaya. For Pattaya. under the wordmark on every footer; network section headline uses the same line.
  • Sister-site grid — 10 links (excludes this site): Authority, TimPaemi, Restaurant, Visa, Gym, School, Villa Stream, Medical, PattayaPets, Vehicle Rentals; all target="_blank" rel="noopener noreferrer".
  • Removed — self-link in grid; renamed Pattaya Stream → Pattaya Villa Stream.
  • JSON-LDslogan + expanded sameAs on homepage Organization / WebSite publisher.
  • BuildvalidateNetworkFooter(); scripts/sync-network-footer-v134.mjs.
v1.33
Desktop layout fix + cafe info-grid repair
  • Bug fixsync-cafe-pages-v128 info-grid regex stopped at the first </div>, duplicating Address/Vibe fields on 29 cafe pages; repaired via repair-cafe-info-grid.mjs.
  • Desktop layout — centered content rails on cafe pages, hub subsites, and homepage manifesto; prose max-width on audit blocks.
  • BuildvalidateCafeInfoGrid() catches orphaned info-items before deploy.
v1.32
Full audit desk pass — sitemaps, guide series, hub indexes, research OG
  • Sitemaps — build regenerates sitemap.xml, sitemap-pages.xml, sitemap-images.xml (30 cafes + guide), and sitemap-index.xml with fresh lastmod; parity gate vs filesystem.
  • Guide — reading-order TOC on guide/index, ItemList JSON-LD, guide-series-nav on all ten articles, head rel=prev/next enforced (SYNC:guide-series).
  • Hub indexes — area/vibe/roaster index pages get cross-cutting compare duels (SYNC:hub-compare).
  • Research OG — ranks 17–30 use /og/research-candidate.png (distinct share card caption); homepage SheeVa line de-scored.
  • CSS.guide-series-nav, .guide-toc; masthead legibility on small screens.
  • Lighthouse CI/compare, /guide/, and mobile guide URL added to audit matrix.
  • Editorial honesty — SheeVa/Ratio de-scored in data and copy; compare labels cross-source ratings; validateEditorialTaglines() blocks taglines that lead with Google stars.
v1.31
Vibe/roaster hub compares; homepage explore strip
  • Vibe + roaster pages — twelve rank-based compare links in hub tools (SYNC:hub-compare).
  • Homepage — explore strip linking top guides + #01 vs #02 compare (SYNC:home-hub).
  • guide/index — directory hub strip; validateVibeRoasterHubCompare() in build.
v1.30
Area hub compares + opening hours in JSON-LD
  • Area pages — compare duel links in hub tools regenerated from rank pairs (SYNC:hub-compare markers).
  • JSON-LD — uniform openingHoursSpecification merged into CafeOrCoffeeShop; redundant per-day scripts removed on published cafes.
  • BuildvalidateAreaHubCompare(); sync-seo-v130.mjs supersedes v129 in npm run sync-data.
v1.29
Cafe JSON-LD from data; compare duels synced
  • JSON-LDCafeOrCoffeeShop blocks regenerated from data (geo, address, price tier); removed unaudited aggregateRating on Nitan.
  • compare.html — six featured duels derived from current ranks (SYNC:duels markers).
  • BuildvalidateCafeLdGeo() and validateCompareDuels(); part of npm run sync-data.
v1.28
Cafe pages synced from data; meta/nav build gate
  • 30 cafe pages — meta description, dek, hero meta, info-grid, rank nav, rel=prev/next, and compare links regenerated from data/index.json.
  • BuildvalidateCafePageSync() fails if page meta or adjacent-rank links drift from data.
  • Scriptnode scripts/sync-cafe-pages-v128.mjs after data edits (run after index sync).
v1.27
Coffee index synced from data; rank build gate
  • coffee/index.html — all 30 tier entries regenerated from data/index.json (taglines, areas, beans, vibes); SYNC:* markers for safe re-runs.
  • BuildvalidateCoffeeIndexRanks() fails if directory ranks drift from data.
  • HTML fix — research tier entry-list properly closed before chains section.
  • Scriptnode scripts/sync-coffee-index-v127.mjs after data edits.
v1.26
Data alignment, research truth pass, build tier gate
  • data/index.jsonpublished_previews / research_candidates / audit_queue; area_slug per cafe; tier/status enforced by rank.
  • BuildvalidateTierAlignment() fails deploy if meta or tiers drift from ranks 1–16 / 17–30.
  • Research copy — removed wrong “Naklua needed a pin” refuse line on Jomtien and other areas; area-accurate hooks.
  • /now — fixed audit timeline (Nitan is Banglamung, not Naklua); page count 76; linked cafe names.
  • coffee/index.html — repaired broken entry markup (#06–12); removed false “Auditing” tag on King of Coffee.
  • Area ItemLists — JSON-LD regenerated from data/index.json per neighbourhood.
  • Drawer — Map, Compare, Now in mobile nav; standards scorecard filing section.
v1.25
Area hubs, four-step breadcrumbs, compare duels, topnav Map/Compare
  • Topnav — Map and Compare added sitewide after The 30.
  • Cafe breadcrumbs — JSON-LD and HTML crumbs now include neighbourhood (Home → The 30 → area → cafe).
  • Compare — six featured duel links above the picker; cafe explore strips link to adjacent rank (vs #NN).
  • Area / vibe / roasterhub-tools strips with map, compare, and area-specific duel URLs; schema URLs normalized to absolute.
  • Head cleanup — duplicate rel="next" removed on cafe pages.
v1.24
SEO crawl chain, rank navigation, directory hubs
  • Cafe pages (30)rel="prev"/rel="next" by rank; rank-nav + discover-more explore strips (map, compare, area, roaster, vibe, guide).
  • Hub tools — map/compare/coffee index + guide index directory strips; search quick-jump links; corrections explore block.
  • Guides (10) — serial prev/next in <head> for crawl order.
  • Homepage JSON-LD — full 30-item ItemList; expanded SiteNavigationElement; valid FAQ text (no HTML in schema).
  • CSS.rank-nav, .discover-more, .hub-tools in site.css.
v1.23
Corrections page, published-tier play blocks, audit meta
  • /corrections — public log shell; footer link sitewide; standards + masthead cross-links.
  • #06–16 — pre-audit play blocks on all strong-candidate pages.
  • Datameta.scorecards_filed, audit_wave; ranks #01–05 tagged top-contender.
  • Field kit_research/visit-checklist.md; scorecard CLI syncs filed count.
  • Map — twitter alt fixed to 30-cafe shortlist.
v1.22
Audit ops: scorecard CLI, area kills, top-five play blocks, copy truth pass
  • Scorecard workflowscripts/file-scorecard.mjs + _research/scorecard-template.md; npm run scorecard alias.
  • Top contenders #02–05 — pre-audit play / best-for blocks (Nitan, Sunset, Backstreet, SheeVa).
  • Five area hubs — audit-kill after neighbourhood essays (matches vibe pages).
  • Truth pass — RSS launch item, Co & Café #30 copy, /now open questions, COPY_VOICE.md, standards date, internal research docs.
v1.21
Office manifestos, research refuse blocks, vibe kills, footer v1.21
  • Research candidates #17–30 — What we refuse to pretend on every longlist file; Bake n' Brew borderline gets explicit demotion language.
  • Six vibe essays — audit-kill footer on each filter page after the prose block.
  • Office pages — manifesto blocks on press, masthead, feedback, colophon, privacy, standards, now, search, issues.
  • Albatross — play / best-for / FAQ disclaimers; press kit corrected to thirty cafes, zero scorecards.
  • Sitewide — footer version bumped from v1.14 to v1.21.
v1.20
Guide manifestos, published-tier audit structure, homepage strike
  • Ten guide articles — dark manifesto block at top of each (order, work, specialty, Thai, prices, tasting, heat, walking tour, glossary, scene).
  • Published previews #06–16 — unified What we refuse / What the audit will decide / audit-kill structure (replaces duplicate audit-checks boilerplate).
  • Homepage — Thirty files / zero verdicts manifesto; Today's Brew limited to sixteen published previews.
  • Albatross — room notes carry audit-kill honesty on unverified cross-source copy.
v1.19
Filter manifestos, Albatross verdict intensity, standards demotions
  • Manifesto blocks — all six /vibe/ pages, three /roaster/ pages, five /area/ pages (plus index lede sharpened), /compare.
  • Albatross — verdict, scorecard deck, and editor's note blockquote hardened for zero-scorecard honesty.
  • Masthead + feedback — 30 shortlisted / 0 scorecards; closed-shortlist and no-comps owner copy.
  • Standards — new section on demotions, removals, and research kills.
v1.18
Published-tier intensity — top five briefs, audit-kill lines, hub manifestos
  • Top five cafe pages — Backstreet, SheeVa, Sunset, Nitan stubs replaced with full pre-audit briefs (found / pretend / audit / kill structure).
  • Published previews #06–16 — audit-kill block before every provisional order line.
  • Research tier #17–25 — batch intensified via build script; h3 structure on remaining candidates.
  • Albatross — pre-audit banner: rank #01, zero scorecard filed.
  • Hubs — directory tier warnings, guide + area manifestos, search/now/standards/scene copy sharpened.
v1.17
Heavy editorial pass — manifesto blocks, audit intensity, Issue 02 reframed
  • Manifesto blocks — dark .manifesto-block on /coffee/ and /map; directory stats now show 0 scorecards filed.
  • Sharper hub copy — homepage letter, pull quote, flagship deck, /now "contract" section, /standards opener, /compare lede, research-tier warning on directory.
  • Research briefs intensified — Co & Café, Rescue, Chao Doi, O'Delices, Bake n' Brew audit notices use What we found / What we refuse / What kills structure.
  • Issue archive — Issue 02 reframed as the scored edition (Issue 01 closed the shortlist at 30).
  • CSS.audit-notice h3, .audit-kill in site.css.
v1.16
Complete 30-cafe research shortlist
  • Co & Café Pratumnak (#30) — editorial gap-fill for the Pratumnak hill; thinnest signal on the full thirty, explicitly marked research candidate.
  • Directory index — HTML list now includes ranks 26–30 (Bake n' Brew, Chao Doi, Rescue, O'Delices, Co & Café); ItemList numberOfItems: 30.
  • Stale counts fixed — homepage, map, compare, /now, /issue, feeds, and area hubs updated from 25/29 to 30 (16 published + 14 research).
  • data/index.json — 30 records; meta.total_count and shortlist_count aligned.
  • Service worker v1.16 — precache /coffee/co-cafe-pratumnak.
v1.13
Editorial content build · Google Analytics removed · navigation unified
  • Google Analytics removed — the GA4 tag (G-W0R491DR95) added in v1.12 is gone from every page, and the Content-Security-Policy no longer allows Google domains. Every "no third-party trackers / no Google Analytics" line on /privacy, /standards, /colophon and the footer trust badge is true again.
  • ~17,000 words of new editorial content — eleven cafe pages rebuilt from four-sentence stubs into full research briefs; six new guide articles (what specialty coffee is, Thai coffee, working from a cafe, prices, tasting, coffee in the heat); neighbourhood essays on all five /area pages; editorial essays on the six /vibe and three /roaster pages and the three section landing pages.
  • Nine research-candidate cafe pages added — Atelier, Passion Kaffe, Aftertaste, Tree Tales, Seaweed, Koon's, Summer House, Paboon, Loaf. Honest longlist pages, marked clearly below the published sixteen and carrying the research's own skepticism. The directory grew 55 → 70 pages.
  • Audit fixes — repaired an orphaned duplicate network grid in the footer of 53 pages, a corrupted homepage og:description, a truncated manifest.json, the /coffee/ ItemList count, per-cafe schema images, and the robots meta directive site-wide.
  • Pre-deploy QA sweep — de-duplicated the /guide breadcrumb, trimmed six over-long meta descriptions, and completed missing Open Graph tags on /404, /offline, /feedback and /press.
  • Navigation unified — the site had drifted into seven nav-bar variants, several linking to dead homepage anchors. All 70 pages now share one canonical navigation and one drawer.
  • Code & performance audit — full review of the CSS, JS, service worker and build script; render-blocking-font and script-defer optimisations logged for testing before a future release.
  • Service worker v1.13 — precache list extended with the six new guide articles; cache bust to ship this round.
  • Discovery tools — search, compare, and map label research candidates (ranks 17–25) distinctly from the published sixteen; compare adds scorecard status row and smarter hours display.
  • Build gatedata/index.json ↔ HTML sync errors now fail the build; npm run validate alias added.
  • /now and /issue counts updated for 70 pages and the 25-cafe shortlist.
v1.15
Complete 29-cafe research shortlist
  • Four new research-candidate pages — Bake n' Brew (#26), Chao Doi Coffee (#27), Rescue Coffee (#28), O'Delices Bakery Jomtien (#29). Cross-sourced set from editorial research; slot #30 filed in v1.16.
  • data/index.json — 29 records; search, map, compare, and directory index updated.
  • Service worker v1.15 — precache the four new cafe pages.
v1.23
Today's Brew sync · offline precache · footer hubs
  • Today's Brew — rotation pool now driven by data/index.json (published sixteen only; research candidates excluded from daily picks).
  • Service worker v1.23 — precache extended with nine research-candidate cafe pages and four legacy guide articles.
  • Homepage footer — hub links for map, compare, roasters, areas, vibes, and guide articles.
  • GitHub Actions — CI and Lighthouse on Node 24 via actions/checkout@v6 and actions/setup-node@v6 (GitHub’s Node 20 runner deprecation).
  • Footer sweep — sitewide version stamp v1.23; hub links point to /roaster/, /area/, /vibe/, /guide/ (and map/compare where applicable) instead of dead homepage anchors.
  • Build gate — Today's Brew display map must match the published sixteen in data/index.json.
  • Research detection fix — search, compare, map, and Today's Brew no longer treat pre-audit research preview as a research-candidate status.
v1.12
Google Analytics 4 installed site-wide
  • GA4 tag added — Google Analytics 4 (G-W0R491DR95) installed via gtag.js on all 55 pages, with the CSP and service worker updated to allow it. Note: reversed in v1.13 — it directly contradicted the site's no-tracker editorial promise. See above.
  • Service worker v1.12 — cache bust.
v1.11
External audit fixes — 10 findings applied
  • HTML-01 (CRITICAL) — /coffee/ directory had malformed anchor markup on ranks 13-16 (closing </a> before child divs, rank 15 linking to wrong slug, rank 16 stray closing tag). Repaired all four entries with proper anchor structure.
  • EDIT-01 — Cafe count contradictions resolved. Site-wide model: 16 published profiles · 25-cafe shortlist · 30 target slots. Every "29 cafes" / "Twenty-nine" / numberOfItems:25 conflict reconciled.
  • EDIT-02 (editorial honesty) — data/index.json `editors_score: 47/48` for Albatross while page says pre-audit nulled. All 16 cafes now have `editors_score: null` + `scorecard_status: "pre-audit research preview"`.
  • SCHEMA-01 — Review JSON-LD removed from Albatross pre-audit page. Will restore only after final audit with defensible reviewRating.
  • SEO-04 — Homepage title 69ch → 55ch ("Pattaya Coffee — Independent Specialty Cafe Guide"). Descriptions trimmed: homepage 208→154ch, /standards 170→156ch, Albatross 212→156ch, /coffee/ og:desc reconciled to "16 cafes published" wording.
  • SEO-05 — Homepage og:description had embedded <time> HTML inside the attribute (would terminate the attribute early in some parsers). Replaced with plain-text content.
  • A11Y-01 (WCAG 4.1.2) — Closed drawer now has inert + role="dialog" + aria-modal="true" + aria-hidden="true" on 51 pages. JS toggles inert on open/close. Keyboard users no longer Tab into hidden navigation.
  • A11Y-02 (WCAG 1.4.3) — Small-text accent usage switched from --accent (#D4763C, 3.02:1) to --accent-deep (#B85C24, 4.25:1) for eyebrows, labels, meta, status pills, role chips, role text. Large display italics keep --accent.
  • A11Y-03 — aria-label="Close menu" / "Back to top" / "Open menu" added to icon-only controls on 51 pages where missing.
  • MOBILE-01 — Inline newsletter input font-size 15 → 16px to prevent iOS auto-zoom (matches the global mobile rule shipped in v1.10).
  • Service worker v1.11 — cache bust for the audit-fix round.
  • NOTE: The other audit findings (SEO-01/02/03, SEC-01, PWA-01/02) are all "live deployment is stale". They resolve when you `git push` and Cloudflare redeploys.
  • v1.10
    Mobile deep audit — touch targets, safe-area, iOS zoom, viewport
    • iOS safe-area-inset env() everywhere it matters — masthead respects left/right insets in landscape; .to-top + .install-btn float above the home indicator; footer .ftr-bottom adds inset-bottom padding; drawer panel padding-bottom env().
    • WCAG 2.5.5 touch targets fixed — .nav-search 36 → 44px, .nav-hamburger 40 → 44px. Both pass the 44×44 minimum for mobile tap.
    • iOS no-zoom on input focus — newsletter email input 15 → 16px, /compare select 15.5 → 16px. Mobile @media forces all inputs to 16px via !important.
    • touch-action: manipulation on a, button, [role="button"] — removes the legacy 300ms tap delay on slow mobile browsers.
    • text-size-adjust: 100% on html — iOS Safari no longer auto-rescales body text in landscape.
    • viewport meta unified across all 55 pages — width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content (Chrome 108+ handles the mobile keyboard by resizing the layout, not the visual viewport).
    • Mobile @media tap-target enlargements — nav-links a padding 6 → 12px (~24px effective tap area → ~48px); footer .ftr-col li a gets 4px vertical padding; newsletter form stacks vertically on phones.
    • Reduced-data backdrop-filter disable — heavy blur drops on iOS Low Power Mode / Save Data users.
    • -webkit-touch-callout: default — long-press preview works on iOS again.
    • Service worker v1.10 — cache bust to ship the mobile pass.
    v1.9
    Bug fix, schema completeness, header hardening
    • BUG FIX — v1.8 SVG aria-hidden script inadvertently matched <svg> inside CSS url("data:image/svg+xml;utf8,...") data URIs, breaking the /compare select-chevron rendering. Cleaned up; no remaining broken URIs.
    • Article mainEntityOfPage added to all 4 guide articles — Google rich-result eligibility upgrade.
    • Speakable schema extended to /standards — voice-assistant reads the editorial method aloud.
    • Per-page sitemap lastmod — sitemap.xml now uses real file mtime per URL, not a single today's date. More accurate signal for crawlers.
    • Permissions-Policy expanded — Privacy Sandbox opt-outs: browsing-topics, join-ad-interest-group, run-ad-auction, attribution-reporting, private-aggregation, shared-storage, plus camera/mic/geolocation/payment/usb/sensors all disabled.
    • HSTS bumped to 2 years (63072000) — required for hstspreload.org submission.
    • CSP hardened — added block-all-mixed-content directive.
    • X-Permitted-Cross-Domain-Policies: none — disables Adobe Flash/PDF cross-domain access (legacy hardening).
    • Origin-Agent-Cluster: ?1 — opts in to origin-keyed agent clusters (better isolation, faster cross-origin postMessage).
    • Service worker v1.9 — cache bust to ship the bug-fix + schema additions.
    v1.8
    Deeper audit — contrast, semantics, schema graph
    • Color contrast fixed--fg-4 darkened from #B5A696 (2.20:1 against cream, fails WCAG AA) to #8E7B68 (5.1:1, passes AA fully). Affects every "subtle" text element on the site.
    • 124 decorative SVGs marked aria-hidden="true" — screen readers now skip the cup-glyph, chevrons, search icons that have no meaning beyond visual flourish.
    • Article schema author now references Person @id on all 4 guide articles — Tim Paemi as a single entity-graph node, not just a URL.
    • <address> element wrapping the footer Direct column on 52 pages — semantic HTML5 for editorial contact.
    • <time datetime> wrapping date strings on 7 editorial pages (changelog, brand, colophon, index, now, privacy, standards) — machine-readable dates.
    • --rp CSS custom property declared with 0% default in :root — eliminates the one undefined-var the audit flagged.
    • Service worker v1.8 — cache bust to ship the contrast + a11y fixes.
    v1.7
    Deep code audit — a11y, headings, meta, performance
    • Heading hierarchy fixed — footer column titles upgraded from <h5> to <div role="heading" aria-level="2"> on 53 pages, eliminating the h2→h5 jump flagged by accessibility auditors.
    • Mobile hamburger a11y — aria-expanded and aria-controls added on 53 pages; JS syncs aria-expanded with drawer open/close via MutationObserver.
    • Meta descriptions trimmed on 4 long pages (index, Albatross, scene guide, brewing glossary) to fit Google's 160-char SERP snippet.
    • Just Specialty Coffee meta description expanded from 59ch to 175ch.
    • Twitter:site / twitter:creator placeholder comments on homepage — ready to fill once @-handles are decided.
    • Speculation Rules excludes /map — Leaflet-heavy page no longer prerendered on hover. Saves bandwidth for visitors.
    • Service worker v1.7 — cache bust for the a11y + heading-hierarchy fixes.
    v1.6
    Full self-audit + network alignment
    18 May 2026
    • Self-audit pass — 55 pages all unique titles + descriptions, canonicals / hreflang / og:url consistent, zero orphans, zero broken links, zero missing alt-text. Audit report in commit log.
    • Sister network expanded to the full Pattaya Authority Network on every page (53 footers updated): Coffee Guide · Restaurant Guide · School Guide · Pattaya Gym · Pattaya Visa Help · Pattaya Stream · Tim Paemi (main brand) · Pattaya Authority (media agency).
    • Person schema sameAs on /masthead expanded — 7 cross-property URLs now declare Tim Paemi as the same person across the network. Crucial for AI knowledge graphs and entity disambiguation.
    • Organization schema sameAs on homepage — same expansion for the publisher entity.
    • Press founder bio rewritten to credit all six network properties with live links.
    • llms.txt updated with the full network section — AI crawlers now see all six sister sites plus brand + agency.
    • /map and /compare cross-link added to all 16 cafe pages via a slim utilities bar.
    • og:url backfilled on 404, feedback, offline, press.
    • og:image + og:image:alt backfilled on 404 and offline.
    • Search Console / Bing / Yandex / Pinterest verification meta placeholders on homepage — commented, ready to fill when each property is added.
    • Service worker v1.6 — cache bust to ship the network update.
    v1.5
    Compare tool, colophon, author byline, mobile PWA, SWR
    18 May 2026
    • /compare — pick any two cafes side-by-side. URL-shareable. Hours, prices, vibe tags, signature drink, neighbourhood — all twelve fields, instant filter.
    • /colophon — the craft behind the site itself. Typefaces, colour codes, code stack, hosting, editorial workflow, standards implemented. Linked from footer Office column.
    • Author byline block on every guide article — TP avatar, role, bio, links to /masthead#tim-paemi and email. Schema.org Person already wired.
    • Mobile PWA screenshot — manifest now has both wide and narrow form-factor screenshots for Chrome's install UI.
    • Stale-while-revalidate for /data/* in the service worker — directory data loads instantly from cache, refreshes in background.
    • Service worker v1.5 precaches /compare and /colophon.
    • 53 pages live — Issue 01 surface area complete.
    v1.4
    Typography, browser search, Atom, native share, reading UX
    18 May 2026
    • OpenSearch descriptor at /opensearch.xml — users can right-click the browser search bar and add "Pattaya Coffee" as a search engine. Chrome, Firefox, Safari, Edge all support this.
    • Atom 1.0 feed at /feed.atom — third syndication format alongside RSS and JSON Feed. Some readers prefer Atom for the cleaner spec.
    • Sitemap XSL stylesheet — /sitemap.xml renders as a beautiful human-readable directory page when visited in a browser. Helps curious humans who land there.
    • text-wrap: balance on every headline and text-wrap: pretty on every lede — modern CSS that prevents orphans and widows in display type. Subtle but transformative.
    • Container queries on issue and staff card grids — cards adapt to their container, not just the viewport.
    • Reading progress bar on guide articles — top-of-page gradient bar tracks how far you have scrolled into the prose.
    • Anchor links on h2/h3 in prose — hover any heading, click to copy a shareable section URL. Visible "Copied" flash confirms the action.
    • Web Share API button on every cafe page — native iOS / Android / Chrome share sheet. Falls back gracefully on non-supporting browsers.
    • PWA install soft-prompt button — when Chrome fires beforeinstallprompt, a discreet "Install" button appears in the bottom-right. Hidden after install.
    • Lighthouse CI workflow on GitHub Actions — every push runs Lighthouse desktop + mobile against the live site with performance, a11y, best-practices and SEO score thresholds.
    • Service worker v1.4 precaches /opensearch.xml, /feed.atom, and /sitemap.xsl.
    v1.3
    Schema depth, image SEO, keyboard UX
    18 May 2026
    • og:image:alt + twitter:image:alt on every page — descriptive social-card alt text for AI image search, Google Lens, and accessibility readers. Per-page contextual descriptions (47 pages updated).
    • HowTo schema on /guide/how-to-order — five-step JSON-LD that may render as a step-by-step rich result for "how to order coffee in Pattaya" searches.
    • DefinedTermSet schema on /guide/brewing-glossary — ten coffee terms with formal definitions, eligible for dictionary-style rich snippets.
    • TouristTrip schema on /guide/walking-tour-beach-road — three-stop itinerary with TouristAttraction items, eligible for travel rich results.
    • Cafe commerce schema on all 16 cafes — priceRange (฿/฿฿/฿฿฿), paymentAccepted (Cash, QR PromptPay, Credit Card), currenciesAccepted: THB, acceptsReservations: False, servesCuisine. Feeds Google Maps cards.
    • Cmd+K / Ctrl+K global search shortcut — power-user keyboard navigation. "/" also opens search (Twitter/X / GitHub-style convention).
    • Service worker v1.3 — cache bust to ship the new schema and shortcut.
    v1.2
    Map, archive, performance, trust signals
    18 May 2026
    • /map — interactive map of every cafe in Issue 01, powered by Leaflet + OpenStreetMap tiles. No Google, no third-party tracking. 16 markers, popups link to each cafe.
    • /issue/ — editorial archive landing. Issue 01 (live, pre-audit), Issue 02 (Q3 2026), Issue 03 (Q1 2027 — roaster supplement).
    • WebSite + SearchAction JSON-LD on homepage — enables Google sitelinks search box for branded queries.
    • OpeningHoursSpecification JSON-LD on 15 cafe pages — feeds Google Maps and rich result cards.
    • Speculation Rules API on every page — Chrome prerenders the next-likely navigation while the user hovers.
    • Fraunces font preload on every page — LCP improvement for the hero serif headline.
    • IndexNow API key deployed — Bing / Yandex / Seznam re-index in minutes when a new cafe ships.
    • Trust signal pills in footer — Ad-free, No trackers, GDPR-compliant, HTTPS-only, Open Web.
    • CSP updated to allow Leaflet from unpkg + tile.openstreetmap.org tiles only.
    • Service worker v1.2 precaches /map and /issue/.
    • 51 pages live — Issue 01 surface area complete.
    v1.1
    2026 standards round — AI, a11y, schema, PWA, future-proofing
    18 May 2026
    • /llms.txt — AI-crawler-readable orientation map. Tells GPT, Claude, Perplexity, Gemini what's worth citing, how to attribute, and what editorial honesty rules to respect.
    • robots.txt upgrade — explicit allow rules for every modern AI training and search bot (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web, PerplexityBot, Perplexity-User, Google-Extended, GoogleOther, AppleBot-Extended, Bytespider, cohere-ai, Diffbot, FacebookBot, meta-externalagent, YouBot, Kagibot). SEO scrapers (Semrush, Ahrefs, MJ12) explicitly disallowed.
    • Hreflang en + x-default on every page — explicit Google language signal, ready for Issue 02 Thai-language edition.
    • Sitemap suite — `sitemap-index.xml` linking pages (49), images (17), and a news sitemap (7) for Google News submission of the Issue 01 launch.
    • PWA Manifest 2.0 — four app shortcuts (The 30, Today, Search, Method), three screenshots, share_target for /feedback, maskable + monochrome icons, display_override fallback chain.
    • Apple PWA meta suite — apple-mobile-web-app-capable, status-bar-style, app-title, application-name, format-detection, color-scheme — across every page.
    • Person schema on /masthead — Tim Paemi as Editor-in-Chief with knowsAbout, knowsLanguage, homeLocation, affiliation, and sameAs links to the sister sites in the Pattaya Authority network.
    • Reading time + timeRequired schema on all four guide articles — calculated from real word counts (1128 / 894 / 1005 / 849), shown as inline byline plus PT5M / PT4M / PT4M / PT4M ISO duration in Article JSON-LD.
    • Newsletter inline form — real HTML form with client-side email validation, accessible aria-live status, mailto: fallback ready to swap for a Buttondown / ConvertKit endpoint.
    • View Transitions API — progressive-enhanced smooth page-to-page animation for supporting browsers (Chrome, Safari 18+). Falls back to instant nav elsewhere.
    • Print stylesheet — editorial-grade print CSS. URLs spelled out after links, page-break-avoid on sections, monochrome treatment, proper @page margins.
    • WCAG 2.2 focus-visible — explicit accent outline on keyboard focus, suppressed on mouse.
    • prefers-reduced-motion + prefers-reduced-data — animations and backdrop-filter disabled for users who opt out.
    • Service worker v1.1 precaches /llms.txt and /manifest.json.
    v1.0
    Transparency, privacy, brand kit
    18 May 2026
    • /now — public Now page documenting audit progress, photography schedule, and Issue 02 roadmap. Updated weekly while editors are in town.
    • /privacy — full privacy notice. No trackers, no profiling, no third-party pixels, with a clear table of what we do collect (server logs, newsletter email) and why.
    • /brand — press-grade brand kit. Wordmark, glyph, colour palette with hex codes, type specs, approved editor quote, and a do/don’t list.
    • Speakable schema on all four guide articles — voice-assistant ready. Marks hero, lede, and TL;DR as the speakable selectors.
    • Footer normalized — Office column now includes /now and /privacy links across every page in the site, so readers can always find both in one click.
    • Service worker v1.0 precaches /now and /privacy alongside the existing core pages.
    • 49 pages live — Issue 01 surface area complete pre-audit.
    v0.9
    Visual + a11y + engineering polish
    18 May 2026
    • 21 unique Open Graph cards — top-16 cafes, 4 guide articles, /coffee/ directory each get a unique 1200×630 social preview.
    • aria-live region on search results — screen readers announce match counts as filters update.
    • SiteNavigationElement JSON-LD on homepage — tells crawlers the primary navigation structure explicitly.
    • /changelog page (you’re reading it) — version history for repeat visitors and the curious.
    • apple-touch-icon.png (180×180) — proper iOS home-screen icon for PWA installs.
    • GitHub Actions CI workflow — JSON-LD validation, build verification on every push.
    • Service worker v0.9 precaches the top-5 OG cards for offline social sharing.
    v0.8
    Client-side search + per-cafe OG cards
    18 May 2026
    • /search — real client-side filter UI. Area, vibe, roaster type chips + name/drink/source text search. Fetches /data/index.json on load.
    • 5 unique per-cafe OG cards for the top-5 anchor cafes.
    • Smart 404 with 6 popular destinations.
    • Build script auto-generates sitemap.xml from filesystem.
    • Issue 02 teaser on homepage.
    • Service worker v0.8 precaches /search and /data/index.json.
    v0.7
    Editorial layer — /guide/ + 4 articles
    18 May 2026
    • /guide/pattaya-coffee-scene — 1,200-word editorial essay on how Pattaya became a coffee city.
    • /guide/how-to-order — visitor primer.
    • /guide/brewing-glossary — 30+ specialty terms defined.
    • /guide/walking-tour-beach-road — three-cafe editorial route.
    • Today’s Brew rotation expanded 5 → 16 cafes.
    • Editors’ Ten on homepage expanded 6 → 10 entries with honest pre-audit framing.
    • Article schema added to /standards. Person + sameAs for Editor-in-Chief on homepage.
    v0.6
    Full taxonomy — 28 new pages
    18 May 2026
    • 11 more cafe stub pages (Strong Candidates tier — Benjamit, Why Specialty, Ordinary, Ratio, Fundamental, Malamute, Just Specialty, Dripoly, Brewed Bliss, King of Coffee, Secret Café).
    • 5 neighbourhood pages — /area/naklua, /central-pattaya, /pratumnak, /jomtien, /banglamung.
    • 6 vibe pages — work-friendly, garden, beachfront, aesthetic, cozy, view.
    • 3 roaster-type pages — in-house, partner, Thai single origin.
    • 3 taxonomy index landings — /area/, /vibe/, /roaster/.
    • Cross-linking baked into every cafe stub (chip links to area/roaster/vibes).
    • Site tripled from 13 → 41 pages.
    v0.5
    Heavy round — 13 empire improvements
    18 May 2026
    • PWA service worker fix — dropped broken .html precache entries, offline mode actually works.
    • Cloudflare Pages middleware — protects *.pages.dev preview URLs from being indexed.
    • Mobile drawer focus trap + aria-current sync + return-focus on close.
    • color-scheme: light declared — prevents iOS dark-mode auto-inversion.
    • /.well-known/security.txt + /feed.json (JSON Feed v1.1) + humans.txt linked.
    • Noscript fallback + fonts trimmed 16 → 9 weights (~30% lighter).
    • Honest copy — “25 cafes shortlisted verified” → “25 cafes cross-sourced”.
    • Newsletter mailto replacing fake /api/subscribe.
    v0.4
    Pre-audit editorial honesty
    18 May 2026
    • Albatross Pre-Audit Preview banner — explicit "this isn’t a finished review" framing.
    • Scorecard set to —/12 pending — removed all fabricated scores.
    • Score-note prose rewritten as research-cited rather than personal-experience.
    • Hours note made honest about pre-audit status.
    • Security headers — CSP, HSTS, Permissions-Policy, COOP added.
    • 13 vanity redirects — /about → /masthead etc.
    v0.3
    Full architecture — 13 pages
    18 May 2026
    • 14-section Albatross full template — at-a-glance, verdict, scorecard, room, play, best-for, hours, amenities, find-it, FAQ, drink-next.
    • 4 cafe stub pages for Nitan, Sunset, Backstreet, SheeVa.
    • Editorial credibility pages — /standards, /masthead, /press, /feedback.
    • /coffee/ directory index with 25-entry ItemList.
    • PWA — service worker, offline page, manifest with maskable icons.
    • 5 JSON-LD schema types across the site.
    v0.2
    Editorial homepage
    18 May 2026
    • Real cafe data replaced placeholder “Cafe to be ranked” entries.
    • Letter from the Editor section.
    • Issue stamp, italic letterform background, paper-grain texture.
    • OG image (1200×630) generated via PIL.
    • Scroll-reveal animations, mobile drawer, scroll progress bar.
    v0.1
    Initial scaffold
    18 May 2026
    • First homepage, cream / espresso / terracotta palette, Fraunces serif.
    • Restaurant Guide architecture mirrored.
    • Cloudflare Pages config (wrangler.toml, _headers, _redirects).
    • Initial build pipeline (scripts/build.mjs).
    Anonymous Customer · Paid Bill · Independent Editorial

    Visit twice.

    Pay the bill.

    Rate honestly.