A modern, responsive portfolio website built with Next.js, showcasing UX design work, projects, and blog content powered by Notion.
-
Project Showcase: Interactive project pages with detailed case studies
- Mozilla (AI Design, Privacy-first)
- Vision Track (UX Research, B2B SaaS)
- Lilypad (UI Design, Landing Page)
- Personal hobbies (Photography, Camping)
-
Notion Integration: Blog and content management powered by Notion API
-
AI Chat: Interactive chat interface using OpenAI SDK
-
Responsive Design: Mobile-first design with smooth animations
-
Scroll Spy Navigation: Active section highlighting on scroll
-
UI Components: Custom components built with shadcn/ui and Tailwind CSS
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS 4.0
- UI Components: shadcn/ui
- Animations: Framer Motion
- Content: Notion API
- AI: OpenAI SDK (Vercel AI SDK)
- Package Manager: Bun
- Bun installed on your system
- Clone the repository:
git clone <repository-url>
cd portfolio- Install dependencies:
bun install- Set up environment variables:
cp .env.example .env.local-
Configure your environment variables (see Environment Variables below)
-
Run the development server:
bun dev- Open http://localhost:3000 in your browser
Create a .env.local file in the root directory with the following variables:
# Notion API Configuration
NOTION_API_KEY=your_notion_api_key
NOTION_PAGES_DATABASE_ID=your_notion_database_id
# OpenAI Configuration (for chat feature)
OPENAI_API_KEY=your_openai_api_key- Go to Notion Integrations
- Create a new integration
- Copy the API key
- Share your Notion database with the integration
- Copy the database ID from the database URL
portfolio/
βββ src/
β βββ app/ # Next.js app directory
β β βββ (projects)/ # Project pages route group
β β β βββ mozilla/
β β β βββ vision-track/
β β β βββ lilypad/
β β β βββ vercel/
β β β βββ hobby/
β β βββ (designs)/ # UI templates route group
β β βββ about/ # About page
β β βββ blog/ # Blog pages
β β βββ contact/ # Contact page
β β βββ api/ # API routes
β β β βββ chat/ # Chat API endpoint
β β βββ layout.tsx # Root layout
β βββ components/
β β βββ ui/ # Reusable UI components
β β βββ ui-block/ # Page-specific components
β β βββ demo/ # Demo components
β β βββ magicui/ # Magic UI components
β βββ lib/
β βββ notion.ts # Notion API utilities
β βββ utils.ts # Utility functions
β βββ compose-refs.ts # React ref composition
βββ public/ # Static assets
βββ package.json
- Accordion
- Badge
- Button
- Card
- Navigation Menu
- Scroll Spy
- Tabs
- And more...
- Header with navigation
- Footer
- Home Hero Section
- Project Cards
- Notion Content Renderer
- Chat Interface
- CTA Section
# Start development server
bun dev
# Build for production
bun run build
# Start production server
bun run start
# Run linter
bun run lint- TypeScript strict mode enabled
- No
anytypes allowed - Prefer
constoverlet - Use async/await over promises
- Direct imports (e.g.,
useMemonotReact.useMemo)
- Push your code to GitHub
- Import your repository in Vercel
- Add your environment variables in the Vercel dashboard
- Deploy!
The site will automatically deploy on every push to your main branch.
The site can be deployed to any platform that supports Next.js:
- Netlify
- AWS Amplify
- Railway
- Or any Node.js hosting service
Content is managed through Notion. To add or update:
-
Create or edit pages in your Notion database
-
Ensure pages have the required properties:
Name(Title)Path(Rich text - URL slug)Date(Date)Image(Files)Subtitle(Rich text)Category(Select)Visibility(Select - "Visible" for published)
-
The site will automatically fetch and display the content
The homepage features an interactive scroll spy that highlights the active project section as you scroll.
Blog posts and project content are fetched from Notion, allowing for easy content updates without code changes.
Interactive chat interface powered by OpenAI, accessible via the /api/chat endpoint.
Mobile-first approach with breakpoints optimized for all device sizes.
This is a personal portfolio project. If you'd like to use it as a template or reference, feel free to fork and adapt it to your needs!
This project is private and personal. All rights reserved.
Jessica Cheng
- Portfolio: jessicacheng.studio
- UX Designer focused on privacy-first design, scalable systems, and ethical AI experiences
Built with β€οΈ using Next.js, TypeScript, and Tailwind CSS