Startseite / Änderungsprotokoll Änderungsprotokoll 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) 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) 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) 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 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) 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 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 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) 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 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 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) 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 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