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: Build FrankenSuite project websites matching frankentui.com quality. Use when creating a new FrankenSuite website, adding pages/sections, or adapting the design system for a different project.4---56<!-- TOC: Brand | Quick Start | Architecture | Gotchas | Adaptation | References -->78# FrankenSuite Website Development910> **Reference implementation:** `/data/projects/frankentui_website` (frankentui.com)11> Read the source files AND [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) before building.1213---1415## Brand Essence1617**"Laboratory of Beautiful Monsters"** — industrial horror meets Stripe-grade polish.1819- Bolts = fasteners, Stitches = sutures, Glitches = electrical surges, Eye = the monster watching, Green = life force20- Every heading uses the **"One Green Word"** pattern: `"Get [Started]."` — green word is the most evocative, period makes it declarative21- **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 blog22- The site **breathes** through 4 atmospheric layers: GlowOrbits (background) → SpectralBackground noise/grain (atmosphere) → glass-modern cards (content) → custom cursor (interactive)23- 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)2425Full philosophy, anti-patterns, visual language: [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md)2627---2829## Quick Start3031```bash32bunx create-next-app@latest <project>-website --ts --tailwind --app --src-dir=false33cd <project>-website34bun add framer-motion lucide-react clsx tailwind-merge highlight.js marked dompurify35```3637Copy from `frankentui_website`:38```39# Required (brand consistency)40components/ franken-elements.tsx franken-glitch.tsx franken-eye.tsx41 motion-wrapper.tsx section-shell.tsx client-shell.tsx42 site-header.tsx site-footer.tsx custom-cursor.tsx43lib/ utils.ts site-state.tsx44hooks/ use-body-scroll-lock.ts use-intersection-observer.ts45app/ globals.css4647# Optional (copy as needed)48components/ glow-orbits.tsx spectral-background.tsx terminal-demo.tsx49 screenshot-gallery.tsx rust-code-block.tsx comparison-table.tsx50 timeline.tsx tweet-wall.tsx video-player.tsx stats-grid.tsx51 animated-number.tsx decoding-text.tsx error-boundary.tsx52 motion/index.tsx motion/magnetic.tsx53```5455Then: create `lib/content.ts` → update `app/layout.tsx` (Inter + JetBrains Mono) → build pages.5657Full step-by-step: [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md)5859---6061## Workflow6263- [ ] Scaffold Next.js 16 + BUN64- [ ] Copy design system + shared components65- [ ] Create `lib/content.ts` (ALL content in this one file)66- [ ] Build homepage following scroll narrative order67- [ ] Build subpages: Showcase, Architecture, Getting Started (minimum)68- [ ] Verify mobile: bottom nav, responsive grids, touch interactions69- [ ] `bun run build && bun tsc --noEmit` — zero errors70- [ ] Deploy to Vercel7172---7374## Tech Stack7576Next.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`7778**BUN only** — never npm/yarn/pnpm. TypeScript strict, bundler resolution, `@/*` path alias.7980---8182## Architecture8384```85RootLayout (server) → ClientShell ("use client" boundary)86 ├── SiteProvider (context: anatomy, terminal, audio)87 ├── SiteHeader (desktop pill nav + mobile bottom nav)88 ├── AnimatePresence page transitions89 │ └── {children}90 ├── SiteFooter91 └── CustomCursor (desktop only)92```9394**SectionShell** — core layout primitive (4/8 col grid, sticky sidebar):95```tsx96<SectionShell id="features" icon="sparkles" eyebrow="Why" title="Built Different" kicker="...">97 {/* content */}98</SectionShell>99```100101**Content centralization**: ALL data in `lib/content.ts` — `siteConfig`, `navItems`, `heroStats`, `features`, `screenshots`, `codeExample`, `comparisonData`, `changelog`, `tweets`. Types co-located. Never separate data files.102103Component details: [COMPONENTS.md](references/COMPONENTS.md) · Motion system: [EXACT-VALUES.md](references/EXACT-VALUES.md)104105---106107## Key Design Patterns108109| Pattern | Implementation | Details in |110|---------|---------------|------------|111| Glass morphism | `rgba(5,18,5,0.8)` + `blur(12px)` + green/12% border | [DESIGN-SYSTEM.md](references/DESIGN-SYSTEM.md) |112| Micro-labels | `text-[10px] font-black uppercase tracking-[0.3em]` | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |113| Viewport entry | `opacity:0,y:40` → `1,0`, ease `[0.19,1,0.22,1]` | [COMPONENTS.md](references/COMPONENTS.md) |114| Spring presets | smooth/snappy/gentle/quick | [COMPONENTS.md](references/COMPONENTS.md) |115| Custom cursor | `data-technical` / `data-flashlight` / `data-magnetic` / `data-cursor` | [COMPONENTS.md](references/COMPONENTS.md) |116| Desktop nav | Floating pill, transparent → glass-modern on scroll | [RESPONSIVE.md](references/RESPONSIVE.md) |117| Mobile nav | Bottom tab bar (not hamburger), slide-out drawer | [RESPONSIVE.md](references/RESPONSIVE.md) |118| CTAs | Primary `bg-green-500 rounded-2xl`, never `rounded-full` | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |119| Section spacing | `py-16 md:py-32 lg:py-48` — extreme breathing room | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |120| Hero formula | Eyebrow → big title (green word + period) → subtitle → CTAs → stats → FrankenEye | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |121| Decorative system | FrankenBolt/Stitch/Container/Glitch/Eye — shared brand chrome | [COMPONENTS.md](references/COMPONENTS.md) |122| OG images | Satori/next/og — PNG only, no `<br/>`, `display:"flex"` everywhere | [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md) |123124---125126## Gotchas1271281. **SectionShell icon**: String key, not component ref. Add to BOTH import AND `sectionIcons` map1292. **Server/Client boundary**: No `next/dynamic` with `ssr: false` in Server Components (Next.js 16). Import `"use client"` components directly1303. **React 19**: No ref writes during render. No synchronous setState in effects1314. **Satori (next/og)**: No WebP, no `<br />`, no `borderRadius: "full"` (use "9999px"). Pre-convert with sharp1325. **Linter auto-modifies**: Re-read files before editing — ESLint may have changed imports1336. **.next/cache**: `rm -r .next/cache` fixes phantom type errors1347. **BUN only**: `bun dev`, `bun run build`, `bun lint`, `bun tsc --noEmit`1358. **Content**: ALL data in `lib/content.ts` — never separate data files1369. **RustCodeBlock**: Uses `title` prop, NOT `filename`13710. **GlowOrbits**: Native Web Animation API — don't convert to Framer Motion13811. **Portal**: Fixed-position inside transform parents breaks — use Portal from motion-wrapper.tsx13912. **Body scroll lock**: Must compensate scrollbar width — use `useBodyScrollLock`14013. **Event listeners**: Always `{ passive: true }` for scroll/mouse. RAF batching for cursor.14114. **Font loading**: Both fonts need `display: "swap"` to prevent FOIT142143---144145## Adapting for a New Project1461471. **Read [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) first** — absorb the aesthetic soul1482. **Fork structure, not code** — same tech stack, same visual language1493. **Replace content** — new `siteConfig`, `navItems`, `features`, etc.1504. **Swap accent color** — update `--color-green-prime` in CSS vars + component defaults1515. **Keep decorative system** — FrankenBolt/Stitch/Container/Glitch for brand unity1526. **Follow the scroll narrative** — homepage tells a story, each section is a chapter1537. **Maintain micro-labels** — every section needs the 10px uppercase eyebrow1548. **Preserve atmosphere** — GlowOrbits + noise + glass-modern + breathing space1559. **Test the "alive" feeling** — if the page feels static, something is missing156157Full 10-phase guide + checklist: [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md)158159---160161## References162163| I need to... | Read |164|--------------|------|165| Understand the brand, visual language, anti-patterns | [DESIGN-PHILOSOPHY.md](references/DESIGN-PHILOSOPHY.md) |166| Look up CSS vars, glass-modern, typography, utility classes | [DESIGN-SYSTEM.md](references/DESIGN-SYSTEM.md) |167| Understand a component's API, behavior, or props | [COMPONENTS.md](references/COMPONENTS.md) |168| Get exact values (SVG paths, spring configs, magic numbers) | [EXACT-VALUES.md](references/EXACT-VALUES.md) |169| See page-by-page implementation patterns | [PAGES.md](references/PAGES.md) |170| Check responsive/mobile behavior | [RESPONSIVE.md](references/RESPONSIVE.md) |171| Follow step-by-step new project setup | [ADAPTATION-GUIDE.md](references/ADAPTATION-GUIDE.md) |