import { notFound } from "next/navigation"; import { getProjectBySlug } from "@/app/_data/get-project"; import GalleryCarousel from "@/components/gallery-carousel"; import ScrollHero from "@/components/scroll-hero"; import { Reveal, Stagger, StaggerItem } from "@/components/reveal"; export const dynamic = "force-dynamic"; export const revalidate = 0; function Badge({ children }: { children: React.ReactNode }) { return ( {children} ); } function FeatureTile({ title, desc }: { title: string; desc: string }) { return (
{title}
{desc}
); } export default async function ProjectPage({ params, }: { params: Promise<{ slug: string }>; }) { const { slug } = await params; const project = getProjectBySlug(slug); if (!project) return notFound(); return (
{/* ambient light */}
{/* optional noise (if you generated noise.png) */}
{/* breadcrumbs / links */}
{(project.links ?? [{ label: "Home", href: "/" }]).map((l) => ( {l.label} ))} / {project.title}
{/* header */}
{project.tag}

{project.title}

{project.description}

{project.status && {project.status}} {project.year && {project.year}} {(project.stack ?? []).map((s) => ( {s} ))}
{/* scroll-reactive hero */}
{/* centered carousel */} {/* sections */}
{(project.sections ?? []).map((s) => (

{s.title}

{s.content}

))}
{/* macropad enhancements */} {project.slug === "macropad" && (

Key capabilities

Designed around muscle memory: fast macros, precise control, and clear feedback.

{/* Roadmap */}
Roadmap
Last updated: Feb 2026
{[ { title: "WIP (now)", desc: "Macro editor, press/hold mapping, LED syncing, core firmware stability.", done: true, }, { title: "Beta", desc: "Profiles + export/import, device discovery, per-app volume routing polish.", done: false, }, { title: "v1", desc: "Installer packaging, cross-platform hotkey backend, full documentation + demo video.", done: false, }, ].map((item) => (
{item.title}
{item.desc}
))}
{/* Architecture */}
Architecture
ESP32 firmware
  • Encoder + button input scanning
  • Hold threshold + action dispatch
  • FastLED strips + ring feedback
  • EEPROM persistence (colors/settings)
Desktop app
  • Macro recording + manual entry
  • Per-app volume selection + control
  • Profiles (save/load/export JSON)
  • Sync state → LEDs (color + fill)
)} {/* back */}
); }