Registo de Alterações

v2.4.0

GEO Round 2: WebSite Schema, Speed Comparison Table, Methodology, Footer Legal Links

Schema Structured Data

  • Added WebSite JSON-LD + SearchAction schema to all pages (search speed test pages)
  • Enhanced Person schema: added jobTitle, worksFor, sameAs (speed test country pages)

Content + E-E-A-T

  • Added 8-country speed comparison table to speed test Hub (country, top speed, avg speed, network, locations)
  • Added testing methodology section to speed test Hub (device, app, conditions, sources)
  • Changed country card titles to question-style (e.g., "How fast is Japan 5G?")
  • Added 16 translation keys × 11 languages (comparison table, methodology, question titles, legal links)

Brand + Trust

  • Added LinkedIn link and icon to SocialBar
  • Created Footer component replacing inline footer
  • Added Privacy Policy and Terms of Service links to footer (linking to b4travel.shop)

v2.3.0

GEO Optimization: AI Crawler Directives, Speed Test Dates, Article Schema, Security Headers

Technical GEO

  • Added 9 AI crawler explicit Allow directives to robots.txt (GPTBot, ClaudeBot, PerplexityBot, ChatGPT-User, Google-Extended, CCBot, OAI-SearchBot, anthropic-ai, cohere-ai)
  • Added security headers to firebase.json: X-Content-Type-Options, X-Frame-Options, Content-Security-Policy
  • Added LinkedIn company URL to llms.txt

Content E-E-A-T

  • Added test date labels to all speed test data (testDate field)
  • Each country page displays "Data last updated" date
  • Speed table shows test date per row

Schema Structured Data

  • Added Article schema to speed test pages (datePublished, dateModified, author Person, publisher Organization)
  • Added speakable property (SpeakableSpecification) to speed test pages
  • Added LinkedIn company page to Organization sameAs
  • Added image (store logo URL) and url (store detail page) to Store schema
  • Upgraded non-zh Organization schema from minimal to full version (with sameAs, contactPoint, description)

v2.2.1

Fix Missing Store Data: Add Bepower + Upgrade Teledom to Star Partner

Background

  • cleanup-v1.7.0-backup branch previously contained Bepower and Teledom upgrade changes (commits ec8fcd3, 9174f26)
  • When main branch was rebuilt with 608b423 Initial commit from Astro, links.ts was rewritten from scratch, losing backup branch store data
  • Bepower was completely missing from main branch; Teledom was placed back in cooperative partners (should be star partner)
  • This version restores both missing changes from the backup branch

New Store

  • Added Bepower to Star Partners — Shop B78, 1/F, Kwai Chung Plaza, Kwai Fong
  • Address: Shop B78, 1/F, Kwai Chung Plaza | Phone: 9345 1473
  • Hours: Mon-Sat 12:00-20:00
  • Social: Instagram @bepower_b78 | WhatsApp 852-9345-1473
  • Added bepower.webp logo (converted from backup branch PNG to WebP, 8.25 KB)
  • Product tags: eSIM + Physical SIM (full range)

Store Upgrade

  • Upgraded Teledom from Partner Store to Star Partner (Lai Chi Kok)
  • Teledom product tags upgraded from "Physical SIM" to "eSIM + Physical SIM" (full range)
  • Added Lai Chi Kok district to Star Partners
  • Removed Lai Chi Kok district from Partner Stores (Teledom was the only store)

Data Changes

  • Star Partners: 15 → 17 stores (+2)
  • Partner Stores: 6 → 5 stores (-1, Teledom upgraded)
  • Total stores: 21 → 22 (+1, Bepower added)
  • Star districts: 10 → 12 (+2: Bepower in Kwai Fong, new Lai Chi Kok district)
  • Total pages: 352 → 363 (+11, new kwai-fong-bepower page × 11 languages)

v2.2.0

Remove Cloud Run Deployment, Unified Firebase Hosting

Removed

  • Completely removed Cloud Run deployment system
  • Deleted deploy.sh — Cloud Run deployment script
  • Deleted Dockerfile — Docker container configuration
  • Deleted nginx.conf — Nginx server configuration
  • Deleted .dockerignore — Docker ignore rules
  • Decommissioned GCP Cloud Run service
  • Cleaned up 40+ old container images (kept last 3 versions for backup)

Improvements

  • Unified deployment workflow — Firebase Hosting only
  • Simplified deployment: just run ./deploy-firebase.sh
  • Removed Docker and containerization complexity
  • Deployment time reduced from 2 minutes to 30 seconds
  • Built-in global CDN and automatic SSL certificates

Backup

  • Git tag v1.6.4-with-cloud-run preserves pre-cleanup code
  • Git branch backup/cloud-run-deployment-system available for emergency recovery
  • Cloud Run configuration backed up (recoverable within 15 minutes)

Rationale

  • Static websites don't require containerization
  • Firebase Hosting provides simpler, faster deployment experience
  • Reduced maintenance complexity
  • Lower operational costs

v2.1.0

11-Language i18n + Comprehensive SEO Upgrade

Internationalization (i18n)

  • Expanded from 2 languages (zh/en) to 11 languages — Chinese (HK), English, French, Dutch, German, Japanese, Korean, Traditional Chinese (TW), Simplified Chinese, Spanish, Portuguese
  • Adopted subpath routing architecture — each language has independent URLs (e.g., /en/, /fr/, /ja/), Google's recommended best practice for SEO
  • Expanded from 32 pages to 352 pages (32 × 11 languages), all pre-rendered as static HTML by Astro SSG
  • Added centralized translation system (translations.ts) — 80+ translation keys × 11 languages covering UI labels, country names, FAQ content
  • Added i18n utility module (i18n.ts) — localePath(), isChinese(), stripLocale(), getNonDefaultLocales() helpers
  • Added language selector component (LangSelector.astro) — replaces old zh/en toggle, supports 11 languages
  • Removed old CSS language toggle mechanism — no more lang-zh/lang-en CSS classes or data-lang attributes
  • Removed localStorage language preference — each URL represents one language, no JavaScript switching needed
  • Refactored all components to accept locale prop — ProfileHeader, LinkButton, LinkSection, SpeedtestSection, MapView, Breadcrumb
  • Multilingual map component — all popup text, button labels, distance display, geolocation alerts translated per language
  • Smart Chinese address detection — zh (HK), tw (TW), sc (CN) show Chinese addresses, others show English

SEO Improvements

  • Every page includes 11 hreflang tags + x-default in HTML head — tells Google about all language versions
  • Dynamic sitemap.xml generation — upgraded from static 31 URLs to dynamic 352 URLs, each with xhtml:link hreflang annotations (dual hreflang signal)
  • og:site_name translated per language — Chinese shows "B4travel 電話卡", English "B4travel SIM Cards", Japanese "B4travel SIMカード", etc.
  • og:image:alt translated per language — improves accessibility for social media sharing
  • apple-mobile-web-app-title translated per language — localized PWA install name
  • Simplified meta keywords — removed overly long Chinese keyword list, using concise universal keywords
  • Dynamic og:locale — each language page sets correct Open Graph locale (e.g., zh_HK, en, ja)
  • Per-language canonical URL — ensures Google correctly indexes each language version

Page Routing Architecture

  • Chinese (HK) as default language — keeps root path / (no prefix), other languages use /{lang}/ prefix
  • Added [lang]/ dynamic route directory — includes index, speedtest/index, speedtest/[country], store/[slug], changelog/index
  • Each [lang] page uses getStaticPaths() with getNonDefaultLocales() to auto-generate 10 language versions
  • Root pages hardcode locale="zh" — ensures default language has no prefix
  • Sitemap migrated from static public/sitemap.xml to dynamic Astro endpoint (src/pages/sitemap.xml.ts)

v2.0.0

Multi-page SEO Major Upgrade

New Features

  • Expanded site from 1 page to 31 pages using Astro SSG dynamic routes (getStaticPaths)
  • Added speed test hub page (/speedtest) with country overview cards showing top/avg speed and location count
  • Added 8 country speed test pages (/speedtest/japan, /speedtest/korea, etc.) with full city speed tables, stats bar, FAQ, cross-country linking
  • Added 21 store detail pages (/store/kwai-fong-anlander, etc.) with address, phone, hours, Google Maps, social buttons, same-district linking
  • Added breadcrumb navigation component for all subpages
  • Added version number in footer (linked to /changelog)
  • Added changelog page (/changelog) with detailed version history

SEO Improvements

  • Independent Dataset JSON-LD for each country page (country-specific speed test keywords)
  • Independent FAQPage JSON-LD for each country page (3 FAQs)
  • Independent LocalBusiness JSON-LD for each store page (better for local SEO than Store)
  • BreadcrumbList JSON-LD for all subpages
  • Per-page canonical URL and OG URL (BaseLayout url prop)
  • Sitemap expanded from 1 URL to 31 real URLs
  • Internal linking section on homepage linking to all country speed test pages
  • Homepage JSON-LD Dataset URLs changed from fragment (#) to real page paths
  • Hub-and-spoke internal linking architecture with cross-linking between pages

Data Architecture

  • Extracted speed test data to shared file (src/data/speedtest.ts) used by homepage and country pages
  • Added per-country slug, description (zh/en), networkOperator fields
  • Added speedNum numeric field for stats calculation (max/avg speed)
  • Added getCountryStats() helper function
  • Added getAllStores() helper function to links.ts

v1.6.3

WebP Image Compression + Security Headers

Performance

  • Converted all 28 store logos from PNG/JPEG to WebP (PIL quality=80)
  • Image size reduced from 436KB to 88KB (80% reduction)

Security

  • Added Referrer-Policy: strict-origin-when-cross-origin to Firebase deploy config
  • Added Permissions-Policy header to Firebase deploy config

v1.6.2

Deep Optimization — Critical Bug Fix + Performance + Accessibility

Critical Fix

  • Fixed astro.config.mjs site URL missing "s" (location → locations) — affected all canonical/OG URLs
  • Removed invalid fragment (#) URLs from sitemap.xml — Google ignores fragment URLs

Performance

  • Deferred Leaflet map loading — dynamic script injection instead of static (saves ~320KB initial load)
  • Added GA4 preconnect hint

SEO

  • Added OG image dimensions (width/height) and alt attribute
  • Changed Twitter card from summary to summary_large_image
  • Added hreflang en language tag

Accessibility

  • Added aria-labels to social media buttons (Facebook/Instagram/WhatsApp)
  • Added aria-label to share button
  • Improved text contrast (opacity 0.5→0.7 / 0.75→0.8)
  • Enhanced manifest.json (scope, orientation, lang, categories, maskable icons)

v1.6.1

GA4 Analytics + Enhanced SEO Structured Data

New Features

  • Added Google Analytics GA4 (G-NVWBJCR5XY) tracking
  • Added 8 per-country Dataset JSON-LD schemas with city speed data
  • Added BreadcrumbList JSON-LD structured data
  • Added country anchor IDs to speed test section

v1.6.0

Security Fixes + SEO Foundation

Security

  • Added XSS protection to MapView.astro (escapeHtml + safeUrl functions)
  • Added regex whitelist for hash validation in index.astro (prevents injection)

SEO

  • Added Organization + WebPage JSON-LD structured data
  • Added Store JSON-LD for all stores (address, phone, hours, coordinates)
  • Added FAQPage JSON-LD (4 FAQs)
  • Updated title and description with 5G keywords and speed figures
  • Expanded meta keywords

v1.5.x

Firebase Hosting Migration + Custom Domain

Infrastructure

  • Migrated from Google Cloud Run + nginx to Firebase Hosting
  • Configured custom domain locations.b4travel.shop (auto SSL)
  • Created deploy-firebase.sh deployment script (Firebase REST API, no firebase login needed)
  • Created GitHub repo (git@github.com:Stoneip/locations.b4travel.shop.git)

v1.4.x

Store Data Enhancement + Logo Compression

Content

  • Added social media buttons for stores (Facebook / Instagram / WhatsApp)
  • Added store details (address, phone, hours)
  • Added online retailer information
  • Compressed store logos (4.3MB → 480KB)
  • Updated multiple store addresses and links

v1.0.0

Initial Release

Features

  • Astro v5 static site generator
  • Store information display (Star Partners + Partner Stores)
  • Interactive map (Leaflet.js)
  • Speed test data display (8 countries, 70+ locations)
  • Chinese/English bilingual toggle
  • PWA support (Service Worker + manifest.json)
  • District filter functionality