A personal portfolio with a fixed profile rail, an animated contour background, a bento home screen, a 3D page carousel, and a separate app-style layout for phones. Every piece of content is a placeholder. You swap in your own.
Stack: Vite 6, React 19, TypeScript, plain CSS custom properties, Three.js, GSAP, Lenis, React Router 7, Phosphor icons, Poppins.
Straight from this repo, placeholders and all.
Desktop - the profile rail, the contour background and the bento home.
Phone - an app-style layout: a floating tab bar, a glance widget for your stats, app-icon tools and swipeable shelf cards. Light and dark.
npm install
npm run dev # http://localhost:5173
npm run build # typecheck + production build to dist/
npm run lint # ESLint with the TypeScript parser and the React hooks rulesEvery spot that needs your content says PLACEHOLDER and describes what goes there. You can edit the files yourself, or open the repo in an AI coding tool and tell it what to put in each spot.
| What | Where |
|---|---|
| Name, handle, photo, email, socials, Home headline, phone stats and their icons | src/data/profile.ts (start here) |
| Phone headline size (holds your headline on one line) | --headline-em in src/styles/mobile-pass.css - the comment there shows how to measure it |
| Your photo | public/avatar.svg (or point avatarSrc at a .webp/.png) |
| Page headlines and copy | the top of each page component: ProjectsGrid, ServicesGrid, ShowcaseGrid, TestimonialsGrid, AboutGrid, ContactGrid in src/components/ |
| Funnel pages and websites (the 3D carousel) | src/data/funnels.ts + HTML files in public/funnels/ and public/samples/ |
| Projects, apps, side builds | src/data/projects.ts, src/data/ai-stack.ts |
| FAQs | src/data/faqs.ts |
| Tools marquee | src/components/ToolsMarquee.tsx (logos in public/icons/) |
| Testimonial videos | public/testimonials/, then set src in TestimonialsGrid.tsx |
| Contact form | src/lib/contact.ts (opens the visitor's email app by default; set VITE_CONTACT_ENDPOINT to post to your own backend) |
| SEO, share image, favicon | index.html, public/favicon.svg |
| Colors | src/styles/tokens.css |
| Privacy / Terms | src/components/Privacy.tsx, src/components/ToS.tsx |
- Put the page's HTML in
public/funnels/(single pages, shown 16:9) orpublic/samples/(full websites, shown 3:4). - Add an entry to
src/data/funnels.ts. - Run
node scripts/make-thumbs.mjsto render the thumbnails. It uses the Playwright install that comes with the dev dependencies (runnpx playwright install chromiumonce if needed).
To regenerate the placeholder pages: node scripts/make-placeholder-sites.mjs.
- The background shader measures the visitor's frame rate and steps down on slow machines (
src/lib/perf.ts). Keep any largebackdrop-filterblur off the layers above it, because blur over an animated canvas is the most expensive thing on the page. - From 1100px down, the site switches to the phone layout.
src/styles/mobile-app.cssowns its components (TabBar,QuickMenu,HomeMobile);src/styles/mobile-pass.cssholds the motion (the tab pill, the bar hiding on scroll, page arrival, tile depth) and the native-feel fixes. Everything respectsprefers-reduced-motionand the site's own Reduce motion switch. - Anything new you add above the fold on Home must join the intro hold-back list in
src/styles/boot.css. Otherwise it shows through the intro animation.
- Contour background technique inspired by the landonorris.com site by OFF+BRAND. The simplex noise is Ashima Arts / Ian McEwan (MIT).
- Icons: Phosphor (MIT). Tool logos in
public/icons/are trademarks of their owners and are included as examples only. - Font: Poppins (SIL Open Font License).
PolyForm Noncommercial 1.0.0, plus one extra permission: you can use it for your own portfolio, even if that portfolio promotes your paid services.
What it does not allow without a commercial license: selling or reselling this template, or building portfolio sites for other people for payment. For a commercial license, email brewedops@gmail.com.
Versions up to tag v1.0.0-mit (commit d3c05da) were MIT and stay MIT. Everything after that is under the license above.


