Source code for danhenderson.dev, a React + TypeScript portfolio site with an interactive CV (& CV story mode), climbing log, photography galleries, and a public editorial blog.
| Route | What it contains |
|---|---|
/ |
Home page with the welcome audio prompt |
/cv |
Interactive CV, downloadable resume, and GitHub-backed highlights with bundled fallbacks |
/blog and /blog/:slug |
Editorial blog index and post detail pages |
/climbing |
Climbing ticks and wish-list views |
/photography and /photography/:slug |
Photography collection index and album pages |
- Fully client-side single-page app built for static hosting.
- Portfolio content is authored in local TypeScript data modules.
- GitHub-powered CV sections degrade gracefully to bundled content when live API data is unavailable.
- Shared motion, theming, and reusable UI primitives power the different sections of the site.
src/constants/runtimeEnvironment.tsresolves the app runtime environment fromREACT_APP_RUNTIME_ENVorNODE_ENV.- Override the resolved runtime at build time with
REACT_APP_RUNTIME_ENV=development|test|productionwhen a workflow needs a non-default bundle. - The resolved runtime is used for environment-sensitive client behavior and Playwright test-build parity.
npm run buildcreates the production bundle.npm run build:e2ecreates the test-runtime bundle used for Playwright Chromium coverage and test-runtime validation.- Both build variants route through
scripts/buildWithMetadata.js, use Vite for bundling, and stamp git SHA, build time, and package version into the bundle so the footer scorecard reflects the built artifact instead of runtime placeholders.
npm run test:e2eruns the full local Playwright suite by building the test-runtime bundle forchromiumfirst and then rebuilding the production bundle forsmoke.npm run build:e2e && npm run test:e2e:chromiumis the targeted path for Chromium browser coverage.npm run build && npm run test:e2e:smokeis the targeted path for production smoke coverage.
- Default-branch coverage is published to Codecov from the Jest coverage run in
.github/workflows/codecov.yml. - The uploaded report comes from
CI=true npm test -- --watchAll=false --passWithNoTests --coverage, so it reflects the unit and component test suite rather than the Playwrighte2eandsmokejobs. - Browse line, patch, and commit-level coverage details in the Codecov project dashboard.
- React 18
- TypeScript
- React Router v6
- MUI + Emotion
- MUI X DataGrid
- Vite for local development and production builds
- The main app now uses Vite for
npm start,npm run build, andnpm run build:e2e. - The main app toolchain baseline is Node 20.19 or newer and TypeScript 5.6.x.
- Jest configuration is owned by
jest.config.cjs, ESLint configuration is owned byeslint.config.cjs, andnpm run typecheckusestsconfig.typecheck.json.
Setup, testing, project structure, and contribution guidelines live in CONTRIBUTING.md.
Architecture, design system, motion, theme, and engineering docs live in docs/.
To browse them as a rendered site locally:
cd docs-site && npm install && npm startSee docs-site/README.md for build, deploy, and authoring details.