Static-first personal site for KL KUO.
- A localized public site at
/en/and/zh/ - A blog generated from Astro content collections
- Shared layouts, locale-aware routing helpers, and markdown/MDX full-page content
- Optional production analytics configured only through public environment variables
- GitHub Actions workflows for validation and GitHub Pages deployment via the official Astro action
- Keep the public site simple, fast, and crawlable
- Prefer Astro-first patterns over extra framework layers
- Preserve established public routes when practical
- Keep integrations optional, isolated, and easy to replace
- Document product and architecture decisions close to the code
- Astro
- Tailwind CSS
- TypeScript
- MDX and Markdown
- Astro content collections
- Vitest, ESLint, Prettier, and
astro check
npm installnpm run devnpm run validatenpm run build
README.md— quick start and deployment checklistdocs/spec.md— product direction, current scope, and change guardrailsdocs/architecture.md— current system shape, routing, and deployment modeldocs/roadmap.md— completed rewrite milestones and next enhancement tracks
- In GitHub repository settings, keep Pages configured for GitHub Actions.
- Keep
public/CNAMEcommitted withklkuo.guru. - If analytics should be enabled in production, add these repository variables:
PUBLIC_ANALYTICS_SCRIPT_URLPUBLIC_ANALYTICS_WEBSITE_IDPUBLIC_ANALYTICS_DOMAINS(optional)
- Run
npm run validatelocally before pushing. - Merge or push to
mainto trigger.github/workflows/deploy.yml, which runswithastro/action@v6andactions/deploy-pages@v5. - After deployment, verify
/,/en/,/zh/, a blog post route, and the custom domain.
/redirects to/en/- locale switch links stay inside valid translated routes
- blog index, tag pages, and post pages load without broken assets
- canonical and hreflang tags match the current route
- analytics only appears when production variables are configured