English | 繁體中文
A production-ready, recruiter-friendly portfolio for LEO0331. The site is driven by curated project data, supports English and Traditional Chinese routes, and deploys statically to GitHub Pages.
- React 18 and TypeScript
- React Router 7 with static route entrypoints for GitHub Pages
- Vite 8 and Tailwind CSS
- Playwright E2E tests with a functional coverage gate
- GitHub Actions for build, Lighthouse, E2E, and Pages deployment
- Built for quick recruiter scanning: clear sections, focused project cards, direct demo/repo links
- Data-driven content: update portfolio info in data files, not JSX
- Bilingual ready: English + Traditional Chinese UI and project content support
- Static deployment: crawlable routes with generated GitHub Pages entrypoints
- Quality guardrails: Playwright E2E + CI workflows
- Review who you are and your engineering focus
- Filter projects by category, technology, and status
- Open project details in-page without losing filters/scroll state
- Switch language between English and Traditional Chinese
- Open live demos and source repositories directly
npm install
npm run devThe existing Tailwind 3 toolchain uses an npm override for postcss-selector-parser 7.1.6 to fix GHSA-rj75-hqrm-r3gf without a Tailwind 4 migration. Keep the override until the parent dependencies request a patched version themselves; regenerate the lockfile and run the full gate when changing it. A subprocess regression checks the malicious flat-selector case.
npm run validate:harness
npm ci
npm audit
npm run build
npm run test:e2e- Confirm
baseinvite.config.tsmatches the deployed repo path. - Build with your public site URL so sitemap and robots metadata are generated correctly:
SITE_URL=https://<username>.github.io/<repo> npm run build- this auto-generates both
public/sitemap.xmlandpublic/robots.txt - for security, only
http/httpsSITE_URL values are accepted
- Push to
main. - In repository settings, enable GitHub Pages with GitHub Actions.
- Route-level metadata is handled by
usePageSeoinsrc/utils/seo.ts. public/sitemap.xmlis auto-generated fromsrc/routes/routeConfig.jsonduring build.public/robots.txtis auto-generated fromSITE_URLduring build.- After deployment, submit:
https://<username>.github.io/<repo>/sitemap.xmlto Google Search Console- same URL to Bing Webmaster Tools
src/data/profile.tssrc/data/skills.ts
- Run
npm run sync:projectsto preview GitHub metadata changes. New repositories are listed as review-only candidates and are never inserted automatically. Usenpm run sync:projects -- --writeonly for reviewed demo URL updates to existing entries; curated descriptions are never overwritten. - Curate the canonical project record in
src/data/projects.ts; do not keep automatically generated placeholder copy. - Add/update Traditional Chinese text in
src/data/projects.zh.ts, including descriptions, roles, categories, features, and any challenges/outcomes. Use the optionalnamefield for Chinese display titles. Every current project has translated copy; missing future entries fall back to the canonical English record. - Add the live-demo preview to
src/assets/images/projects/<id>.png(or.webp) and visually verify that data-heavy pages finished loading.- Capture automation only visits public hosts approved in
tools/public-demo-url.mjs; review and explicitly add custom deployment domains.
- Capture automation only visits public hosts approved in
- Capture selected previews in PowerShell:
$env:TARGET_IDS="project-id,another-id"
node tools/capture-project-previews.mjs- Update
progress.mdin the same change with the IDs added, sources checked, files changed, verification evidence, blockers, and next action. - Run the full verification gate shown above plus
git diff --check.
Notes:
- If
demoUrlis missing, the Live Demo button is hidden. - If
repoUrlis missing, the GitHub Repo button is hidden. - If image is missing, cards render a graceful placeholder.
The homepage follows the public GitHub pin order saved in src/data/github-pins.json. Pins map to stable project IDs so both languages show the same projects in the same order, including after repository renames. Only uniquely matched catalogue records appear. Unmatched pins (including this portfolio) and ambiguous monorepo pins are flagged for curation; no placeholders or unrelated filler cards are added. An empty pin list displays no featured cards.
Run npm run sync:pins with GITHUB_TOKEN to query GraphQL, save public pins/matched IDs, and update existing featured flags. The monthly scan performs the same sync using canonical repository URLs to handle renames. API errors preserve the last successful snapshot and fail the job. Rendering needs no network request or token. The initial snapshot was verified against the public profile on 2026-10-06: six pins, five catalogue matches, with LEO0331/portfolio intentionally unlisted.
Monthly Project Maintenance runs on the first of each month at 09:17 Asia/Taipei and can also be started from Actions → Monthly Project Maintenance → Run workflow. The schedule becomes active after the workflow is pushed to the default branch. In Settings → Actions → General, enable Allow GitHub Actions to create and approve pull requests; no additional API key is needed.
The scanner compares repository push timestamps, canonical URLs, descriptions, homepages, default branches, archive status, and root README hashes. It follows repository redirects, handles monorepo links, and paginates the owner's public repositories to list unlisted candidates. The first run records a baseline and opens a draft review PR; later runs open or update that PR only when tracked changes exist. An open maintenance branch is reused without force-pushing, preserving pending curation; merge conflicts stop the job for review.
Approved demo URL updates to existing root-repository projects are proposed automatically. Names, renamed repository links, bilingual copy, new projects, and previews require source/visual review in the draft PR. Changes on the live site without a GitHub push or metadata change are not detected. Merge the curated PR to main to publish through the existing Pages workflow.
The job runs harness validation, unit tests, TypeScript/build, E2E, and diff checks before pushing. Dependency audit findings are attached to the PR/run as advisory results so a security advisory cannot hide project-change findings; resolve them before release. Scan/API errors fail the job without writing a partial baseline. Reports and audit output are uploaded as artifacts. GitHub may delay scheduled runs and disables schedules in inactive public repositories after 60 days; re-enable the workflow in Actions if needed. Additional workflows triggered by the built-in token may require approval, so verification runs inside this job.
Run node tools/scan-project-changes.mjs locally with GITHUB_TOKEN (required for GraphQL pins). It writes .github/project-scan-state.json, .github/project-scan-report.md, src/data/github-pins.json, and proposed demo URLs/featured flags; review these together before accepting the baseline. Pin selections are included in the draft PR.
GitHub references: scheduled workflow behavior and token-triggered workflow behavior.
- Traditional Chinese README: README.zh-TW.md
- Repository agent rules: AGENTS.md
- Feature state: feature_list.json
- Restartable work log: progress.md
- Current-session handoff: session-handoff.md
- Full verification entrypoint for Git Bash/CI (
bash init.sh): init.sh - Workflow skill template: skill.md
- Template usage guide: wiki.md