Harry Ashton — Senior frontend engineer (contract & consulting). This repository is the source for my portfolio site; stack and setup are documented below if you need them.
- Visual system — Paper-and-ink palette, hairline borders, hard shadows, monospace captions (Tailwind CSS v4 + design tokens in
src/styles/globals.css). - Hero — Custom
HeroVideoplayer (poster, fullscreen dialog, keyboard-friendly controls, reduced-motion aware). - Work — Case studies from
src/content/work/*.mdxwith dynamic/work/[slug]routes. - Contact — React Hook Form + Zod;
POST /api/contactsends mail via Resend when configured, otherwise returns a graceful fallback formailto:. - SEO — Metadata, Open Graph image,
robots.txt,sitemap.xml, JSON-LDPersonschema. - Analytics — Vercel Analytics & Speed Insights (optional in production).
| Layer | Choices |
|---|---|
| Framework | Next.js 15 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS v4, Framer Motion |
| Content | MDX (gray-matter, @next/mdx / remote MDX pipeline as wired in the app) |
| Forms | react-hook-form, Zod |
| Icons | simple-icons, bespoke brand SVGs where needed |
- Node.js ≥ 18.18 (recommended: 20.x)
- pnpm (package manager for this repo)
pnpm install
pnpm devOpen http://localhost:3000.
pnpm lint # ESLint
pnpm build # production build (Turbopack)
pnpm start # run production server locallyCreate a .env.local (not committed) for production-like behavior:
| Variable | Purpose |
|---|---|
NEXT_PUBLIC_SITE_URL |
Canonical site URL (metadata, OG, sitemap). Example: https://hashton.vercel.app |
RESEND_API_KEY |
Resend API key — contact form sends email when set |
CONTACT_EMAIL |
Inbox address for contact submissions |
CONTACT_FROM |
Optional Resend from string (defaults in API route if unset) |
If RESEND_API_KEY or CONTACT_EMAIL is missing, the API still responds successfully with fallback: true so the UI can open the user’s mail client instead.
src/
app/ # App Router pages, API routes, OG image
components/ # Layout, sections, video, UI primitives
content/work/ # MDX case studies
lib/ # Site config, nav, data helpers
styles/ # Global CSS + Tailwind theme
public/ # Static assets (e.g. video, posters)
Configured for Vercel: connect the repo, set the env vars above, and deploy. Asset-heavy routes are static where possible; /api/contact runs on the Edge/Node runtime per Next defaults.
I maintain this repo at @thehashton.
