Personal site of Bingqin Wang, live at bingqin2.github.io. Plain HTML, CSS, and JavaScript with no framework and no build step. The same files are also packaged as a small nginx container image, with Kubernetes manifests to run it anywhere.
| Path | What it is |
|---|---|
site/ |
The static site. index.html holds all content: the bio for each persona is in the <template> elements, and the Experience, Projects, and Publications panels are plain HTML sections. |
site/assets/css/style.css |
Design tokens (:root for light, html[data-theme="dark"] for dark) and layout. |
site/assets/js/main.js |
Light/dark toggle (whole-page crossfade via the View Transitions API, with a CSS fallback), persona switch, quick-link panels, greeting bubble, click sparkles. |
site/assets/img/avatar-256.png, avatar-320.png, avatar.png |
The avatar (transparent PNG). The page loads the 256 or 320 px file through srcset; the 512 px file is the Open Graph preview. The hero shows it unmasked; the navbar crops it into a circle with CSS. |
Inline SVG sprite at the top of index.html |
The eleven icons (Font Awesome Free, CC BY 4.0, plus the Google Scholar mark from Simple Icons, CC0), so no icon font is downloaded. |
site/files/CV_English_Bingqin_Wang.pdf |
The public résumé (no phone number). |
site/CoDraft/ |
CoDraft's own website at /CoDraft/, standalone from the rest of the site: index.html and codraft.css, in the colors and type of the CoDraft application, with an Open CoDraft button that leads to the public demo at https://codraft-demo.onrender.com. Screenshots in images/ are WebP, 1280 and 2560 px wide (390 and 780 px for the phone), picked through srcset, and images/og.jpg is the Open Graph preview. |
Dockerfile, docker/nginx.conf, compose.yaml |
nginx image: unprivileged user, port 8080, gzip, cache and security headers, custom 404 page, /healthz. |
deploy/k8s/ |
Kustomize manifests: a base (Deployment, Service, Ingress) and a ci overlay used by the workflow. |
.github/workflows/ |
CI checks, GitHub Pages deployment, container image publishing. |
Static files only:
python3 -m http.server 8000 --directory siteThe container, exactly as it runs in production:
docker compose up --buildThen open http://localhost:8000 or http://localhost:8080.
- GitHub Pages. A push to
masterthat touchessite/runspages.yml, which uploadssite/as the Pages artifact and deploys it. Nothing is generated at deploy time. - Container image. The same push runs
image.yml, which builds a multi-arch image (amd64 and arm64) and pushesghcr.io/bingqin2/bingqin2.github.iotaggedlatestandsha-<commit>. - Kubernetes.
kubectl apply -k deploy/k8s/baseruns two replicas behind a ClusterIP Service and an Ingress (edit the host iningress.yaml). The pod runs as non-root on a read-only root filesystem with all capabilities dropped, a seccomp profile, readiness and liveness probes on/healthz, and resource requests and limits.
ci.yml runs three jobs in parallel:
- HTML and links.
html-validateon every page andlycheeon every internal link. - Lighthouse. Lighthouse CI against the static site: accessibility, best practices, and SEO must score at least 90, and performance warns below 85.
- Container and Kubernetes. Builds the image and smoke tests it over HTTP, validates the rendered manifests with
kubeconform, then deploys the image to a throwaway kind cluster and checks the site through the Service.
Dependabot keeps the actions and the nginx base image up to date.