A modern, performant portfolio website built with Next.js 14+, TypeScript, and Tailwind CSS, showcasing React Native development expertise.
- 🎨 Modern, responsive design
- ⚡ Optimized performance with Next.js App Router
- 🎭 Smooth animations with Framer Motion
- 🎵 Spotify playlist embed
- 📧 Contact form with EmailJS integration
- 📱 Fully responsive (mobile, tablet, desktop)
- ♿ Accessibility-first (WCAG AA compliant)
- 🔍 SEO optimized with meta tags and structured data
- 🎬 Lottie animations for visual appeal
- Framework: Next.js 14+ (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- Animations: Framer Motion, Lottie
- Icons: Lucide React
- Forms: EmailJS
- Deployment: Vercel
This project requires environment variables for the contact form. Create a .env.local file in the root directory and add the following:
NEXT_PUBLIC_EMAILJS_SERVICE_ID=your_emailjs_service_id
NEXT_PUBLIC_EMAILJS_TEMPLATE_ID=your_emailjs_template_id
NEXT_PUBLIC_EMAILJS_PUBLIC_KEY=your_emailjs_public_keyHow to get EmailJS credentials:
-
Create an EmailJS Account:
- Sign up at EmailJS
- Verify your email address
-
Create an Email Service:
- Go to "Email Services" in the dashboard
- Click "Add New Service"
- Choose your email provider (Gmail, Outlook, etc.)
- Follow the setup instructions
- Copy the Service ID to your
.env.local
-
Create an Email Template:
- Go to "Email Templates" in the dashboard
- Click "Create New Template"
- Design your email template with these variables:
{{from_name}}- Sender's name{{from_email}}- Sender's email{{subject}}- Email subject{{message}}- Email message{{meeting_request}}- Meeting request checkbox
- Save and copy the Template ID to your
.env.local
-
Get Public Key:
- Go to "Account" → "General"
- Find your Public Key
- Copy it to your
.env.local
Note: The contact form will show an error if EmailJS is not configured.
NEXT_PUBLIC_SITE_URL=http://localhost:3000Change this to your production URL when deploying (e.g., https://yourname.com).
If you want to run the project without EmailJS, the contact form will show "Email service is not configured" but the site will still function normally.
- Node.js 18+ and npm
- EmailJS Account (for contact form)
- Clone the repository:
git clone <your-repo-url>
cd portfolio-website- Install dependencies:
npm install- Set up environment variables:
cp .env.example .env.localEdit .env.local and add your credentials (see Environment Variables section above for detailed instructions).
- Run the development server:
npm run devOpen http://localhost:3000 in your browser.
Build for production:
npm run buildStart production server:
npm startportfolio-website/
├── app/ # Next.js App Router
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Homepage
│ ├── blog/ # Blog pages
│ └── api/ # API routes
├── components/
│ ├── sections/ # Main section components
│ ├── ui/ # Reusable UI components
│ └── layout/ # Layout components
├── lib/ # Utilities and configurations
│ ├── constants.ts # Site content and configuration
│ ├── animations.ts # Framer Motion variants
│ └── emailjs.ts # EmailJS configuration
└── public/ # Static assets
├── images/ # Images
└── lottie/ # Lottie animation files
Edit lib/constants.ts to update:
- Personal information
- Skills and technologies
- Projects
- Blog posts
- Social media links
- Global styles:
app/globals.css - Tailwind theme: Inline theme in
app/globals.css - Component-specific styles: Use Tailwind utility classes
- Download Lottie JSON files from LottieFiles
- Place them in
public/lottie/ - Import and use with the
LottieAnimationcomponent
- Push your code to GitHub
- Import your repository on Vercel
- Add environment variables in Vercel dashboard
- Deploy!
Vercel will automatically:
- Build your project
- Deploy to a global CDN
- Set up HTTPS
- Enable automatic deployments on push
Target Lighthouse scores:
- Performance: 90+
- Accessibility: 95+
- Best Practices: 95+
- SEO: 100
MIT License - feel free to use this template for your own portfolio!
- Design inspiration from modern portfolio websites
- Built with Next.js
- Animations powered by Framer Motion
- Icons from Lucide