Campaign website for Mark Henrickson, candidate for Salem City Council.
Live site: https://henricksonforsalem.pages.dev
- Vite + React + TypeScript — a purely static site: no backend, no forms, no network calls at runtime.
- Tested with Vitest + Testing Library; linted with ESLint.
- Hosted on Cloudflare Pages.
Requires Node 24.
npm install
npm run dev # local dev server
npm test # lint + typecheck + unit tests (coverage)
npm run build # production build to dist/Deploys are automatic: CircleCI's deploy job runs on main after the
build (test) job passes, and pushes dist/ to Cloudflare Pages via
Wrangler. Red tests block the deploy. Auth comes from the
CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID CircleCI project env vars.
For a manual/fallback deploy:
npm run build
npx wrangler pages deploy dist --project-name henricksonforsalem --branch main- Default branch is
dev; PRs are opened as drafts againstdevand reviewed there. dev→mainrelease merges are done by the repo owner.
- Domain-day runbook — the account-handoff / domain-registration session script.
MIT