About | Features | Stack | Setup | License
Personal portfolio: neutral, minimalist, with proper light and dark mode. Built with Next.js 15 and TypeScript.
| Route | What's there |
|---|---|
/ |
Hero, experience, education, and community |
/work |
Selected projects with source and live links |
/writing |
Technical blog (MDX-based) |
/contact |
Contact form, delivered via Resend |
- Light theme by default, with a dark mode toggle (persisted, respects system preference)
- Single accent color, no cards or shadows, hairline dividers throughout
- Fully responsive down to mobile widths
- Next.js 15: App Router
- TypeScript
- Tailwind CSS + shadcn/ui
- next-themes: light/dark mode
- MDX: technical blog
- Resend: contact form delivery
- Vercel Analytics
Prerequisites: Node.js v18.17+, npm, Git.
git clone https://github.com/harshhh28/portfolio
cd portfolio
npm install
npm run dev
# → http://localhost:3000Environment variables: create .env at the root:
# Contact form (required for /contact to deliver mail)
RESEND_API_KEY=your_resend_api_key
RESEND_FROM_EMAIL=onboarding@resend.dev
EMAIL_RECIPIENT=your_email@example.com
# Blog view counts (optional; counts are hidden when unset)
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=Share images (/opengraph-image), sitemap.xml, and robots.txt are generated by Next.js from src/app, so they stay in sync as posts are added. Set the production domain in src/lib/site.ts.
Resend:
- Create a Resend account.
- Generate an API key.
- Add your verified domain or use the default
onboarding@resend.devfor testing.
MIT: see LICENSE.
Made with ❤️ by Harsh Gajjar