Initial design doc covering architecture, data model, tech stack, and interactive documentary experience for the game preservation initiative. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
197 lines
6.5 KiB
Markdown
197 lines
6.5 KiB
Markdown
# Project Afterlife — Design Document
|
||
|
||
> Preservando juegos online que merecen una segunda vida
|
||
|
||
**Date**: 2026-02-21
|
||
**Status**: Approved
|
||
**Team**: 4 programmers
|
||
|
||
---
|
||
|
||
## 1. Vision
|
||
|
||
Project Afterlife is an initiative dedicated to preserving discontinued online games by running private servers and documenting each game's history through interactive web documentaries with human-narrated audiobooks.
|
||
|
||
Monetization is 100% donation-based through external platforms (Patreon/Ko-fi).
|
||
|
||
## 2. Target Audience
|
||
|
||
- Multilingual (Spanish + English at launch)
|
||
- Former players of discontinued online games
|
||
- Gaming preservation community
|
||
- Gaming history enthusiasts
|
||
|
||
## 3. Web Structure
|
||
|
||
### Public Pages
|
||
|
||
| Page | Description |
|
||
|---|---|
|
||
| **Landing / Home** | Initiative mission, latest games added, donation CTA |
|
||
| **Game Catalog** | Filterable grid/list of all documented games (by genre, year, status) |
|
||
| **Game Page** | Individual game card: basic info, screenshots, private server link, documentary link |
|
||
| **Interactive Documentary** | Per-game chapter-based experience (text, images, video, narrated audio player) |
|
||
| **About Us** | Team, mission, how to contribute |
|
||
| **Donations** | Patreon/Ko-fi links + fund allocation transparency |
|
||
|
||
### CMS (Strapi Admin)
|
||
|
||
- Game CRUD management
|
||
- Documentary chapter editor (rich content)
|
||
- Media management (images, videos, audio files)
|
||
- Translation management (ES/EN)
|
||
- Team/collaborator management
|
||
|
||
## 4. Data Model
|
||
|
||
### Game
|
||
- `title` (localized)
|
||
- `slug`
|
||
- `description` (localized)
|
||
- `genre` (enum: MMORPG, FPS, Casual, Strategy, Sports, Other)
|
||
- `releaseYear`
|
||
- `shutdownYear`
|
||
- `developer`
|
||
- `publisher`
|
||
- `screenshots` (media[])
|
||
- `coverImage` (media)
|
||
- `serverStatus` (enum: online, maintenance, coming_soon)
|
||
- `serverLink` (URL)
|
||
- `documentary` (relation → Documentary)
|
||
|
||
### Documentary
|
||
- `game` (relation → Game)
|
||
- `title` (localized)
|
||
- `description` (localized)
|
||
- `chapters` (relation → Chapter[], ordered)
|
||
- `totalDuration` (computed from chapters)
|
||
- `publishedAt`
|
||
|
||
### Chapter
|
||
- `documentary` (relation → Documentary)
|
||
- `title` (localized)
|
||
- `content` (localized, rich text with inline media)
|
||
- `audioFile` (media — narrated audio)
|
||
- `audioDuration` (seconds)
|
||
- `order` (integer)
|
||
- `coverImage` (media)
|
||
|
||
### Translation Strategy
|
||
- Strapi i18n plugin for all content types
|
||
- Each content entry has locale variants (es, en)
|
||
- Frontend uses `next-intl` for UI strings
|
||
|
||
## 5. Interactive Documentary Experience
|
||
|
||
### Structure
|
||
Each game's documentary is divided into navigable chapters. Example:
|
||
|
||
1. "El Nacimiento" — How and why the game was created
|
||
2. "La Era Dorada" — Peak popularity, the community
|
||
3. "Así Se Jugaba" — Mechanics, classes, maps, gameplay
|
||
4. "El Declive" — What went wrong, player loss
|
||
5. "Luces Apagadas" — Server shutdown, community reactions
|
||
6. "La Restauración" — How it was restored, current server state
|
||
|
||
Chapters are fully customizable per game from the CMS.
|
||
|
||
### Chapter Components
|
||
- **Persistent audio player** — Fixed bottom bar (podcast/Spotify mini style)
|
||
- Play/pause, progress bar, playback speed
|
||
- Syncs with chapter navigation
|
||
- Can play full documentary or chapter-by-chapter
|
||
- **Narrative text** — Rich formatted content
|
||
- **Image gallery** — Screenshots, concept art, period photos
|
||
- **Embedded videos** — Trailers, gameplay, community moments
|
||
- **Side navigation** — Chapter index always visible for jumping between sections
|
||
- **Reading progress** — Bar indicating documentary completion
|
||
|
||
### Audio Player (Howler.js)
|
||
- Fixed bottom bar, always visible during documentary
|
||
- Controls: play/pause, seek, speed (0.5x–2x), volume
|
||
- Chapter sync: switching chapters updates audio position
|
||
- Continuous mode: plays all chapters in sequence
|
||
- Chapter mode: plays one chapter at a time
|
||
|
||
## 6. Tech Stack
|
||
|
||
### Frontend
|
||
| Technology | Purpose |
|
||
|---|---|
|
||
| Next.js 15 (App Router) | Main framework, SSR/ISR |
|
||
| TypeScript | Static typing |
|
||
| Tailwind CSS | Utility-first styles |
|
||
| Framer Motion | Documentary animations |
|
||
| next-intl | Internationalization (ES/EN) |
|
||
| Howler.js | Robust audio player |
|
||
|
||
### Backend / CMS
|
||
| Technology | Purpose |
|
||
|---|---|
|
||
| Strapi 5 | Headless CMS, REST/GraphQL API |
|
||
| PostgreSQL | Database |
|
||
| MinIO | S3-compatible self-hosted object storage (audio, images, video) |
|
||
|
||
### Infrastructure (100% Self-Hosted)
|
||
| Technology | Purpose |
|
||
|---|---|
|
||
| Nginx | Reverse proxy + static serving |
|
||
| Docker + Docker Compose | All services orchestration |
|
||
| VPS (own servers) | All hosting |
|
||
| Let's Encrypt / Certbot | Free SSL |
|
||
| GitHub Actions | CI/CD → automatic deploy to VPS |
|
||
|
||
## 7. Repository Structure
|
||
|
||
```
|
||
project-afterlife/
|
||
├── apps/
|
||
│ ├── web/ # Next.js frontend
|
||
│ │ ├── src/
|
||
│ │ │ ├── app/ # App Router pages
|
||
│ │ │ ├── components/ # React components
|
||
│ │ │ ├── lib/ # Utilities, API client
|
||
│ │ │ ├── messages/ # i18n translation files
|
||
│ │ │ └── styles/ # Global styles
|
||
│ │ ├── public/ # Static assets
|
||
│ │ └── package.json
|
||
│ └── cms/ # Strapi 5 CMS
|
||
│ ├── src/
|
||
│ │ ├── api/ # Content types
|
||
│ │ └── plugins/ # Custom plugins
|
||
│ └── package.json
|
||
├── packages/
|
||
│ └── shared/ # Shared TypeScript types
|
||
│ ├── src/
|
||
│ │ └── types/
|
||
│ └── package.json
|
||
├── docker/
|
||
│ ├── docker-compose.yml # All services
|
||
│ ├── nginx/
|
||
│ │ └── nginx.conf
|
||
│ └── certbot/
|
||
├── .github/
|
||
│ └── workflows/
|
||
│ └── deploy.yml
|
||
├── docs/
|
||
│ └── plans/
|
||
├── package.json # Monorepo root (workspaces)
|
||
├── turbo.json # Turborepo config
|
||
└── README.md
|
||
```
|
||
|
||
## 8. Monetization
|
||
|
||
- **Patreon**: Recurring donations with tiers (early access to documentaries, credits, etc.)
|
||
- **Ko-fi**: One-time donations
|
||
- Links prominently displayed on landing page and donation page
|
||
- Transparency: public breakdown of fund allocation
|
||
|
||
## 9. Non-Functional Requirements
|
||
|
||
- **Performance**: Static generation where possible, ISR for dynamic content
|
||
- **Accessibility**: Semantic HTML, ARIA labels, keyboard navigation, screen reader support
|
||
- **SEO**: Meta tags, Open Graph, structured data for games
|
||
- **Mobile**: Fully responsive, audio player adapts to mobile
|
||
- **Security**: HTTPS, CORS, rate limiting, CSP headers
|