Single-page, neo-brutalist hackathon draw site. One click rolls two 3D dice: one lands a theme, the other lands a problem statement. The stage then transforms into that theme's world with a character pop, a problem card, the theme hook and a Next Team reset.
Built with Next.js (app router), Tailwind CSS and Framer Motion. No 3D library, no database, no API keys.
npm install
npm run devOpen http://localhost:3000. Production build:
npm run build
npm startEverything you need to change lives in data/rogue.ts.
- Write the final problem statements. Replace the six
PROBLEMSentries (title, description, tags). Face 2 of the problem die maps toPROBLEMSindex 1, and so on. - Theme media.
data/theme-media.tsholds official web artwork and community-hosted sound cues with source links. The six worlds are Shinchan, Spider-Man, Kick Buttowski, Dragon Ball, Harry Potter, and Super Mario. - Audio. Cues play once for up to 12 seconds with a fade. Replay and retry controls appear when needed. Mute survives Next Team resets. Original synthesized melodies have been removed; only the dice landing ticks are synthesized.
- Artwork. Official web backgrounds replace the stock footage. Local SVG scenes and character emoji are fallbacks if images fail.
wallpaperPositionandsceneWashcontrol cropping and readability. - Provenance. See
ASSET-SOURCES.md. The sound uploads are community-hosted, not verified publisher releases. Remote media requires internet access.
npm run build
npm testThe audio tests cover reset races, immediate reduced-motion reveals, theme changes, fade/cutoff, mute persistence, and retry after a failed source.
- Idle — two question-mark dice, labels, and the ROLL THE DICE button.
- Roll — both dice tumble; die 1 lands at 1.6s, die 2 at 1.9s with a stage shake. Results use
crypto.getRandomValueswith rejection sampling, so the distribution is flat and both dice can match. - Reveal — dice shrink to a strip at the top, a diagonal halftone wipe sweeps the stage, and the theme world mounts underneath.
- Result — character springs in on the left, problem card slides in on the right, the hook starts, and NEXT TEAM resets everything. Audio mute survives the reset.
- Reduced motion —
prefers-reduced-motionskips the tumble, wipe and spring and shows the result immediately.
app/ layout, page, global neo-brutalist styles
components/ Stage orchestrator, dice, scene backdrop, theme world, card, chrome
data/rogue.ts themes, problem statements, dice mappings
lib/roll.ts crypto dice roll
lib/jingle.ts dice landing ticks
lib/useThemeAudio.ts React audio state
lib/theme-player.ts recording playback, cutoff, mute and cleanup
data/theme-media.ts remote media URLs and source pages
public/themes/<slug> local SVG fallback and character art
Push to GitHub and import the repo on Vercel. Framework preset: Next.js. No environment variables required. The page is a single client-interactive route; everything else is static.