A unique, interactive portfolio website featuring an innovative constellation-style "Map of Me" navigation system. Built with React, Next.js 14, TypeScript, Tailwind CSS, and Framer Motion.
- Interactive Constellation Navigation: Navigate through different sections using an animated star map
- Full-Screen Hero Section: Welcoming introduction with smooth animations
- Professional Section: Showcase your research, projects, and publications
- Substack Integration: Automatically pulls and displays your latest writing from Substack
- Reading & Movies Sections: Editable lists with ratings and covers
- Contact Form: Simple form for visitors to get in touch
- Dark/Light Theme: Seamless theme switching with next-themes
- Smooth Animations: Framer Motion powers all transitions and interactions
- Fully Responsive: Optimized for desktop, tablet, and mobile
- Node.js 18+ (Note: create-next-app requires Node 20.9.0+, but the app will run on 18+)
- npm or yarn
- Clone or navigate to the repository:
cd "/Users/dagarwal/Desktop/Claude Exp/portfolio"- Install dependencies:
npm install- Run the development server:
npm run dev- Open http://localhost:3000 in your browser
Edit src/data/personal.json:
{
"name": "Your Name",
"tagline": "Your Tagline",
"bio": "Your bio...",
"email": "your.email@example.com",
"substackUrl": "https://yoursubstack.substack.com/feed",
"socialLinks": [...]
}Edit src/data/professional.json to update:
- Job title and company
- Research interests
- Projects
- Publications
Edit src/data/books.json:
{
"books": [
{
"id": "book-1",
"title": "Book Title",
"author": "Author Name",
"cover": "/images/book-covers/book.jpg",
"rating": 5,
"year": 2024,
"notes": "Optional notes"
}
]
}Add book cover images to public/images/book-covers/
Edit src/data/movies.json:
{
"movies": [
{
"id": "movie-1",
"title": "Movie Title",
"director": "Director Name",
"year": 2024,
"rating": 5,
"genre": "Genre"
}
]
}Edit src/data/map-config.json to change:
- Node positions (x, y coordinates from 0-100)
- Node labels
- Connections between nodes
Example:
{
"nodes": [
{
"id": "professional",
"label": "Professional",
"targetSection": "professional",
"position": { "x": 30, "y": 35 }
}
],
"connections": [
{ "from": "professional", "to": "writing" }
]
}Edit src/config/theme.ts to change the color scheme. Values are in HSL format.
- Create a new component in
src/components/sections/ - Add the section to
src/app/page.tsx - Add a corresponding node in
src/data/map-config.json - The section ID must match the
targetSectionin the map config
The constellation view is in src/components/map/ConstellationView.tsx. You can modify:
- Node appearance (circle size, colors, glow effects)
- Connection line styles
- Animation timing and effects
The contact form API route is at src/app/api/contact/route.ts. Integrate with:
- SendGrid
- Nodemailer
- AWS SES
- Resend
- Or any other email service
Example with SendGrid:
import sgMail from '@sendgrid/mail';
sgMail.setApiKey(process.env.SENDGRID_API_KEY!);
const msg = {
to: 'your-email@example.com',
from: 'noreply@yourdomain.com',
subject: `Contact from ${name}`,
text: message,
html: `<p>${message}</p>`,
};
await sgMail.send(msg);To add RSS feeds beyond Substack, modify src/lib/rss-parser.ts and create new API routes similar to src/app/api/substack/route.ts.
portfolio/
├── public/ # Static assets
│ └── images/ # Images (profile, book covers, etc.)
├── src/
│ ├── app/ # Next.js app router
│ │ ├── api/ # API routes
│ │ ├── layout.tsx # Root layout
│ │ ├── page.tsx # Main page
│ │ └── globals.css # Global styles
│ ├── components/
│ │ ├── map/ # Map navigation components
│ │ ├── sections/ # Content sections
│ │ ├── ui/ # Reusable UI components
│ │ └── layout/ # Layout components
│ ├── data/ # JSON content files
│ ├── lib/ # Utility functions
│ ├── types/ # TypeScript types
│ └── config/ # Configuration files
└── ...
npm run build
npm start- Push your code to GitHub
- Import the repository in Vercel
- Deploy
Or use the Vercel CLI:
npm install -g vercel
vercelThis Next.js app can be deployed to:
- Netlify
- AWS Amplify
- Railway
- Render
- Any platform supporting Node.js
- Next.js 14 - React framework with App Router
- TypeScript - Type safety
- Tailwind CSS - Utility-first styling
- Framer Motion - Animations and interactions
- next-themes - Dark/light mode
- rss-parser - RSS feed parsing
- Lucide React - Icons
- Check that your Substack URL is correct in
src/data/personal.json - Ensure the URL ends with
/feed - Check the browser console for errors
- Verify the feed is publicly accessible
- Ensure images are in
public/images/book-covers/ - Check that the path in
books.jsonmatches the actual file - Use relative paths starting with
/images/
- Adjust
xandyvalues insrc/data/map-config.json - Values should be between 0-100 (percentage of container)
- Test on different screen sizes
- Ensure
next-themesis properly installed - Check that
ThemeProviderwraps your app inlayout.tsx - Clear browser cache
MIT License - Feel free to use this template for your own portfolio!
For issues or questions:
- Check this README
- Review the code comments
- Check Next.js documentation: https://nextjs.org/docs
- Check Framer Motion docs: https://www.framer.com/motion/
Built with React, Next.js, TypeScript, and Tailwind CSS