diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 681b332..7aad196 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,6 +16,9 @@ jobs: cache: npm - run: npm ci + # prebuild.sh wird bewusst übersprungen — die JSON-Daten in src/data/ + # wurden lokal generiert und ins Repo committed. Nur lokales `npm run build` + # führt prebuild.sh aus. - run: npx astro build - uses: actions/upload-artifact@v4 diff --git a/AGENTS.md b/AGENTS.md index 765a268..09f620f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -138,6 +138,11 @@ npm run preview # → lokaler Production-Server `prebuild.sh` lädt vor jedem Build externe Daten (JSON) und schreibt sie nach `src/data/`. Die JSON wird committed, der Build hängt nicht vom externen Server ab. +**Wichtig:** `prebuild.sh` wird nur lokal ausgeführt, wenn sich externe Daten +ändern. Das Ergebnis (JSON-Dateien in `src/data/`) wird ins Repo committed. +In der CI/CD (`deploy.yml`) wird `npx astro build` direkt aufgerufen — das +überspringt `prebuild.sh` bewusst, da die JSON-Daten bereits im Repo liegen. + ```bash ./prebuild.sh # alle Stages ./prebuild.sh mods # nur MOD-Metadaten diff --git a/PLAN.md b/PLAN.md index e4a2bd2..0158362 100644 --- a/PLAN.md +++ b/PLAN.md @@ -1,34 +1,36 @@ -# PLAN.md - Implementation Roadmap (v2) +# PLAN.md - Implementation Roadmap -## Phase 0 - Scaffold (v1, done) + Phase 0.5 - v2 fixes (done in this drop) +## Phase 0 - Scaffold + v2 Fixes (done) - [x] Fix: ANSI banner renders (AnsiArt.astro + ansiArt.ts) - [x] Fix: Disconnect clears state (NavBar.astro) - [x] Fix: SkyLINE blue accent visible + real header PNG - [x] 10 boxed ASCII banners w/ dithering bars, 8 gallery patterns, 9 net-boxes - [x] Tropic DREAMs (4 real), SkyLINE (+3), Kosmos Design (7 new), ESPRIT (4 new) -- [x] MOD Files placeholder tracklist + visual player widget +- [x] MOD Files tracklist + visual player widget - [x] PHOB!A / Tr@nceMISSION teaser text, favicon.ico + og-image.png -## Phase 1 - Make it actually run -- [ ] npm install, npm run dev, npm run build && npm run preview -- [ ] Modem-Intro-Audio-Clips bereitstellen: public/audio/dial-tone.mp3, dtmf-beeps.mp3, modem-handshake.mp3 +## Phase 1 - Build & Infrastructure (done) +- [x] npm install, npm run dev, npm run build && npm run preview +- [x] Modem-Intro-Audio-Clips in public/audio/ +- [x] Pre-Build System (fetch_mods.py, prebuild.sh) +- [x] CP437 Webfont (Px437 IBM VGA 8x16, WOFF2+TTF) -## Phase 2 - Real ANSI rendering -- [ ] Feed real .ans files (via OpenCode) into source-assets/ansi/ -- [ ] Self-host CP437 webfont under public/fonts/ +## Phase 2 - Real ANSI-Art (offen) +- [ ] Echte .ans Dateien aus den 90ern besorgen +- [ ] 8 Filler-Patterns durch echte gescannte/analysierte .ans ersetzen -## Phase 3 - Navigation polish -- [ ] /bbs/atari/ etc. as mobile anchors to /bbs/#atari -- [ ] Astro View Transitions, subtle text-build-in stutter effect +## Phase 3-5 - Content & Visual (fast fertig) +- [x] Tr@nceMISSION, Kosmos Design, ESPRIT, SkyLINE Releases fertig +- [ ] Kosmos Design - outside-sbr.md: Placeholder bereinigen -## Phase 4-5 - Visual + Content -- [ ] Replace filler gallery patterns with real scanned ANSI art -- [ ] Replace placeholder releases with real ones, write real Impressum text +## Phase 6 - MOD Player (fertig) +- [x] chiptune3.js (libopenmpt AudioWorklet) eingebunden +- [x] ModPlayer.tsx mit Playlist +- [x] Echte .mod Dateien werden von moonweb.org gestreamt -## Phase 6 - Amiga MOD player -- [ ] Real WASM MOD player (libopenmpt.js/chiptune3.js), real .mod files - -## Phase 7-8 - Infra & Launch -- [ ] files.moonweb.org, public GitHub repo + Cloudflare Pages -- [ ] sitemap.xml/robots.txt, full click-through incl. regression test of - the two v1 bugs (banner visibility + Disconnect) +## Phase 7-8 - Infra & Launch (fertig) +- [x] www.moonweb.org/files/ als Asset-Hosting (Dateien liegen dort) +- [x] GitHub-Repo + Cloudflare Pages Deploy funktioniert +- [x] sitemap.xml / robots.txt +- [x]
comment. - Now rendered via src/components/AnsiArt.astro + src/lib/ansiArt.ts (precomputed - colored HTML via set:html, zero JS required). -2. Fixed: Disconnect not working - v1's mouse link never cleared localStorage, - so '/' bounced straight back to '/bbs/'. Fixed in src/components/NavBar.astro - via a plain onclick attribute that clears state before navigating. -3. More content: Tropic DREAMs (4 real releases), SkyLINE (+3), Kosmos Design - (7, new collection), ESPRIT (4, new collection), MOD Files tracklist, BBS - ANSI Art gallery (8 filler patterns), PHOB!A/Tr@nceMISSION teaser text. -4. More period ASCII art + gradients: 10 full boxed banners (5x7 bitmap font) - each with a dithering gradient bar, plus 9 net-list boxes transcribed - verbatim from the original reference screenshots (Fidonet/Nodelist page). -5. SkyLINE blue accent strengthened (headings/tiles/diz-box/nav-bar) + a real - generated header PNG (public/images/skyline-header.png). +## Architecture +- **Framework:** Astro 4.15+ mit React-Islands +- **Rendering:** Vollständig statisch (SSG), jede Route zur Build-Zeit vorgerendert +- **Hosting:** Cloudflare Pages +- **DNS:** Cloudflare -## Repository layout delta -src/lib/ansiArt.ts, src/components/AnsiArt.astro, src/components/NavBar.astro, -tools/generate_ansi.py, public/images/skyline-header.png, public/favicon.ico, -public/og-image.png, src/content/kosmos-design/*.md, src/content/esprit/*.md +## Repository Layout +``` +src/ +├── pages/ # Astro-Routing (eine Datei = eine URL) +├── components/ # Astro-Components + React-Islands +├── content/ # Markdown+Frontmatter für Releases +├── data/ # Pre-Build JSON (mods.json) +├── lib/ # ansiArt.ts, keymap.ts, sound.ts +└── styles/ # global.css +public/ +├── audio/ # Modem-Intro Sounds +├── js/ # chiptune3.js + WASM Worker +├── fonts/ # CP437 Webfont +└── images/ # skyline-header.png, og-image.png +tools/ # Pre-Build Scripts (Python) +``` -## AnsiArt contract -BANNER_/ ANSI_GALLERY / BOX_ exports, HTML with CSS classes -c-border-red, c-main-red, c-shadow-red, c-border-blue, c-main-blue, -c-shadow-blue, c-white, c-grey, c-pink, c-cyan (all in global.css). -Render via . +## AnsiArt Contract +- BANNER_ / ANSI_GALLERY / BOX_ als HTML-Exporte in ansiArt.ts +- CSS-Klassen: c-border-red, c-main-red, c-shadow-red, c-border-blue, c-main-blue, + c-shadow-blue, c-white, c-grey, c-pink, c-cyan (alle in global.css) +- Rendering via ` ` (zero JS, set:html) -## NavBar contract -optional [B] Back (history.back()), always [Q] Disconnect -(clears localStorage.hasConnected via onclick, then navigates to /), -optional [I] Impressum & Privacy. Use everywhere instead of ad-hoc links. +## NavBar Contract +- [B] Back (history.back()), [Q] Disconnect (clears localStorage.hasConnected), + [I] Legal Notice. Überall statt ad-hoc Links verwenden. -## Everything else -Routing table, design tokens, local dev workflow (npm run dev/build/preview), -deployment (Cloudflare Pages) - unchanged from v1. See PRD.md and PLAN.md. +## Pre-Build System +- `prebuild.sh` wird nur lokal ausgeführt, wenn sich externe Daten ändern +- Ergebnis (JSON in src/data/) wird ins Repo committed +- CI/CD (`deploy.yml`) ruft `npx astro build` direkt auf (überspringt prebuild.sh bewusst) + +## Design Tokens +- DOS 16-Farben-Palette, Hintergrund Schwarz +- CP437-Font für ANSI-Art, IBM Plex Mono für Fließtext +- Fix 80 Zeichen breit, vertikal scrollbar +- SkyLINE: einzige Seite mit Blau-Akzent (sonst immer Rot) + +## Routing +| URL | Seite | +|---|---| +| `/` | Modem-Intro (→ /bbs/ wenn localStorage.hasConnected) | +| `/bbs/` | Hauptmenü (2×2-Kachel-Raster) | +| `/bbs/pc/*` | PHOB!A, Tr@nceMISSION, SkyLINE, Kosmos Design | +| `/bbs/atari/*` | Tropic DREAMs | +| `/bbs/amiga/*` | ESPRIT, MOD Files | +| `/bbs/fido/*` | BBS ANSI Art, Fidonets & Nodelists | +| `/bbs/legal-notice` | Legal Notice | diff --git a/TODO.md b/TODO.md index 6f9679d..54d9ec4 100644 --- a/TODO.md +++ b/TODO.md @@ -1,155 +1,79 @@ -# TODO.md - Offene Aufgaben & Workflow +# TODO.md - Offene Aufgaben -Stand: 13.08.2026 | Referenz: PLAN.md, SPEC.md, PRD.md +Stand: 15.08.2026 | Referenz: PLAN.md, SPEC.md, PRD.md --- -## NÄCHSTER SCHRITT: Phase 1 (fertig) +## OFFENE AUFGABEN -### P1.1 Build-Chain testen -- [x] `npm install` ausgeführt -- [x] `npm run dev` → localhost:4321 funktioniert -- [x] `npm run build` → dist/ mit 12 Seiten erfolgreich -- [x] `npm run preview` → lokaler Production-Server (nächster Schritt) +### Kosmos Design - Outside SBR +- [ ] `src/content/kosmos-design/outside-sbr.md` — Placeholder-Text in Zeile 12 bereinigen + (`"exact wording pending, PRD.md 12"`) -### P1.2 Modem-Intro Audio -- [x] dial-tone.mp3 besorgen/erstellen → public/audio/ -- [x] dtmf-beeps.mp3 besorgen/erstellen → public/audio/ -- [x] modem-handshake.mp3 besorgen/erstellen → public/audio/ -- [x] ModemIntro.tsx testen (Line 1 = Sound, Line 2 = Direktzugang) - -### P1.3 Pre-Build System -- [x] `tools/fetch_mods.py` — MOD-Metadaten von moonweb.org -- [x] `prebuild.sh` — ruft alle Pre-Build Stages auf -- [x] `npm run build` führt automatisch prebuild.sh aus -- [x] `src/data/mods.json` — gecachte MOD-Daten - ---- - -## VOR DEM LIVE-TEST - -### Inhalt aufräumen -- [ ] Placeholder-Texte in Content-Dateien entfernen (`[Placeholder/fake content]`, PRD.md-Referenzen) - - [ ] `src/content/skyline/disk-doctor.md` - - [ ] `src/content/skyline/example-tool.md` - - [ ] `src/content/skyline/megademo-93.md` - - [ ] `src/content/skyline/sky-file-manager.md` - - [ ] `src/content/esprit/esprit-utility-music.md` - - [ ] `src/content/esprit/esprit-demomaker-1.md` - - [ ] `src/content/esprit/esprit-utility-copy.md` - - [ ] `src/content/esprit/esprit-demomaker-2.md` - - [ ] `src/content/kosmos-design/kds-intro-1.md` - - [ ] `src/content/kosmos-design/kds-cracktro-pack.md` - - [ ] `src/content/kosmos-design/kds-slideshow.md` - - [ ] `src/content/kosmos-design/kds-musicdisk.md` -- [ ] Placeholder-Hinweise in Seiten-Descriptions entfernen: - - [ ] `src/pages/bbs/pc/skyline.astro` (PRD.md 12) - - [ ] `src/pages/bbs/pc/trancemission.astro` (PRD.md section 12) - - [ ] `src/pages/bbs/pc/kosmos-design.astro` (PRD.md 12) - - [ ] `src/pages/bbs/amiga/esprit.astro` (PRD.md 12) - - [ ] `src/pages/bbs/fido/ansi-art.astro` (PRD.md section 3) - -### Asset-Hosting -- [ ] `files.moonweb.org` einrichten (Synology oder Static-Fileserver) -- [ ] Download-Dateien (.zip, .mod) dort ablegen -- [ ] Links in Content-Dateien prüfen/aktualisieren - ---- - -## DANACH: Phase 2 - ANSI-Art - -### P2.1 Echte .ans Dateien -- [ ] Original .ans Dateien aus den 90ern besorgen +### ANSI-Art in Menüs +- [ ] Echte .ans Dateien aus den 90ern besorgen - [ ] In source-assets/ansi/ ablegen - [ ] generate_ansi.py anpassen oder neuen Parser schreiben - [ ] In ansiArt.ts einbinden (Fallback auf generierte Patterns) - -### P2.2 CP437 Webfont -- [ ] Passenden CP437/DOS-Font beschaffen (Web 437, Perfect DOS VGA 437) -- [ ] Als WOFF2 unter public/fonts/ ablegen -- [ ] @font-face in global.css korrigieren (aktuell: `src: local('Web 437')` → funktioniert nur wenn Font installiert) -- [ ] Testing: ANSI-Art mit echtem Font rendern - ---- - -## DANACH: Phase 3 - Navigation - -### P3.1 Mobile Anchors -- [ ] /bbs/atari/ → /bbs/#atari als Scroll-Ziel -- [ ] /bbs/amiga/ → /bbs/#amiga -- [ ] /bbs/fido/ → /bbs/#fido -- [ ] /bbs/pc/ → /bbs/#pc (falls nötig) - -### P3.2 View Transitions -- [ ] Astro View Transitions einbauen -- [ ] Optional: Subtiler Textaufbau-Effekt ("Stottern") - ---- - -## DANACH: Phase 4-5 - Content & Visual - -### P4.1 Echte ANSI-Art - [ ] 8 Filler-Patterns durch echte gescannte/analysierte .ans ersetzen - [ ] BBS ANSI Art Seite aktualisieren -### P4.2 Echte Releases -- [ ] SkyLINE: placeholder/disk-doctor.md → echte Inhalte -- [ ] SkyLINE: example-tool.md → echte Inhalte -- [ ] Kosmos Design: Prüfen ob alle Credits korrekt sind -- [ ] ESPRIT: Prüfen ob alle Inhalte korrekt sind -- [ ] Tr@nceMISSION: Fehlende Releases nachtragen (PRD.md 12) +--- -### P4.3 Impressum -- [x] Pflichtangaben zusammenstellen (Name, Anschrift, Kontakt) -- [x] legal-notice.astro ausfüllen -- [x] Auf Englisch (PRD.md 6.3) +## ERLEDIGT + +### Phase 1 - Build-Chain +- [x] npm install, npm run dev, npm run build, npm run preview + +### Phase 1.2 - Modem-Intro Audio +- [x] dial-tone.mp3, dtmf-beeps.mp3, modem-handshake.mp3 in public/audio/ + +### Phase 1.3 - Pre-Build System +- [x] tools/fetch_mods.py → src/data/mods.json +- [x] prebuild.sh als Orchestrator + +### CP437 Webfont +- [x] Px437 IBM VGA 8x16 als WOFF2 + TTF in public/fonts/ +- [x] @font-face in global.css korrigiert + +### Inhalt aufräumen +- [x] Placeholder-Texte in Content-Dateien entfernt (12 .md-Dateien gelöscht/bereinigt) +- [x] Placeholder-Hinweise in Seiten-Descriptions entfernt (5 .astro-Dateien bereinigt) + +### Releases +- [x] Tr@nceMISSION: fertig +- [x] Kosmos Design: fertig (außer outside-sbr.md) +- [x] ESPRIT: fertig +- [x] SkyLINE: fertig + +### Asset-Hosting +- [x] www.moonweb.org/files/ als Hosting-Lösung (Dateien liegen dort, wird schon überall verlinkt) + +### MOD Player +- [x] chiptune3.js + libopenmpt AudioWorklet eingebunden +- [x] ModPlayer.tsx mit Playlist +- [x] Echte .mod Dateien werden von moonweb.org gestreamt + +### Deployment +- [x] GitHub-Repo veröffentlicht +- [x] Cloudflare Pages Projekt angelegt + funktioniert +- [x] CI/CD Pipeline (.github/workflows/deploy.yml) konfiguriert +- [x] DNS-Eintrag für 28k8.moonweb.org aktiv +- [x] Live-Deploy funktioniert + +### SEO +- [x] sitemap.xml generiert (public/sitemap.xml) +- [x] robots.txt angelegt (public/robots.txt) +- [x] und pro Seite geprüft + +### Legal Notice +- [x] Pflichtangaben zusammengefasst +- [x] legal-notice.astro ausgefüllt (auf Englisch) --- -## DANACH: Phase 6 - MOD Player +## GESTRICHEN (nicht mehr relevant) -### P6.1 WASM MOD Player -- [x] chiptune3.js (libopenmpt AudioWorklet) eingebunden -- [x] `tools/fetch_mods.py` → `src/data/mods.json` (pre-build) -- [x] `ModPlayer.tsx` React-Island mit Playlist -- [x] `prebuild.sh` Orchestrator für alle Pre-Build Stages -- [ ] Echte .mod Dateien auf files.moonweb.org bereitstellen (oder direkt von moonweb.org streamen) - ---- - -## LETZTE PHASE: 7-8 - Infra & Launch - -### P7.1 Asset-Hosting -- [ ] files.moonweb.org einrichten (Synology oder Static-Fileserver) -- [ ] Alle Downloads (.ans, .mod, Disk-Images) dort ablegen -- [ ] Links in Content-Dateien aktualisieren - -### P7.2 Deployment -- [ ] GitHub-Repo veröffentlichen -- [ ] Cloudflare Pages Projekt anlegen -- [ ] Build-Command: `npm run build`, Output: `dist` -- [ ] DNS-Eintrag für 28k8.moonweb.org prüfen -- [ ] Erstes Live-Deploy - -### P7.3 SEO & Finalisierung -- [ ] sitemap.xml generieren -- [ ] robots.txt anlegen -- [ ] und pro Seite prüfen -- [ ] Full click-through Regression Test - - [ ] Banner sichtbar auf Hauptmenü? - - [ ] Disconnect → localStorage geleert → Redirect zu /? - - [ ] Alle Keyboard-Shortcuts funktionieren? - - [ ] Mobile Ansicht: Kacheln gestapelt? - ---- - -## EMBEDDED CONTEXT (für neuen Chat) - -Wenn du diesen Kontext in einem neuen Chat öffnest: - -1. Lies diese Datei als erstes -2. Das NÄCHSTE unmittelbare Ziel steht oben unter "NÄCHSTER SCHRITT" -3. Fertige Phasen sind unten (hier aktuell: Phase 1 + Pre-Launch Checklist) -4. Referenz-Dokumente: PLAN.md (Roadmap), SPEC.md (Tech-Spec), PRD.md (Anforderungen) -5. AGENTS.md hat die Projektstruktur und technischen Details -6. Wenn Phase 1 fertig ist → diese Datei aktualisieren, Phase 1 als done markieren, Phase 2 als nächstes setzen +- **Mobile Anchors** (/bbs/atari/ → /bbs/#atari): Overkill, Kachel-Struktur rendert unnötig +- **View Transitions**: Welcome Banner Stottern funktioniert bereits, restliche Seiten brauchen das nicht +- **Echte Releases nachtragen**: Alle fertig bis auf outside-sbr.md