Naresh-Khatri
3d-portfolio
TypeScript

Interactive 3D developer portfolio with a keyboard where every keycap is a skill. Built with Next.js, React, TypeScript, GSAP & Motion. Free to use!

Last updated Jul 8, 2026
1.1k
Stars
233
Forks
0
Issues
+9
Stars/day
Attention Score
79
Language breakdown
No language data available.
โ–ธ Files click to expand
README

๐Ÿš€ 3D Portfolio

A jaw-dropping developer portfolio packed with interactive 3D animations, buttery smooth transitions, and a space-themed aesthetic. Not your average portfolio template! This one has a fully interactive 3D keyboard where each keycap is a skill.

Free to use! This portfolio is open source. If you use it, a credit/link back would be really appreciated ๐Ÿ™

Deploy with Vercel

Portfolio Preview

โœจ Features

  • Interactive 3D Keyboard โ€” Custom Spline keyboard where each keycap represents a skill, revealing titles and descriptions on hover/press
  • Buttery Animations โ€” GSAP + Framer Motion powered scroll, hover, and reveal animations
  • Space Theme โ€” Floating particles on a dark canvas for a cosmic vibe
  • Light & Dark Mode โ€” Full theme support with cheeky disclaimer toasts
  • Responsive โ€” Works across all screen sizes
  • Contact Form โ€” Email delivery via Resend
  • Analytics (optional) โ€” Umami analytics integration

๐Ÿ› ๏ธ Tech Stack

| Layer | Technologies | |---|---| | Framework | Next.js 14, React 18, TypeScript | | Styling | Tailwind CSS, Shadcn UI, Aceternity UI | | Animation | GSAP, Framer Motion | | 3D | Spline Runtime | | Email | Resend | | Misc | Lenis (smooth scroll), Zod, next-themes |


๐Ÿš€ Getting Started

Prerequisites

  • Node.js (v18+)
  • pnpm (recommended), npm, or yarn

Installation

  • Clone the repository:
git clone https://github.com/Naresh-Khatri/3d-portfolio.git
    cd 3d-portfolio
  • Install dependencies:
pnpm install
  • Set up environment variables:
Copy .env.example to .env.local and fill in the values:
cp .env.example .env.local

| Variable | Required | Description | |---|---|---| | RESENDAPIKEY | Yes | API key from Resend for the contact form | | NEXTPUBLICWS_URL | No | WebSocket server URL for realtime features (cursors, chat, presence) | | UMAMI_DOMAIN | No | Umami analytics script URL | | UMAMISITEID | No | Umami website ID |

  • Run the development server:
pnpm dev

๐ŸŽจ Make It Your Own

All personal info is centralized in src/data/config.ts. Edit this single file to rebrand the portfolio:

const config = {
  title: "Your Name | Your Title",
  description: {
    long: "Your long description for SEO...",
    short: "Your short description...",
  },
  keywords: ["your", "keywords"],
  author: "Your Name",
  email: "you@example.com",
  site: "https://yoursite.com",

// GitHub stars button in the header githubUsername: "your-github-username", githubRepo: "your-repo-name",

social: { twitter: "https://x.com/you", linkedin: "https://linkedin.com/in/you", instagram: "https://instagram.com/you", facebook: "https://facebook.com/you", github: "https://github.com/you", }, };

Other files you'll want to customize:

| File | What to change | |---|---| | src/data/projects.tsx | Your projects, screenshots, descriptions, and tech stacks | | src/data/constants.ts | Skills list (name, description, icon) and work experience | | public/assets/ | Your images, OG image, and project screenshots |


โŒจ๏ธ Updating the 3D Keyboard Skills

The 3D keyboard keycaps are baked into a Spline file. To update the skills displayed on the keyboard:

  • Import the public/assets/skills-keyboard.spline file into Spline
  • Unhide the keycap objects you want to edit
  • Update the logo images on each keycap to your new skill icons
  • Rename each keycap object to match the skill's name field in src/data/constants.ts (e.g. js, react, docker)
  • Hide all keycap objects again
  • Export the scene and overwrite public/assets/skills-keyboard.spline
After updating the Spline file, make sure src/data/constants.ts has matching entries for every skill on the keyboard:
// Each keycap object name in Spline must match a key in SKILLS
export const SKILLS: Record<SkillNames, Skill> = {
  js: { name: "js", label: "JavaScript", shortDescription: "...", ... },
  react: { name: "react", label: "React", shortDescription: "...", ... },
  // ... add/remove entries to match your keyboard
};

The SkillNames enum, SKILLS record, and the Spline keycap names must all stay in sync for the keyboard interactions to work correctly.


๐Ÿ”Œ Realtime Features (Optional)

The portfolio supports optional realtime features powered by a separate backend API:

  • ๐Ÿ–ฑ๏ธ Live cursors โ€” See other visitors' cursors in realtime
  • ๐Ÿ‘ฅ Online presence โ€” Shows who's currently on the site
  • ๐Ÿ’ฌ Chat โ€” Live chat between visitors
These features activate automatically when the NEXTPUBLICWS_URL environment variable is set. Without it, the portfolio works perfectly fine as a static site โ€” no realtime features, no backend dependency.
[!NOTE]
The backend API is not open source. This is intentional! Too many people have cloned the portfolio and claimed they built it from scratch. The realtime server stays private to keep the live experience unique make make it standout.

๐Ÿš€ Deployment

Deploy with Vercel

This site is deployed on Vercel. To deploy your own:

  • Push your code to a GitHub repository
  • Connect the repository to Vercel
  • Add your environment variables in the Vercel dashboard
  • Vercel handles the rest โ€” automatic deployments on every push

๐Ÿค Contributing

If you'd like to contribute or suggest improvements, feel free to open an issue or submit a pull request. All contributions are welcome!


๐Ÿ“„ License

This project is open source and available under the MIT License.

If you use this portfolio, a credit or link back to the original repo would be much appreciated โค๏ธ

ยฉ 2026 GitRepoTrend ยท Naresh-Khatri/3d-portfolio ยท Updated daily from GitHub