A minimal, aesthetic portfolio website built with Next.js 14, TypeScript, and Tailwind CSS. Designed with a calm, confident, product-engineer aesthetic.
- Minimal Design: Clean, content-first layout with neutral colors
- Modern Tech Stack: Next.js 14 (App Router), TypeScript, Tailwind CSS
- Subtle Animations: Framer Motion with opacity + translate only (200-350ms)
- Content First: Grid-based layout emphasizing readability
- Accessibility: High contrast, keyboard navigable, mobile-first
- Contact Form: EmailJS integration for seamless email communication
- Performance: Optimized for speed and performance
- Node.js 18+ and npm/yarn/pnpm
- EmailJS account (for contact form) - Sign up here
cd personal-portfolio
npm install
# or
yarn install
# or
pnpm install- Sign up for a free account at EmailJS
- Create an email service (Gmail, Outlook, etc.)
- Create an email template
- Get your Service ID, Template ID, and Public Key
Create a .env.local file in the root directory:
NEXT_PUBLIC_EMAILJS_SERVICE_ID=your_service_id
NEXT_PUBLIC_EMAILJS_TEMPLATE_ID=your_template_id
NEXT_PUBLIC_EMAILJS_PUBLIC_KEY=your_public_keyUpdate the following files with your personal information:
- Hero Section:
components/sections/Hero.tsx- Update name and title - About Section:
components/sections/About.tsx- Update bio - Experience Section:
components/sections/Experience.tsx- Update experience - Projects Section:
components/sections/Projects.tsx- Add your projects - Footer:
components/sections/Footer.tsx- Update social links - Metadata:
app/layout.tsx- Update SEO metadata
npm run dev
# or
yarn dev
# or
pnpm devOpen http://localhost:3000 in your browser.
- Install Vercel CLI:
npm i -g vercel- Login to Vercel:
vercel login- Deploy:
vercel- Add environment variables in Vercel dashboard:
- Go to your project settings
- Navigate to "Environment Variables"
- Add the three EmailJS variables
- Push your code to GitHub
- Go to Vercel
- Click "New Project"
- Import your GitHub repository
- Add environment variables in the project settings
- Click "Deploy"
personal-portfolio/
βββ app/
β βββ globals.css # Global styles
β βββ layout.tsx # Root layout
β βββ page.tsx # Home page
βββ components/
β βββ animations/ # Animation utilities
β β βββ ScrollReveal.tsx
β β βββ variants.ts
β βββ sections/ # Page sections
β βββ Hero.tsx
β βββ About.tsx
β βββ Projects.tsx
β βββ Experience.tsx
β βββ Contact.tsx
β βββ Footer.tsx
βββ public/ # Static assets
βββ .env.local # Environment variables (create this)
βββ next.config.js
βββ tailwind.config.ts
βββ tsconfig.json
βββ package.json
This portfolio follows a minimal, product-engineer aesthetic:
- Neutral Colors: Off-white or near-black backgrounds (respects system dark mode)
- One Accent Color: Blue (#2563eb) used sparingly
- No Visual Gimmicks: No gradients, glows, or particles
- Large Spacing: Generous whitespace for readability
- Clean Typography: System fonts with proper hierarchy
- Content First: Grid-based layout emphasizing content
- Subtle Motion: Animations support readability, never decoration
The portfolio uses CSS variables that automatically adapt to light/dark mode. To customize:
Edit app/globals.css:
:root {
--color-accent: #2563eb; /* Change accent color */
--color-bg: #fafafa; /* Light mode background */
--color-text: #171717; /* Light mode text */
}
@media (prefers-color-scheme: dark) {
:root {
--color-bg: #0a0a0a; /* Dark mode background */
--color-text: #fafafa; /* Dark mode text */
}
}Animation variants are defined in components/animations/variants.ts. All animations use:
- Opacity + translate only
- Duration: 200-350ms
- Ease-out timing
- No spring physics
- Verify your environment variables are set correctly
- Check that your EmailJS service is active
- Ensure your template has the correct variable names:
{{from_name}},{{from_email}},{{message}}
- Clear
.nextfolder:rm -rf .next - Reinstall dependencies:
rm -rf node_modules && npm install - Check TypeScript errors:
npm run build
This project is open source and available under the MIT License.
Built with a focus on clarity, performance, and content.

