Add Project Afterlife design document
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>
This commit is contained in:
196
docs/plans/2026-02-21-project-afterlife-design.md
Normal file
196
docs/plans/2026-02-21-project-afterlife-design.md
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
# 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
|
||||||
Reference in New Issue
Block a user