--- status: in-progress --- # EPIC Timeline — Repo bootstrap + 7 mockups Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** A Bun app, shipped as a Docker image, that serves an index page and 7 design-direction mockups. All of them share one sample dataset and carry fan-project credits. The repo is prepared for agents following the playbook. **Architecture:** `Bun.serve` with HTML-import routes. `bun build --target=bun` bundles the server and every page into `dist/`, and the Docker image runs `bun dist/server.js`. Each mockup is a self-contained folder under `src/mockups/NN-slug/` that imports the shared data, credits and audio modules. **Tech Stack:** Bun 1.3.x (runtime, bundler, test runner), TypeScript, three.js (mockups 06/07 only), `@fontsource/*` for self-hosted fonts, Docker `oven/bun:1.3`. **Spec:** `docs/specs/001-timeline-mockups.md` ## Global Constraints - Every page (the index and all 7 mockups) shows the fan notice and the credit to **Jorge Rivera-Herrans**, both from `src/shared/credits.ts`. - Mockups, not full pages. Target a desktop viewport of 1440×900. No routing, persistence, or mobile polish. - Self-contained at runtime: no CDN scripts or fonts. Video slots are YouTube link cards. Songs may have an optional direct MP3. - three.js only in `src/mockups/06-constellation/` and `src/mockups/07-sea-voyage/`. - No framework (Vite, React, Next…). Use plain TypeScript and the DOM plus Bun's bundler. - Sample data: Troy Saga (5 songs), Cyclops Saga (4 songs), and 1–2 later callback songs. Lyrics are placeholder lines. Facts that haven't been checked are marked `// TODO(verify)`. - A mockup agent edits **only its own folder** `src/mockups/NN-slug/`. Shared files are fixed after Task 1. - Commits use Conventional Commits and end with `Co-Authored-By: Claude Opus 5.5 `. ## Review Focus 1. **Song with no `audio`** (every sample song): the audio slot shows an empty state ("No audio yet"), never a broken `