A free, open-source portfolio website for engineers, designers, makers, and 3D artists.
Dark theme. Animated. Interactive 3D model viewers. Fully responsive.
Zero cost to deploy.
Live Demo · Quick Start · Customization · Deploy · Report Bug
| Section | Description |
|---|---|
| Hero | Animated name reveal, social links, CV download, 3D image carousel |
| About Me | Flip-card grid + bio + color-coded skill pills |
| Projects | Filterable project cards with detail overlays |
| CAD Designs | Embedded Sketchfab 3D model viewers |
| Poly Models | ArtStation / external portfolio links |
| Library | Full media gallery with category filters, lightbox, video support |
| Footer | Contact info, social links, copyright |
| Layer | Tool |
|---|---|
| Framework | Next.js 16 (App Router, TypeScript) |
| Styling | Tailwind CSS 4 |
| 3D Rendering | Three.js + @react-three/fiber + Drei |
| Animation | Framer Motion |
| 3D Embeds | Sketchfab (free tier) |
| Fonts | Space Grotesk, Inter, JetBrains Mono (via next/font) |
# Option A: Fork this repo on GitHub, then clone your fork
git clone https://github.com/YOUR-USERNAME/Web-Portfolio-Template.git
cd Web-Portfolio-Template
# Option B: Clone directly
git clone https://github.com/Murathanx12/Web-Portfolio-Template.git
cd Web-Portfolio-Templatenpm installnpm run devOpen http://localhost:3000 — you should see the template with placeholder content.
Edit the data files in src/data/ — that's where all your content lives. No need to touch the components unless you want to change the layout. See the Customization Guide below.
npm run build # make sure it builds cleanThen push to GitHub and connect to Vercel (free). See Deploy for Free.
All your content lives in 5 data files. You rarely need to touch the components.
| File | What It Controls |
|---|---|
src/data/projects.ts |
Projects + Personal Info — your name, bio, social links, and all project entries |
src/data/about.ts |
About Section — flip card highlights and skills list |
src/data/cad.ts |
CAD Designs — Sketchfab 3D model embeds |
src/data/gallery.ts |
Library — all gallery images and videos |
src/data/polymodels.ts |
Poly Models — ArtStation/external 3D art links |
export const personalInfo = {
name: "Jane Doe", // Your full name
title: "Mechanical Engineer & 3D Artist", // Your title
tagline: "I design and build things.", // One-liner
bio: "Your bio goes here...", // 2-3 paragraphs
email: "jane@example.com", // Contact email
links: {
linkedin: "https://linkedin.com/in/janedoe",
github: "https://github.com/janedoe",
artstation: "https://www.artstation.com/janedoe",
sketchfab: "https://sketchfab.com/janedoe",
grabcad: "https://grabcad.com/janedoe",
youtube: "https://www.youtube.com/@janedoe",
},
};Find the line that says YN and change it to your initials.
export const metadata: Metadata = {
title: "Jane Doe — Mechanical Engineer & 3D Artist",
description: "Portfolio of Jane Doe — robotics, CAD, and 3D art.",
};Each project is an object in the projects array. Copy an existing entry and modify it. The template includes 5 sample projects to show you the format.
Place your images in the public/ directory:
public/
├── images/
│ ├── hero/ ← Hero carousel images (recommended: 8 images)
│ ├── gallery/
│ │ └── <category>/ ← Gallery images sorted by project/category
│ ├── video-thumbs/ ← Thumbnail images for videos
│ └── cad/ ← CAD model thumbnails
├── videos/ ← MP4 video files
└── cv.pdf ← Your resume/CV
Image tips:
- Use JPG at 80% quality, 1200-1600px wide
- Compress videos to 720p with
ffmpegor HandBrake - Keep total repo size under 500MB for fast deploys
Upload your models to Sketchfab (free), then:
{
id: "my-robot",
title: "My Competition Robot",
sketchfabId: "abc123def456...", // From the Sketchfab URL
// ... other fields
}Add, remove, or recategorize skills. Categories control the color-coding:
mechanical— tealsoftware— bluedesign— purpletools— amber
The easiest option — automatic deploys on every push.
- Push your repo to GitHub
- Go to vercel.com and sign in with GitHub
- Click "New Project" → import your repo
- Click Deploy — done
Cost: $0 on the Hobby plan (unlimited personal projects).
Custom domain: You can connect your own domain in Vercel settings. Domains cost ~$10-15/year from providers like Namecheap, Cloudflare, or Google Domains.
- Push to GitHub
- Go to netlify.com → New site from Git
- Build command:
npm run build - Publish directory:
.next
Cost: $0 on the free tier.
- Push to GitHub
- Go to Cloudflare Pages
- Connect your repo, set build command to
npm run build
Cost: $0 on the free tier.
npm run build
npm run start # Runs on port 3000Use with Nginx, Caddy, or any reverse proxy.
The template is fully functional for free. Here are optional upgrades if you want more:
| Upgrade | Cost | What You Get |
|---|---|---|
| Custom domain | ~$10-15/year | yourname.com instead of yourname.vercel.app |
| Vercel Pro | $20/month | Analytics, more bandwidth, team features |
| Sketchfab Pro | $15/month | Private models, download tracking, custom viewer branding |
| Email service | $0-5/month | Contact form via Resend, SendGrid, or Formspree |
| CMS integration | $0-29/month | Manage content via Sanity, Contentful, or Notion |
| Analytics | $0-9/month | Vercel Analytics, Plausible, or PostHog |
Want a working contact form instead of just an email link?
Free option — Formspree:
- Sign up at formspree.io
- Create a form, get your endpoint
- Add a
<form action="https://formspree.io/f/YOUR_ID" method="POST">to the footer
Code option — API Route + Resend:
// src/app/api/contact/route.ts
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST(req: Request) {
const { name, email, message } = await req.json();
await resend.emails.send({
from: 'Portfolio <noreply@yourdomain.com>',
to: 'you@example.com',
subject: `Portfolio Contact: ${name}`,
text: `From: ${name} (${email})\n\n${message}`,
});
return Response.json({ success: true });
}Want to write articles alongside your portfolio?
Option 1 — MDX (free, in-repo):
- Install
@next/mdx - Create
src/app/blog/[slug]/page.mdxfiles - Write in Markdown with React components
Option 2 — Headless CMS:
- Sanity — free tier with visual editor
- Notion as CMS — use the Notion API to pull content
npm install @vercel/analytics// src/app/layout.tsx
import { Analytics } from '@vercel/analytics/react';
// Add <Analytics /> inside your <body>├── src/
│ ├── app/
│ │ ├── layout.tsx ← Root layout, metadata, fonts
│ │ ├── page.tsx ← Main page (all sections)
│ │ └── globals.css ← Tailwind + custom theme
│ ├── components/
│ │ ├── hero/ ← Hero section, social icons, 3D carousel
│ │ ├── about/ ← About section, flip cards, skill pills
│ │ ├── projects/ ← Project cards and detail views
│ │ ├── cad/ ← Sketchfab 3D model viewers
│ │ ├── polymodels/ ← ArtStation model links
│ │ ├── library/ ← Gallery with filters and lightbox
│ │ ├── global/ ← Navbar, scroll animations, shared UI
│ │ └── Footer.tsx ← Footer with contact info
│ ├── data/ ← YOUR CONTENT LIVES HERE
│ │ ├── projects.ts ← Projects + personal info
│ │ ├── about.ts ← Flip cards + skills
│ │ ├── cad.ts ← CAD model entries
│ │ ├── gallery.ts ← Gallery items
│ │ └── polymodels.ts ← Poly model links
│ └── hooks/ ← Custom React hooks
├── public/
│ ├── images/ ← All images (hero, gallery, thumbnails)
│ ├── videos/ ← Video files
│ └── cv.pdf ← Your resume
├── docs/ ← Screenshots for this README
├── package.json
├── next.config.ts
├── tsconfig.json
└── tailwind + postcss configs
Do I need to know React/Next.js to use this?
Not really. All your content goes in the src/data/ files, which are plain TypeScript objects. If you can edit JSON, you can use this template. The components handle all the rendering.
Can I remove sections I don't need?
Yes. Open src/app/page.tsx and comment out or remove the section components you don't want. For example, if you don't have CAD models, remove the <CADSection /> line.
How do I change the accent color?
The cyan accent is defined in src/app/globals.css as a CSS variable. Search for --cyan or #00f0ff and change it to your preferred color.
Can I use this for a non-engineering portfolio?
Absolutely. The template works for any visual portfolio — photography, architecture, game dev, industrial design, etc. Just change the section labels and data.
Is the Sketchfab viewer required?
No. If you don't have 3D models on Sketchfab, just remove the CAD section from page.tsx or leave the cadModels array empty.
How do I add more social links?
Edit src/data/projects.ts → personalInfo.links to add new URLs. Then add the corresponding icon in src/components/hero/SocialIcons.tsx. SVG icons for most platforms can be found at simpleicons.org.
Built something with this template? Open a PR to add your site here!
| Site | Author | Description |
|---|---|---|
| murathan.info | Murathan Abdullaev | The original — robotics engineer & 3D artist |
| Your site here | Your name | What you do |
Contributions are welcome! See CONTRIBUTING.md for guidelines.
- Found a bug? Open an issue
- Have an idea? Request a feature
- Want to help? Fork, fix, and PR
If this template helped you, here's how you can give back:
- Star this repo — it helps others find it
- Fork it — make it your own
- Share it — post on Twitter, Reddit, LinkedIn, Discord
- Add your site to the showcase — open a PR
- Report bugs or suggest features — open an issue
- Contribute code — PRs welcome
MIT — use it however you want, for free, forever.
Built by Murathan Abdullaev
If you found this useful, a star goes a long way.




