This project is a personal portfolio built with Next.js and styled using Tailwind CSS. It is fully front-end and serves as a space to showcase projects, experience, and contact information.
The application uses the Next.js App Router and a collection of custom components for layout, navigation, theming, and content display. All timeline and portfolio information is sourced from /data/portfolio-data.ts, which centralizes the project and experience data.
- Next.js (App Router)
- React
- TypeScript
- Tailwind CSS
- PostCSS
- ESLint
- Frontend: The contact page uses Cloudflare Turnstile and submits the form plus the
cf-turnstile-responsetoken to/api/contact. - API route:
/api/contactverifies the token with Cloudflare, then sends the message via the Mailgun API. No third-party form service is used.
Copy .env.example to .env.local and set:
- Turnstile:
NEXT_PUBLIC_TURNSTILE_SITEKEY,TURNSTILE_SECRET_KEY(use testing keys locally). - Mailgun:
MAILGUN_API_KEY,MAILGUN_DOMAIN,MAILGUN_FROM,MAILGUN_TO. For EU, setMAILGUN_HOST=https://api.eu.mailgun.net.
This project is primarily client-side. The contact form is handled by the /api/contact route (Turnstile + Mailgun). All other assets and data are stored locally.