Portfolio Deployment (h5h.me)
The portfolio at h5h.me lives in code/apps/web/ (React 19 + Vite 7). It has two deployment paths — Vercel is production; the Dockerfile is a publishable fallback.
Architecture
- npm workspace monorepo rooted at
code/apps/package.json(workspaces: ["*"]). - Two workspaces:
web/(portfolio) anddashboard/(experimental — see apps/dashboard/README). - Root scripts proxy to the
webworkspace:npm run dev,npm run build. - Portfolio depends on
@vercel/analyticsand@vercel/speed-insights(they are no-ops off Vercel).
Path A — Vercel (production)
code/vercel.json:
json
{
"buildCommand": "cd apps && npm run build:all",
"outputDirectory": "apps/web/dist",
"installCommand": "cd apps && npm ci"
}- The Vercel project's root directory is
code/(not the repo root). build:allbuilds bothwebanddashboardworkspaces but onlyapps/web/distships.- DNS:
h5h.meandwww.h5h.mepoint to Vercel (outside the Cloudflare Tunnel — tunnel only handles*.h5h.mesubdomains). - Analytics + Speed Insights activate automatically on Vercel deployments.
Path B — Docker (Docker Hub / self-host)
code/Dockerfile builds a static Nginx container with just the portfolio:
bash
cd code
make build-web # docker build -t h5h .
docker run -p 8080:80 h5h- Multi-stage:
node:25-alpinebuildsapps/web,nginx:alpineserves/app/web/dist. - Image is safe to push to Docker Hub —
.dockerignoreexcludes.env*,docker/,scripts/,homelab-data,*.md. - Not currently pushed by CI;
ci.ymlonly performs a dry-rundocker build. Uncomment thedocker/login-actionblock inci.ymlto enable pushes.
CI — .github/workflows/ci.yml
Runs on every push/PR to main:
npm ciincode/apps.npm run lint(ESLint 9 flat config overweb/src).npm run build(portfolio) +npm run build:dashboard(experimental dashboard — proves it still compiles).- On
main: dry-rundocker build -t h5h:ci code/.
Local dev
bash
cd code
make dev # cd apps && npm run dev — Vite on :5173
# or
cd apps && npm run dev:dashboard # Vite on :3000 for the experimental dashboardTheming
Themes and font stacks are in code/apps/web/src/themeConfig.js:
- 5 themes:
serika_dark(default),phantom,retro,miami_nights,matrix. - 5 fonts: JetBrains Mono (default), Fira Code, IBM Plex Mono, Space Grotesk, Inter Tight.
- Preference persists in
localStorageunderh5h:theme/h5h:font.
Not published
The portfolio is intentionally separate from the homelab auth stack — it has no Authentik middleware and is served straight from Vercel. Do not add SSO without also solving the cold-start/bootstrap problem (can't log in if Authentik is down).