Personal portfolio site. Built with Next.js 16, TypeScript, Tailwind CSS, and Framer Motion. Deployed on Vercel.
git clone https://github.com/Surfrrosa/portfolio.git
cd portfolio
npm install
npm run devOpen http://localhost:3000.
src/
app/
layout.tsx Root layout, fonts, video background, SEO metadata
page.tsx Home -- hero GIF with clickable TV hotspot navigation
about/page.tsx About page
contact/page.tsx Contact form (Resend integration)
method/page.tsx Method page
work/page.tsx Work showcase with project cards
writing/page.tsx Blog listing
writing/[slug]/ Individual blog post
api/contact/route.ts Contact form API endpoint
components/ Sidebar, Typewriter, VideoBackground, carousels, etc.
lib/
blog.ts Blog post parsing (gray-matter, MDX)
phases.ts Phase configuration
content/
blog/ MDX blog posts
public/
images/ Static images and hero GIF
videos/ Background video loops, project previews
diagrams/ SVG diagrams (Nortal project)
media/ Project-specific media assets
| Token | Value | Usage |
|---|---|---|
bg-base |
#0B0C0E |
Primary dark background |
surface |
#14161A |
Card and section backgrounds |
accent-teal |
#2BD4CF |
Primary accent, CTAs, highlights |
Display fonts: Archivo, League Spartan, Bebas Neue Body font: Inter
- Framework: Next.js 16 (App Router)
- Language: TypeScript 5
- Styling: Tailwind CSS 3.3 with custom design tokens
- Animations: Framer Motion 12, Lenis (smooth scroll)
- 3D: Three.js with React Three Fiber
- Blog: MDX with gray-matter frontmatter
- Contact form: Resend for email delivery
- Analytics: Vercel Analytics, Google Analytics
npm run dev # Development server
npm run build # Production build
npm start # Production server
npm run lint # ESLintDeployed on Vercel with automatic deploys from main.
Live: shainapauley.com
The /api/contact endpoint uses Resend for email delivery.
- Add domain in Resend and verify DNS (done for shainapauley.com)
- Create API key at resend.com/api-keys
- Copy
.env.exampleto.env.localand fill in values - Restart dev server
- For production: add the same environment variables in Vercel Settings
RESEND_API_KEY=your_api_key
CONTACT_FROM_EMAIL=hello@shainapauley.com
CONTACT_TO_EMAIL=your_email@example.comcurl -i -X POST http://localhost:3000/api/contact \
-H "Content-Type: application/json" \
-d '{"name":"Test","email":"test@example.com","message":"Hello"}'| Status | Error | Fix |
|---|---|---|
| 401 | API key invalid | Check RESEND_API_KEY in .env.local |
| 400 | Missing fields | Ensure name, email, message are provided |
| 500 | Send failed | Verify CONTACT_FROM_EMAIL domain is verified in Resend |
MIT. See LICENSE.