A modern, responsive portfolio website built with Next.js 14, featuring a liquid glass design aesthetic and an intelligent local chatbot.
- Liquid Glass Design: Beautiful glassmorphism effects with animated SVG blobs
- Responsive Layout: Optimized for all devices and screen sizes
- Local Chatbot: Interactive AI assistant (Duong) that answers questions about your profile
- Keyboard Shortcuts: Ctrl/Cmd+K to open chatbot, Esc to close
- Dynamic Content: All content managed through a single JSON file
- Smooth Animations: Powered by Framer Motion for delightful interactions
- SEO Optimized: Built with Next.js 14 App Router for optimal performance
- Vercel Ready: One-click deployment to Vercel
- Framework: Next.js 14 (App Router)
- Language: TypeScript
- Runtime: Node.js
- CSS Framework: Tailwind CSS with custom theme
- Animation Library: Framer Motion
- Icons: Lucide React
- Design System: Custom glassmorphism components
- Content Format: MDX (Markdown + JSX) for blog posts
- Markdown Processing:
@next/mdxfor MDX compilationgray-matterfor frontmatter parsingremark-gfmfor GitHub Flavored Markdownremark-frontmatterfor frontmatter support
- Reading Time:
reading-timefor post duration calculation - Remote MDX:
next-mdx-remotefor dynamic content rendering
- Package Manager: npm
- Linting: ESLint with Next.js configuration
- TypeScript Config: Strict mode with path mapping
- Development Scripts: Custom post creation with
ts-node
- Deployment Platform: Vercel
- Build Output: Static export optimized
- Image Optimization: Disabled for static export compatibility
- Neural Sudoku Visualization: Custom React hooks and animations
- Interactive Chatbot: Local AI assistant with keyword matching
- Responsive Design: Mobile-first approach with custom breakpoints
- Dark Theme: Custom blue gradient color scheme with glass effects
portfolio/
βββ app/
β βββ globals.css # Global styles and CSS variables
β βββ layout.tsx # Root layout component
β βββ page.tsx # Home screen with navigation
β βββ portfolio/
β βββ page.tsx # Portfolio page with all sections
βββ components/
β βββ Card.tsx # Reusable glass card component
β βββ duong/
β β βββ Chatbot.tsx # Local chatbot with Q&A functionality (renamed from Lam)
β βββ ui/
β β βββ GlowButton.tsx # Animated button component
β β βββ Separator.tsx # Decorative separator component
β βββ LiquidGlassWrapper.tsx # SVG blob animations and glass effects
β βββ Navbar.tsx # Navigation with smooth scrolling
β βββ ProjectCard.tsx # Project showcase cards
β βββ SectionWrapper.tsx # Section layout wrapper
βββ data/
β βββ profile.json # Your profile data (edit this!)
βββ public/
β βββ images/ # Your images (profile, projects, etc.)
βββ next.config.js # Next.js configuration
βββ tailwind.config.js # Tailwind theme and animations
βββ vercel.json # Vercel deployment configuration
-
Install dependencies
npm install
-
Start development server
npm run dev
-
Open your browser Visit http://localhost:3000
-
Update your profile data Edit
/data/profile.jsonwith your information:- Personal details
- Education history
- Work experience
- Projects
- Skills and technologies
- Awards and certifications
-
Add your images Place your images in
/public/images/:profile.jpg- Your profile photoproject1.jpg,project2.jpg, etc. - Project screenshots
-
Customize the design Modify
/tailwind.config.jsto adjust:- Color scheme
- Animations
- Breakpoints
-
Push to GitHub
git init git add . git commit -m "Initial portfolio setup" git branch -M main git remote add origin https://github.com/yourusername/portfolio.git git push -u origin main
-
Deploy on Vercel
- Visit vercel.com
- Click "New Project"
- Import your GitHub repository
- Vercel will auto-detect Next.js and deploy
-
Install Vercel CLI
npm i -g vercel
-
Deploy
vercel
-
Follow the prompts
- Link to existing project or create new
- Choose deployment settings
- Your site will be live in minutes!
The color palette is defined in tailwind.config.js:
colors: {
blue: {
950: '#0c1445', // Darkest background
900: '#1e3a8a', // Main background
// ... more shades
},
cyan: {
400: '#22d3ee', // Accent color
500: '#06b6d4', // Secondary accent
}
}The /data/profile.json file contains all your content:
{
"personal": {
"name": "Your Name",
"title": "Your Title",
"bio": "Your bio...",
"profileImage": "/images/profile.jpg"
},
"education": [...],
"experience": [...],
"projects": [...],
"skills": {...},
"awards": [...]
}Customize chatbot responses in the chatbot.responses section of profile.json. The bot uses keyword matching to provide relevant answers about:
- Skills and technologies
- Work experience
- Projects
- Education
- Contact information
To add a new section:
- Add data to
profile.json - Create a new section in
app/page.tsx - Add navigation link to
components/Navbar.tsx
To integrate with external APIs (OpenAI, Anthropic, etc.):
- Copy
.env.exampleto.env.local - Add your API keys
- Modify the
generateReplyfunction inChatBot.tsx
Example integration:
// In ChatBot.tsx
async function generateReply(question: string): Promise<string> {
// Use profile data for context
const context = JSON.stringify(profileData);
// Call your preferred AI API
const response = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ question, context })
});
return response.json();
}The site is optimized for performance with:
- Static export for fast loading
- Image optimization (when not using static export)
- Code splitting with Next.js App Router
- Lazy loading of components
- Efficient animations with Framer Motion
- Images: Keep images under 1MB for fast loading
- Content: Keep descriptions concise but informative
- Skills: Update skill levels honestly and regularly
- Projects: Include live demos when possible
- SEO: Update meta tags in
layout.tsx
- Images not loading: Ensure images are in
/public/images/and paths start with/images/ - Build fails: Check TypeScript errors with
npm run build - Styles not applying: Verify Tailwind classes are correct and CSS is imported
- Check the Next.js documentation
- Review Tailwind CSS docs
- Consult Framer Motion guides
MIT License - feel free to use this template for your own portfolio!
Built with β€οΈ using Next.js, TypeScript, and Tailwind CSS