brewed-ops / portfolio-template
git clone https://github.com/brewed-ops/portfolio-template.git
Portfolio template: profile rail, animated contour background, bento home, 3D page carousel, phone layout. All content is placeholder.
—
stars, 24h
—
stars, 7 days
+147
stars, 30 days · #1,627
147
★ total
76
forks · 0 open issues
Star history starts 2026-10-20; the chart appears after the second daily snapshot.
LanguageCSS
License—
Created2026-09-24 (26d ago)
Last push21d ago
Watchers1
OwnerUser
Links
README excerpt
# Portfolio Template 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. ## What it looks like 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. ## Run it [code] ## Make it yours Every 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` | ### Adding your own funnels and websites 1. Put the page's HTML in `public/funnels/` (single pages, shown 16:9) or `public/samples/` (full websites, shown 3:4). 2. Add an entry to `src/data/funnels.ts`. 3. Run `node scripts/make-thumbs.mjs` to render the thumbnails. It uses the Playwright install that comes with the dev dependencies (run `npx playwright install chromium` once if needed). To regenerate the placeholder pages: `node scripts/make-placeholder-sites.mjs`. ## Notes - The background shader measures the visitor's frame rate and steps down on slow machines (`src/lib/perf.ts`). Keep any large `backdrop-filter` blur 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