Sister guides in the Pattaya Authority network: Visa Help · Restaurant Guide · Gym · School Guide · Medical · PattayaPets · Vehicle Rentals · Villa Stream · Pattaya Authority · TimPaemi · Full grid in the press kit and site footer.
// 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-collapsesummaries (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-introwrappers on area/vibe/roaster hubs so listing grids align with the manifesto column. - CSS — global
.listing-gridand guide Thai-note styles insite.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 guard —
validateDirectoryLayoutblocks listing-grid inside hub-intro.
v1.56
Fix — directory listing layout on /coffee/
- Layout —
.listingnow shares the same centered--maxrail as tier entries; manifesto + intro copy sit in a two-column grid on desktop. - Network strip — moved inside
hub-introon The 30 index; styled viasite.cssinstead 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-v146regex 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-contextparagraph above the hero (unstyled, malformed Visa Help URLs). - Build guard —
validateHomepageIntegrityblocks 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 stub —
npm run gsc-ingestfor 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 opsloop 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-nitanand three sibling vanity URLs from_redirects.
v1.46
Autonomous ops — desk research, hubs, Thai entry, network intent
- Desk pipeline —
desk-research-enrichsyncsdata/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 opsruns 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-widthunified to--max(was--max-wideon some hubs). - Cafe pages — hero, body, and tail share
--max-narrowso 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 —
_redirectscatch-all/* → /404.html 404so random paths get the styled Pattaya Coffee 404 (not Cloudflare generic). - Utility pages — removed duplicate
site.csson404.htmlandoffline.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.csswithmedia="print"(unstyled flash); restored blocking stylesheet. - Cafe pages — shared styles in
site.css;body.page-cafeleft-aligned editorial rail; unified.cafe-tail-panel(rank nav + explore chips + quick links); upgraded info grid. - Hub / directory —
.hub-intro+.hub-bodyon 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 intosite.cssat build;deferonsite.js; speculation rules prerender removed; homepage JSON-LD moved before</body>. - Accessibility — drawer
inerton 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). - Tooling —
sync-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. - Tooling —
sync-post-v140.mjsreplaces duplicate SW tail steps;AUDIT.mdrecords site health. - Build — utility pages must close wrapper before
</main>.
v1.39
Utility pages, SW asset strategy, adjacent prefetch, share fallback
- 404 / offline —
page-utilitylayout onsite.css?v=139; brand bar; Beach Road tour on 404. - Service worker — network-first
/assets/*with unversioned fallback; precache/404. - Cafe pages —
rel="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.
- Build —
validateUtilityPages,validateCafePrefetch,validateSwAssetFetch.
v1.38
Footer shell, versioned precache, prose + PWA tour shortcut
- Footer —
.ftr-innerwraps 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.mjssingle source for release + build checks. - llms.txt — eight compare duels,
.cafe-taillayout, PNG research OG accuracy. - PWA — manifest shortcut for Beach Road map tour (
/map?walk=beach-road). - Lighthouse CI — audits research cafe
koons-cafefor layout regression.
v1.37
Cafe tail layout — rank nav, explore strip, footer centering
- Cafe pages —
.cafe-tailwraps 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 bust —
site.css?v=137/site.js?v=137so 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 PNG —
sharprasterizes 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).
- Build —
validateNetworkProse(),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.txtand PWA description. - JSON-LD — guide/colophon
publishergetsslogan+ networksameAsfromnetwork-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-roadfilters 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.
- Ops —
NETWORK.mdCloudflare table; Lighthouse URLs; sister rollout + Albatross audit checklists in_research/. - Thai —
hreflang="th"stub → Thai coffee guide article.
v1.34
Pattaya Authority network footer — 11 platforms
- Network tagline —
Built 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-LD —
slogan+ expandedsameAson homepage Organization / WebSite publisher. - Build —
validateNetworkFooter();scripts/sync-network-footer-v134.mjs.
v1.33
Desktop layout fix + cafe info-grid repair
- Bug fix —
sync-cafe-pages-v128info-grid regex stopped at the first</div>, duplicating Address/Vibe fields on 29 cafe pages; repaired viarepair-cafe-info-grid.mjs. - Desktop layout — centered content rails on cafe pages, hub subsites, and homepage manifesto; prose max-width on audit blocks.
- Build —
validateCafeInfoGrid()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), andsitemap-index.xmlwith freshlastmod; parity gate vs filesystem. - Guide — reading-order TOC on
guide/index,ItemListJSON-LD,guide-series-navon all ten articles, headrel=prev/nextenforced (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-comparemarkers). - JSON-LD — uniform
openingHoursSpecificationmerged intoCafeOrCoffeeShop; redundant per-day scripts removed on published cafes. - Build —
validateAreaHubCompare();sync-seo-v130.mjssupersedes v129 innpm run sync-data.
v1.29
Cafe JSON-LD from data; compare duels synced
- JSON-LD —
CafeOrCoffeeShopblocks regenerated from data (geo, address, price tier); removed unauditedaggregateRatingon Nitan. - compare.html — six featured duels derived from current ranks (
SYNC:duelsmarkers). - Build —
validateCafeLdGeo()andvalidateCompareDuels(); part ofnpm 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 fromdata/index.json. - Build —
validateCafePageSync()fails if page meta or adjacent-rank links drift from data. - Script —
node scripts/sync-cafe-pages-v128.mjsafter 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. - Build —
validateCoffeeIndexRanks()fails if directory ranks drift from data. - HTML fix — research tier
entry-listproperly closed before chains section. - Script —
node scripts/sync-coffee-index-v127.mjsafter data edits.
v1.26
Data alignment, research truth pass, build tier gate
- data/index.json —
published_previews/research_candidates/audit_queue;area_slugper cafe; tier/status enforced by rank. - Build —
validateTierAlignment()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.jsonper 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 / roaster —
hub-toolsstrips 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-moreexplore 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/nextin<head>for crawl order. - Homepage JSON-LD — full 30-item
ItemList; expandedSiteNavigationElement; valid FAQ text (no HTML in schema). - CSS —
.rank-nav,.discover-more,.hub-toolsinsite.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.
- Data —
meta.scorecards_filed,audit_wave; ranks #01–05 taggedtop-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 workflow —
scripts/file-scorecard.mjs+_research/scorecard-template.md;npm run scorecardalias. - 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,
/nowopen 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-blockon/coffee/and/map; directory stats now show 0 scorecards filed. - Sharper hub copy — homepage letter, pull quote, flagship deck,
/now"contract" section,/standardsopener,/comparelede, 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-killinsite.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_countandshortlist_countaligned. - 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 gate —
data/index.json↔ HTML sync errors now fail the build;npm run validatealias added. - /now and
/issuecounts 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@v6andactions/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
displaymap must match the published sixteen indata/index.json. - Research detection fix — search, compare, map, and Today's Brew no longer treat
pre-audit research previewas 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.
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 CSSurl("data:image/svg+xml;utf8,...")data URIs, breaking the/compareselect-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-4darkened 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).