An interactive 3D portfolio built with Next.js 16, Three.js, React Three Fiber, and Framer Motion. Features a 3D keyboard model, interactive animations, GitHub stats integration, LLM-powered chatbot, and multiple mini-games.
- 3D Keyboard Model: Interactive GLTF keyboard with key press animations and scroll-based transformations
- Animated Title: Cycling job titles with typing animation effect (Computer Science Student | [Job Titles])
- Interactive Typing Challenge: Real-time WPM tracking, accuracy calculation, difficulty settings (Easy/Medium/Hard)
- Contribution Calendar Game: Click cells to break them (mini-game with scoring system)
- GitHub Integration: Live GitHub profile stats, contribution calendar, and activity feed
- Gist Blog Section: Display GitHub Gists as blog articles with markdown support
- LLM-Powered Chatbot: AI-driven conversational chatbot using OpenRouter API (๐ฌ floating widget) with intelligent context awareness
- Matrix Rain Effect: Canvas-based Japanese character rain animation
- Particle Effects: Canvas-based particle burst system with collision detection
- Smooth Scrolling: Lenis-based smooth scroll with section-based navigation
- Responsive Design: Fully responsive on mobile, tablet, and desktop
- Performance Optimized: GPU-accelerated 3D rendering, lazy loading, optimized animations
- Custom Favicon: Logo-based favicon for browser tab
- Framework: Next.js 16.2.3 (App Router with Turbopack)
- 3D Rendering: Three.js + React Three Fiber + Drei
- Animations: Framer Motion
- Styling: Tailwind CSS v4 with custom CSS variables
- Smooth Scroll: React Lenis
- Data Fetching: SWR for intelligent caching and deduplication
- LLM Integration: OpenRouter API with free models
- Language: TypeScript 5.9.3
- Runtime: Node.js 20.x+
- Deployment: Vercel-ready
- Node.js 20.x or higher
- npm or yarn
# Clone the repository
git clone https://github.com/2241812/narcisoIIIjavier.git
cd my-3d-portfolio
# Install dependencies
npm installCreate a .env.local file in the project root:
# LLM Configuration (for chatbot)
NEXT_PUBLIC_OPENROUTER_API_KEY=your_api_key_here
# GitHub Configuration (optional - uses public API by default)
NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here# Run development server
npm run dev
# Open http://localhost:3000 in your browser# Build for production
npm run build
# Start production server
npm start
# Run linting and fix
npm run lintsrc/
โโโ app/
โ โโโ layout.tsx # Root layout with fonts and metadata
โ โโโ page.tsx # Main portfolio page
โ โโโ globals.css # Global styles
โ โโโ loading/ # Loading state
โ โโโ api/
โ โโโ github-stats/route.ts # GitHub API endpoint
โโโ components/
โ โโโ 3d/
โ โ โโโ Scene.tsx # Three.js canvas wrapper
โ โ โโโ KeyboardModel.tsx # Interactive GLTF keyboard model
โ โโโ sections/
โ โ โโโ AboutSection.tsx # About me with interactive profile image
โ โ โโโ SkillsSection.tsx # Skills with GitHub-detected languages
โ โ โโโ ProjectsSection.tsx # Featured projects
โ โ โโโ ExperienceSection.tsx # Work experience
โ โ โโโ ContactSection.tsx # Contact information
โ โ โโโ shared.ts # Shared animation variants
โ โโโ ui/
โ โโโ Sections.tsx # Portfolio layout grid
โ โโโ GitHubStats.tsx # GitHub profile card
โ โโโ ContributionCalendar.tsx # Interactive contribution calendar
โ โโโ TypingGame.tsx # Typing challenge component
โ โโโ ChatWidget.tsx # Floating chatbot
โ โโโ TopBar.tsx # Navigation header
โ โโโ MatrixRain.tsx # Matrix rain effect
โ โโโ ParticleBurst.tsx # Particle system
โ โโโ ErrorBoundary.tsx # Error catching
โ โโโ LenisProvider.tsx # Smooth scroll provider
โโโ services/
โ โโโ api.ts # Centralized API service with retry logic
โ โโโ chatbot.ts # Chatbot AI logic
โโโ hooks/
โ โโโ useInView.ts # Intersection Observer hook
โ โโโ useGitHubData.ts # GitHub data fetching hook
โ โโโ useGameStats.ts # Game statistics tracking
โโโ constants/
โ โโโ gameConstants.ts # Game configuration
โ โโโ typingGame.ts # Typing challenge content
โโโ types/
โ โโโ index.ts # TypeScript type definitions
โโโ data/
โโโ resumeData.ts # Portfolio content and metadata
public/
โโโ models/keyboard.glb # 3D keyboard GLTF model
โโโ profile.jpg # Profile photo
Create a .env.local file based on .env.example:
# GitHub Configuration (optional - uses public API by default)
NEXT_PUBLIC_GITHUB_USERNAME=2241812
# API Configuration
NEXT_PUBLIC_API_TIMEOUT=15000
NEXT_PUBLIC_API_RETRIES=3
# Application Environment
NODE_ENV=production- Push your repository to GitHub
- Visit vercel.com
- Create a new project and import your GitHub repository
- Vercel will automatically detect Next.js and configure build settings
- Add environment variables if needed
- Click "Deploy"
The project includes vercel.json with optimal configuration for Vercel deployment.
The app can be deployed to any platform that supports Node.js:
- Netlify: Use
npm run buildas build command andnpm startas start command - AWS Amplify: Automatic detection of Next.js
- Digital Ocean: Configure to run
npm run build && npm start - Docker: Create a Dockerfile with Node.js base image
- Modes: Duration (15/30/60/120s) or Word Count (25/50/100/200)
- Difficulty: Easy (common words), Medium (varied), Hard (rare words)
- Stats: Real-time WPM, accuracy percentage, time elapsed
- Keyboard Shortcut:
Tab + Enterto restart
- Gameplay: Click cells to "break" them and earn points
- Levels: Cell shades represent contribution levels
- Scoring: Points based on cell value and combo multiplier
- Achievements: Unlock badges for milestones
- Real-time: Fetches live contribution data from GitHub API
- Fallback: Generates placeholder data if API is unavailable
- Caching: SWR handles intelligent caching and revalidation
- Error Handling: Graceful degradation with fallback UI components
- Pattern Matching: 20+ conversation rules with keyword detection
- Similarity: Threshold-based matching for natural responses
- Context: Maintains conversation history
- Floating Widget: Accessible ๐ฌ button in bottom-right corner
Tab + Enter: Restart typing challengeEscape: Exit contribution calendar gameโ/โ: Navigate social cards in About sectionEnter: Select highlighted cardtype commands: Navigate sections (e.g., "about me", "skills")
Solution: The GitHub Contributions API may be temporarily unavailable. The app will automatically fall back to placeholder data. This is normal and won't affect user experience.
Solution: Ensure public/models/keyboard.glb exists and is not corrupted. Check browser console for WebGL errors.
Solution: Check Chrome DevTools Performance tab. May need to reduce animation complexity or enable hardware acceleration.
Solution: Run npm run build to see full error details. Ensure all imports are correct and types are properly defined.
This project is a personal portfolio. Feel free to fork and adapt it for your own portfolio!
While this is a personal portfolio, suggestions and improvements are welcome! Feel free to:
- Open an issue for bugs
- Submit pull requests for enhancements
- Fork and create your own version
- Email: renzoj156@gmail.com
- GitHub: @2241812
- LinkedIn: Narciso III
- Location: Baguio City, Philippines
Last Updated: April 2026 | Built with โค๏ธ and TypeScript