FrankenSuite Website Development
Reference implementation: /data/projects/frankentui_website (frankentui.com)
Read the source files AND DESIGN-PHILOSOPHY.md before building.
Brand Essence
"Laboratory of Beautiful Monsters" — industrial horror meets Stripe-grade polish.
- Bolts = fasteners, Stitches = sutures, Glitches = electrical surges, Eye = the monster watching, Green = life force
- Every heading uses the "One Green Word" pattern:
"Get [Started]." — green word is the most evocative, period makes it declarative
- Micro-labels (
text-[10px] font-black uppercase tracking-[0.3em]) appear everywhere — eyebrows, status indicators, nav badges, stats. This is what makes it feel like an instrument dashboard, not a blog
- The site breathes through 4 atmospheric layers: GlowOrbits (background) → SpectralBackground noise/grain (atmosphere) → glass-modern cards (content) → custom cursor (interactive)
- Homepage is a scroll narrative — each section is a story chapter from "Here's what this is" (hero) through "Others love it" (tweets) to "The machine is alive" (footer)
Full philosophy, anti-patterns, visual language: DESIGN-PHILOSOPHY.md
Quick Start
bunx create-next-app@latest <project>-website --ts --tailwind --app --src-dir=false
cd <project>-website
bun add framer-motion lucide-react clsx tailwind-merge highlight.js marked dompurify
Copy from frankentui_website:
# Required (brand consistency)
components/ franken-elements.tsx franken-glitch.tsx franken-eye.tsx
motion-wrapper.tsx section-shell.tsx client-shell.tsx
site-header.tsx site-footer.tsx custom-cursor.tsx
lib/ utils.ts site-state.tsx
hooks/ use-body-scroll-lock.ts use-intersection-observer.ts
app/ globals.css
# Optional (copy as needed)
components/ glow-orbits.tsx spectral-background.tsx terminal-demo.tsx
screenshot-gallery.tsx rust-code-block.tsx comparison-table.tsx
timeline.tsx tweet-wall.tsx video-player.tsx stats-grid.tsx
animated-number.tsx decoding-text.tsx error-boundary.tsx
motion/index.tsx motion/magnetic.tsx
Then: create lib/content.ts → update app/layout.tsx (Inter + JetBrains Mono) → build pages.
Full step-by-step: ADAPTATION-GUIDE.md
Workflow
Tech Stack
Next.js 16 (App Router, Turbopack) · React 19 · Tailwind CSS 4 (@tailwindcss/postcss, no tailwind.config) · Framer Motion 12 · lucide-react · Inter + JetBrains Mono via next/font/google
BUN only — never npm/yarn/pnpm. TypeScript strict, bundler resolution, @/* path alias.
Architecture
RootLayout (server) → ClientShell ("use client" boundary)
├── SiteProvider (context: anatomy, terminal, audio)
├── SiteHeader (desktop pill nav + mobile bottom nav)
├── AnimatePresence page transitions
│ └── {children}
├── SiteFooter
└── CustomCursor (desktop only)
SectionShell — core layout primitive (4/8 col grid, sticky sidebar):
<SectionShell id="features" icon="sparkles" eyebrow="Why" title="Built Different" kicker="...">
{/* content */}
</SectionShell>
Content centralization: ALL data in lib/content.ts — siteConfig, navItems, heroStats, features, screenshots, codeExample, comparisonData, changelog, tweets. Types co-located. Never separate data files.
Component details: COMPONENTS.md · Motion system: EXACT-VALUES.md
Key Design Patterns
| Pattern |
Implementation |
Details in |
| Glass morphism |
rgba(5,18,5,0.8) + blur(12px) + green/12% border |
DESIGN-SYSTEM.md |
| Micro-labels |
text-[10px] font-black uppercase tracking-[0.3em] |
DESIGN-PHILOSOPHY.md |
| Viewport entry |
opacity:0,y:40 → 1,0, ease [0.19,1,0.22,1] |
COMPONENTS.md |
| Spring presets |
smooth/snappy/gentle/quick |
COMPONENTS.md |
| Custom cursor |
data-technical / data-flashlight / data-magnetic / data-cursor |
COMPONENTS.md |
| Desktop nav |
Floating pill, transparent → glass-modern on scroll |
RESPONSIVE.md |
| Mobile nav |
Bottom tab bar (not hamburger), slide-out drawer |
RESPONSIVE.md |
| CTAs |
Primary bg-green-500 rounded-2xl, never rounded-full |
DESIGN-PHILOSOPHY.md |
| Section spacing |
py-16 md:py-32 lg:py-48 — extreme breathing room |
DESIGN-PHILOSOPHY.md |
| Hero formula |
Eyebrow → big title (green word + period) → subtitle → CTAs → stats → FrankenEye |
DESIGN-PHILOSOPHY.md |
| Decorative system |
FrankenBolt/Stitch/Container/Glitch/Eye — shared brand chrome |
COMPONENTS.md |
| OG images |
Satori/next/og — PNG only, no <br/>, display:"flex" everywhere |
ADAPTATION-GUIDE.md |
Gotchas
- SectionShell icon: String key, not component ref. Add to BOTH import AND
sectionIcons map
- Server/Client boundary: No
next/dynamic with ssr: false in Server Components (Next.js 16). Import "use client" components directly
- React 19: No ref writes during render. No synchronous setState in effects
- Satori (next/og): No WebP, no
<br />, no borderRadius: "full" (use "9999px"). Pre-convert with sharp
- Linter auto-modifies: Re-read files before editing — ESLint may have changed imports
- .next/cache:
rm -r .next/cache fixes phantom type errors
- BUN only:
bun dev, bun run build, bun lint, bun tsc --noEmit
- Content: ALL data in
lib/content.ts — never separate data files
- RustCodeBlock: Uses
title prop, NOT filename
- GlowOrbits: Native Web Animation API — don't convert to Framer Motion
- Portal: Fixed-position inside transform parents breaks — use Portal from motion-wrapper.tsx
- Body scroll lock: Must compensate scrollbar width — use
useBodyScrollLock
- Event listeners: Always
{ passive: true } for scroll/mouse. RAF batching for cursor.
- Font loading: Both fonts need
display: "swap" to prevent FOIT
Adapting for a New Project
- Read DESIGN-PHILOSOPHY.md first — absorb the aesthetic soul
- Fork structure, not code — same tech stack, same visual language
- Replace content — new
siteConfig, navItems, features, etc.
- Swap accent color — update
--color-green-prime in CSS vars + component defaults
- Keep decorative system — FrankenBolt/Stitch/Container/Glitch for brand unity
- Follow the scroll narrative — homepage tells a story, each section is a chapter
- Maintain micro-labels — every section needs the 10px uppercase eyebrow
- Preserve atmosphere — GlowOrbits + noise + glass-modern + breathing space
- Test the "alive" feeling — if the page feels static, something is missing
Full 10-phase guide + checklist: ADAPTATION-GUIDE.md
References
| I need to... |
Read |
| Understand the brand, visual language, anti-patterns |
DESIGN-PHILOSOPHY.md |
| Look up CSS vars, glass-modern, typography, utility classes |
DESIGN-SYSTEM.md |
| Understand a component's API, behavior, or props |
COMPONENTS.md |
| Get exact values (SVG paths, spring configs, magic numbers) |
EXACT-VALUES.md |
| See page-by-page implementation patterns |
PAGES.md |
| Check responsive/mobile behavior |
RESPONSIVE.md |
| Follow step-by-step new project setup |
ADAPTATION-GUIDE.md |
1---2name: frankensuite-website-development3description: >-4 Build FrankenSuite project websites matching frankentui.com quality. Use when5 creating a new FrankenSuite website, adding pages/sections, or adapting the6 design system for a different project.7---89<!-- TOC: Brand | Quick Start | Architecture | Gotchas | Adaptation | References -->1011# FrankenSuite Website Development1213> **Reference implementation:** `/data/projects/frankentui_website` (frankentui.com)14> Read the source files AND [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) before building.1516---1718## Brand Essence1920**"Laboratory of Beautiful Monsters"** — industrial horror meets Stripe-grade polish.2122- Bolts = fasteners, Stitches = sutures, Glitches = electrical surges, Eye = the monster watching, Green = life force23- Every heading uses the **"One Green Word"** pattern: `"Get [Started]."` — green word is the most evocative, period makes it declarative24- **Micro-labels** (`text-[10px] font-black uppercase tracking-[0.3em]`) appear everywhere — eyebrows, status indicators, nav badges, stats. This is what makes it feel like an instrument dashboard, not a blog25- The site **breathes** through 4 atmospheric layers: GlowOrbits (background) → SpectralBackground noise/grain (atmosphere) → glass-modern cards (content) → custom cursor (interactive)26- Homepage is a **scroll narrative** — each section is a story chapter from "Here's what this is" (hero) through "Others love it" (tweets) to "The machine is alive" (footer)2728Full philosophy, anti-patterns, visual language: [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md)2930---3132## Quick Start3334```bash35bunx create-next-app@latest <project>-website --ts --tailwind --app --src-dir=false36cd <project>-website37bun add framer-motion lucide-react clsx tailwind-merge highlight.js marked dompurify38```3940Copy from `frankentui_website`:41```42# Required (brand consistency)43components/ franken-elements.tsx franken-glitch.tsx franken-eye.tsx44 motion-wrapper.tsx section-shell.tsx client-shell.tsx45 site-header.tsx site-footer.tsx custom-cursor.tsx46lib/ utils.ts site-state.tsx47hooks/ use-body-scroll-lock.ts use-intersection-observer.ts48app/ globals.css4950# Optional (copy as needed)51components/ glow-orbits.tsx spectral-background.tsx terminal-demo.tsx52 screenshot-gallery.tsx rust-code-block.tsx comparison-table.tsx53 timeline.tsx tweet-wall.tsx video-player.tsx stats-grid.tsx54 animated-number.tsx decoding-text.tsx error-boundary.tsx55 motion/index.tsx motion/magnetic.tsx56```5758Then: create `lib/content.ts` → update `app/layout.tsx` (Inter + JetBrains Mono) → build pages.5960Full step-by-step: [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md)6162---6364## Workflow6566- [ ] Scaffold Next.js 16 + BUN67- [ ] Copy design system + shared components68- [ ] Create `lib/content.ts` (ALL content in this one file)69- [ ] Build homepage following scroll narrative order70- [ ] Build subpages: Showcase, Architecture, Getting Started (minimum)71- [ ] Verify mobile: bottom nav, responsive grids, touch interactions72- [ ] `bun run build && bun tsc --noEmit` — zero errors73- [ ] Deploy to Vercel7475---7677## Tech Stack7879Next.js 16 (App Router, Turbopack) · React 19 · Tailwind CSS 4 (`@tailwindcss/postcss`, no tailwind.config) · Framer Motion 12 · lucide-react · Inter + JetBrains Mono via `next/font/google`8081**BUN only** — never npm/yarn/pnpm. TypeScript strict, bundler resolution, `@/*` path alias.8283---8485## Architecture8687```88RootLayout (server) → ClientShell ("use client" boundary)89 ├── SiteProvider (context: anatomy, terminal, audio)90 ├── SiteHeader (desktop pill nav + mobile bottom nav)91 ├── AnimatePresence page transitions92 │ └── {children}93 ├── SiteFooter94 └── CustomCursor (desktop only)95```9697**SectionShell** — core layout primitive (4/8 col grid, sticky sidebar):98```tsx99<SectionShell id="features" icon="sparkles" eyebrow="Why" title="Built Different" kicker="...">100 {/* content */}101</SectionShell>102```103104**Content centralization**: ALL data in `lib/content.ts` — `siteConfig`, `navItems`, `heroStats`, `features`, `screenshots`, `codeExample`, `comparisonData`, `changelog`, `tweets`. Types co-located. Never separate data files.105106Component details: [COMPONENTS.md](references/COMPONENTS.md) · Motion system: [EXACT-VALUES.md](references/EXACT-VALUES.md)107108---109110## Key Design Patterns111112| Pattern | Implementation | Details in |113|---------|---------------|------------|114| Glass morphism | `rgba(5,18,5,0.8)` + `blur(12px)` + green/12% border | [DESIGN-SYSTEM.md](references/DESIGN-SYSTEM.md) |115| Micro-labels | `text-[10px] font-black uppercase tracking-[0.3em]` | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |116| Viewport entry | `opacity:0,y:40` → `1,0`, ease `[0.19,1,0.22,1]` | [COMPONENTS.md](references/COMPONENTS.md) |117| Spring presets | smooth/snappy/gentle/quick | [COMPONENTS.md](references/COMPONENTS.md) |118| Custom cursor | `data-technical` / `data-flashlight` / `data-magnetic` / `data-cursor` | [COMPONENTS.md](references/COMPONENTS.md) |119| Desktop nav | Floating pill, transparent → glass-modern on scroll | [RESPONSIVE.md](references/RESPONSIVE.md) |120| Mobile nav | Bottom tab bar (not hamburger), slide-out drawer | [RESPONSIVE.md](references/RESPONSIVE.md) |121| CTAs | Primary `bg-green-500 rounded-2xl`, never `rounded-full` | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |122| Section spacing | `py-16 md:py-32 lg:py-48` — extreme breathing room | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |123| Hero formula | Eyebrow → big title (green word + period) → subtitle → CTAs → stats → FrankenEye | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |124| Decorative system | FrankenBolt/Stitch/Container/Glitch/Eye — shared brand chrome | [COMPONENTS.md](references/COMPONENTS.md) |125| OG images | Satori/next/og — PNG only, no `<br/>`, `display:"flex"` everywhere | [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md) |126127---128129## Gotchas1301311. **SectionShell icon**: String key, not component ref. Add to BOTH import AND `sectionIcons` map1322. **Server/Client boundary**: No `next/dynamic` with `ssr: false` in Server Components (Next.js 16). Import `"use client"` components directly1333. **React 19**: No ref writes during render. No synchronous setState in effects1344. **Satori (next/og)**: No WebP, no `<br />`, no `borderRadius: "full"` (use "9999px"). Pre-convert with sharp1355. **Linter auto-modifies**: Re-read files before editing — ESLint may have changed imports1366. **.next/cache**: `rm -r .next/cache` fixes phantom type errors1377. **BUN only**: `bun dev`, `bun run build`, `bun lint`, `bun tsc --noEmit`1388. **Content**: ALL data in `lib/content.ts` — never separate data files1399. **RustCodeBlock**: Uses `title` prop, NOT `filename`14010. **GlowOrbits**: Native Web Animation API — don't convert to Framer Motion14111. **Portal**: Fixed-position inside transform parents breaks — use Portal from motion-wrapper.tsx14212. **Body scroll lock**: Must compensate scrollbar width — use `useBodyScrollLock`14313. **Event listeners**: Always `{ passive: true }` for scroll/mouse. RAF batching for cursor.14414. **Font loading**: Both fonts need `display: "swap"` to prevent FOIT145146---147148## Adapting for a New Project1491501. **Read [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) first** — absorb the aesthetic soul1512. **Fork structure, not code** — same tech stack, same visual language1523. **Replace content** — new `siteConfig`, `navItems`, `features`, etc.1534. **Swap accent color** — update `--color-green-prime` in CSS vars + component defaults1545. **Keep decorative system** — FrankenBolt/Stitch/Container/Glitch for brand unity1556. **Follow the scroll narrative** — homepage tells a story, each section is a chapter1567. **Maintain micro-labels** — every section needs the 10px uppercase eyebrow1578. **Preserve atmosphere** — GlowOrbits + noise + glass-modern + breathing space1589. **Test the "alive" feeling** — if the page feels static, something is missing159160Full 10-phase guide + checklist: [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md)161162---163164## References165166| I need to... | Read |167|--------------|------|168| Understand the brand, visual language, anti-patterns | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |169| Look up CSS vars, glass-modern, typography, utility classes | [DESIGN-SYSTEM.md](references/DESIGN-SYSTEM.md) |170| Understand a component's API, behavior, or props | [COMPONENTS.md](references/COMPONENTS.md) |171| Get exact values (SVG paths, spring configs, magic numbers) | [EXACT-VALUES.md](references/EXACT-VALUES.md) |172| See page-by-page implementation patterns | [PAGES.md](references/PAGES.md) |173| Check responsive/mobile behavior | [RESPONSIVE.md](references/RESPONSIVE.md) |174| Follow step-by-step new project setup | [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md) |