My personal site, live at leoncheng.dev.
A small home on the web for a short intro and the occasional blog post.
The homepage is an intentionally minimal landing page:
- A short intro and profile image
- Links to find me elsewhere:
- GitHub: leoncheng57
- Email: [email protected]
- A link into the blog
The blog lives at /blog and is where I write up things I've been thinking about — usually around software, developer tools, and how the craft of building software is changing.
Posts are written in Markdown and kept in src/content/blog/, one file per article.
The /repo section explains the CI, production
deployment, pull-request preview, and planning flows used by this repository.
Install dependencies and start Vite locally:
npm install
npm run devRun the same validation used by pull-request CI:
npm run lint
npm run test:run
npm run buildGitHub Actions owns production and preview deployments. The generated docs/
directory is deployment input; source changes belong in src/ and public/.
- Pushes to
mainbuild the site at/and deploy it to the root of thegh-pagesbranch. - Pull requests build with a PR-specific base path and deploy to
gh-pages:/previews/pr-<number>/. - The preview workflow posts
https://leoncheng.dev/previews/pr-<number>/to the pull request and removes that directory when the pull request closes. - Production deploys preserve the entire
previews/subtree.
GitHub Pages must use Deploy from a branch, with gh-pages and /(root)
as its publishing source. All gh-pages workflows use non-force pushes so their
commits cannot overwrite one another. Production deploys use their own
gh-pages-production concurrency group, so PR runs can never cancel a queued
production deploy; each PR's preview and screenshot runs share a
gh-pages-pr-<number> group.
For the initial migration from main:/docs, run the production deployment
manually and verify index.html, CNAME, .nojekyll, and assets/ exist on
gh-pages before changing the Pages publishing source.