Skip to content

Repository files navigation

3D Developer Portfolio

An immersive, interactive developer portfolio built with Next.js 16, React Three Fiber, and Tailwind CSS v4. Features a 3D mechanical keyboard hero scene, seasonal themes, smooth scroll animations, bilingual support (ES/EN), and a fully responsive design.

Live Demo  |  Built by Txema Albero


Highlights

  • Interactive 3D Keyboard — A full mechanical keyboard rendered with React Three Fiber and Three.js. Keys react to real keypresses with physics-based animations and sound effects.
  • Seasonal Themes — Four complete visual themes (Winter, Spring, Summer, Autumn) that re-skin the entire UI — colours, gradients, and 3D scene lighting — with a single click.
  • Project Showcases — Modal dialogs with image carousels, tech stack chips, and links to live demos and source code.
  • Bilingual (ES/EN) — Lightweight custom i18n layer with zero external dependencies. Language toggle persists across sections.
  • Smooth Scroll & Reveal Animations — Powered by Lenis for buttery smooth scrolling with intersection-observer-based reveal effects.
  • Custom Cursor & Magnetic Targets — A custom cursor that morphs on interactive elements, with magnetic snap behaviour on buttons.
  • Responsive & Mobile-First — Optimised for recruiters reviewing on phones. WebGL performance and touch interactions are first-class concerns.
  • Security Headers — HSTS, X-Frame-Options, Content-Type-Options, Referrer-Policy, and Permissions-Policy configured out of the box.

Tech Stack

Layer Technology
Framework Next.js 16 (App Router, Turbopack)
3D React Three Fiber + @react-three/drei + Three.js
Styling Tailwind CSS v4
Scroll Lenis
Icons Simple Icons (tech logos on 3D keycaps)
Language TypeScript
Deploy Vercel / Docker

Getting Started

Prerequisites

  • Node.js 20+
  • npm 10+

Installation

# Clone the repository
git clone https://github.com/Txemalon/3d-portfolio.git
cd 3d-portfolio

# Install dependencies
npm install

# Start the development server
npm run dev

Open http://localhost:3000 in your browser.

Build for Production

npm run build
npm start

Docker

The project includes a multi-stage Dockerfile optimised for production (standalone output, ~100 MB final image):

docker build -t 3d-portfolio .
docker run -p 3000:3000 3d-portfolio

Project Structure

├── app/
│   ├── globals.css        # Tailwind + CSS custom properties (seasonal themes)
│   ├── layout.tsx         # Root layout with providers
│   └── page.tsx           # Home page with all sections
├── components/
│   ├── FrozenKeyboard.tsx # 3D keyboard scene (R3F)
│   ├── FrozenBackground.tsx # Animated background particles
│   ├── Carousel.tsx       # Image carousel for project modals
│   ├── ProjectModal.tsx   # Fullscreen project detail dialog
│   ├── SeasonProvider.tsx # Seasonal theme context
│   ├── SeasonPicker.tsx   # Theme switcher UI
│   ├── LanguageProvider.tsx # i18n context
│   ├── LanguagePicker.tsx # Language toggle
│   ├── CustomCursor.tsx   # Custom cursor with hover states
│   ├── MagneticTargets.tsx# Magnetic snap on interactive elements
│   ├── Reveal.tsx         # Scroll-triggered reveal animations
│   ├── SectionNav.tsx     # Dot navigation sidebar
│   ├── ScrollProgress.tsx # Scroll progress indicator
│   ├── CopyEmail.tsx      # Copy-to-clipboard button
│   └── smooth-scroll.tsx  # Lenis smooth scroll wrapper
├── lib/
│   ├── i18n.ts            # Bilingual dictionary (ES/EN)
│   └── seasons.ts         # Season theme definitions
├── public/
│   ├── fonts/             # 3D text typefaces
│   ├── projects/          # Project screenshots
│   └── sounds/            # Keyboard sound effects
├── Dockerfile             # Multi-stage production build
├── next.config.ts         # Standalone output + security headers
└── package.json

Customisation

Adding a Project

Projects are defined in app/page.tsx in the projects array. Each entry supports:

{
  num: "05",
  name: { es: "Mi Proyecto", en: "My Project" },
  stack: ["Next.js", "TypeScript"],
  desc: { es: "Descripción corta", en: "Short description" },
  details: { es: "Descripción larga...", en: "Long description..." },
  url: "https://myproject.com",          // optional — adds "View Site" button
  github: "https://github.com/user/repo", // optional — adds "View Code" button
  media: ["/projects/my-project/1.png"], // optional — carousel screenshots
  highlights: ["nextdotjs", "typescript"], // simple-icons slugs for 3D keyboard
  badge: { es: "En desarrollo", en: "In progress" }, // optional status badge
  align: "left",                         // card alignment
  section: "project5",                   // data attribute for scroll nav
}

Changing Themes

Seasonal colour tokens are defined as CSS custom properties in app/globals.css under [data-season="..."] selectors. Edit or add new seasons there.

Translations

All UI strings live in lib/i18n.ts as a flat dictionary with { es, en } leaves. Add new keys or languages by extending the structure.

Deployment

Vercel (Recommended)

Deploy with Vercel

Docker / Self-Hosted

The included Dockerfile produces a standalone Next.js image. Works with any container platform (Railway, Fly.io, Coolify, etc.):

docker build -t 3d-portfolio .
docker run -p 3000:3000 3d-portfolio

Performance

  • Standalone output — No node_modules in production; the Docker image is ~100 MB.
  • Lazy loading — Project screenshots use native lazy loading.
  • Font optimisation — Uses next/font for zero-layout-shift web fonts.
  • Turbopack — Sub-300ms dev server cold starts.

License

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

Author

Jose Maria Albero Belamendia (Txema)

About

Interactive 3D developer portfolio built with Next.js 16, React Three Fiber & Tailwind CSS. Features a mechanical keyboard hero scene, seasonal themes, bilingual support (ES/EN), and smooth scroll animations.

Topics

Resources

Stars

36 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages