Voltar ao ranking

Naresh-Khatri/3d-portfolio

TypeScriptnareshkhatri.site

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

3danimationinteractiveportfoliodeveloper-portfolioframer-motiongsapmotionnextjspersonal-websiteportfolio-templateportfolio-website
Crescimento de estrelas
Estrelas
1.2k
Forks
235
Crescimento semanal
Issues
0
5001k
ago. de 2024mar. de 2025nov. de 2025jul. de 2026
Artefatosnpmnpm install 3d-portfolio
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

  1. Clone the repository:

    git clone https://github.com/Naresh-Khatri/3d-portfolio.git
    cd 3d-portfolio
    
  2. Install dependencies:

    pnpm install
    
  3. Set up environment variables:

    Copy .env.example to .env.local and fill in the values:

    cp .env.example .env.local
    
    Variable Required Description
    RESEND_API_KEY Yes API key from Resend for the contact form
    NEXT_PUBLIC_WS_URL No WebSocket server URL for realtime features (cursors, chat, presence)
    UMAMI_DOMAIN No Umami analytics script URL
    UMAMI_SITE_ID No Umami website ID
  4. Run the development server:

    pnpm dev
    
  5. Open http://localhost:3000 and see the magic ✨


🎨 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:

  1. Import the public/assets/skills-keyboard.spline file into Spline
  2. Unhide the keycap objects you want to edit
  3. Update the logo images on each keycap to your new skill icons
  4. Rename each keycap object to match the skill's name field in src/data/constants.ts (e.g. js, react, docker)
  5. Hide all keycap objects again
  6. 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 NEXT_PUBLIC_WS_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:

  1. Push your code to a GitHub repository
  2. Connect the repository to Vercel
  3. Add your environment variables in the Vercel dashboard
  4. 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 ❤️

Repositórios relacionados
mrdoob/three.js

JavaScript 3D Library.

JavaScriptnpmMIT Licensejavascript3d
threejs.org
113.9k36.4k
DavidHDev/react-bits

An open source collection of animated, interactive & fully customizable React components for building memorable websites.

JavaScriptnpmOtheranimationscomponents
reactbits.dev
43.9k2.1k
FreeCAD/FreeCAD

Official source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.

C++GNU Lesser General Public License v2.1freecadengineering
freecad.org
32.3k5.8k
pmndrs/react-three-fiber

🇨🇭 A React renderer for Three.js

TypeScriptnpmMIT Licensereactthreejs
docs.pmnd.rs/react-three-fiber
31.5k1.9k
BabylonJS/Babylon.js

Babylon.js is a powerful, beautiful, simple, and open game and rendering engine packed into a friendly JavaScript framework.

TypeScriptnpmApache License 2.0webglwebgl2
babylonjs.com
25.8k3.7k
libgdx/libgdx

Desktop/Android/HTML5/iOS Java game development framework

JavaMavenApache License 2.0libgdxjava
libgdx.com
25.2k6.5k
4ian/GDevelop

🎮 Open-source, cross-platform 2D/3D/multiplayer game engine designed for everyone.

JavaScriptnpmOthergamejavascript
gdevelop.io
25k1.5k
ssloy/tinyrenderer

A brief computer graphics / rendering course

C++Otheropenglc-plus-plus
haqr.eu/tinyrenderer/
23.9k2.3k
lettier/3d-game-shaders-for-beginners

🎮 A step-by-step guide to implementing SSAO, depth of field, lighting, normal mapping, and more for your 3D game.

C++shaders3d
lettier.github.io/3d-game-shaders-for-beginners/index.html
19.8k1.5k
blender/blender

Official mirror of Blender

C++Otherb3danimation
developer.blender.org/docs/handbook/contributing/using_git/
19.3k3.1k
aframevr/aframe

:a: Web framework for building virtual reality experiences.

JavaScriptnpmMIT Licensevrwebvr
aframe.io
17.6k4.4k
CesiumGS/cesium

An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

JavaScriptnpmApache License 2.03dgeospatial
cesium.com/cesiumjs/
15.5k3.9k