880 lines
22 KiB
Markdown
880 lines
22 KiB
Markdown
# Phase 1: Foundation - Complete Implementation Guide
|
|
|
|
**Duration**: Weeks 1-4 | **Complexity**: High | **Status**: IN PROGRESS (50%)
|
|
|
|
## Executive Summary
|
|
|
|
Phase 1 establishes the core streaming platform: user authentication, creator channels, basic HLS streaming with chat functionality, and stream lifecycle management. This is the foundation upon which all subsequent phases are built.
|
|
|
|
---
|
|
|
|
## Phase 1 Goals
|
|
|
|
### Primary Goal
|
|
Launch a working live streaming platform where creators can:
|
|
1. Sign up and create a channel
|
|
2. Get an RTMP ingest URL for streaming
|
|
3. Go live and manage their stream
|
|
4. Communicate with viewers in real-time via chat
|
|
|
|
### Success Criteria
|
|
- ✅ 100+ creators onboarded
|
|
- ✅ 500+ registered users
|
|
- ✅ 50+ concurrent peak viewers
|
|
- ✅ <2s stream start latency
|
|
- ✅ <100ms chat message latency
|
|
- ✅ 99.9% streaming uptime
|
|
- ✅ Zero critical bugs in production
|
|
|
|
---
|
|
|
|
## Sprint Breakdown
|
|
|
|
### Sprint 1.1: Database & Authentication
|
|
**Duration**: Days 1-5 | **Team**: 1-2 devs | **Status**: 🔄 IN PROGRESS
|
|
|
|
#### User Story 1.1.1: Database Setup
|
|
```
|
|
AS A developer
|
|
I WANT a PostgreSQL database schema
|
|
SO THAT I can store user and channel data reliably
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Create PostgreSQL database on Railway
|
|
- [ ] Initialize Prisma project
|
|
- [ ] Create initial schema (see below)
|
|
- [ ] Set up database migrations
|
|
- [ ] Add connection pooling
|
|
|
|
**Schema - Core Tables**:
|
|
```prisma
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
username String @unique
|
|
displayName String
|
|
avatar String?
|
|
bio String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
profile Profile?
|
|
channels Channel[]
|
|
followees Follow[] @relation("follower")
|
|
followers Follow[] @relation("followee")
|
|
chatMessages Message[]
|
|
subscriptions Subscription[]
|
|
|
|
// Clerk integration
|
|
clerkId String @unique
|
|
}
|
|
|
|
model Profile {
|
|
id String @id @default(cuid())
|
|
userId String @unique
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
socialLinks String? // JSON: { twitch, youtube, twitter, etc }
|
|
notificationEmail String?
|
|
theme String @default("dark")
|
|
language String @default("en")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
model Channel {
|
|
id String @id @default(cuid())
|
|
creatorId String
|
|
creator User @relation(fields: [creatorId], references: [id], onDelete: Cascade)
|
|
name String
|
|
slug String @unique
|
|
description String?
|
|
avatar String?
|
|
banner String?
|
|
|
|
// Stream settings
|
|
category String @default("just-chatting")
|
|
tags String[] @default([])
|
|
isPublic Boolean @default(true)
|
|
|
|
// RTMP ingest
|
|
streamKey String @unique @default(cuid())
|
|
streamUrl String @default("rtmp://ingest.aethex.live/live")
|
|
|
|
// Stats
|
|
viewCount Int @default(0)
|
|
followerCount Int @default(0)
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
streams Stream[]
|
|
followers ChannelFollow[]
|
|
messages Message[]
|
|
}
|
|
|
|
model Stream {
|
|
id String @id @default(cuid())
|
|
channelId String
|
|
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
|
|
|
|
title String
|
|
description String?
|
|
|
|
status StreamStatus @default(OFFLINE) // OFFLINE, LIVE, ENDING, ARCHIVED
|
|
startTime DateTime?
|
|
endTime DateTime?
|
|
|
|
// Streaming specifics
|
|
viewerCount Int @default(0)
|
|
peakViewers Int @default(0)
|
|
duration Int? // in seconds
|
|
|
|
// HLS details
|
|
hlsUrl String?
|
|
thumbnailUrl String?
|
|
recordingPath String?
|
|
|
|
// VOD (added in Phase 3)
|
|
isArchived Boolean @default(false)
|
|
vodUrl String?
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
// Relations
|
|
messages Message[]
|
|
}
|
|
|
|
enum StreamStatus {
|
|
OFFLINE
|
|
LIVE
|
|
ENDING
|
|
ARCHIVED
|
|
}
|
|
|
|
model Message {
|
|
id String @id @default(cuid())
|
|
channelId String
|
|
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
|
|
streamId String?
|
|
stream Stream? @relation(fields: [streamId], references: [id], onDelete: SetNull)
|
|
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
content String
|
|
|
|
// For Phase 2+ features
|
|
badges String[] @default([]) // moderator, subscriber, etc
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
// Soft delete for moderation
|
|
deletedAt DateTime?
|
|
}
|
|
|
|
// Social - Added in Phase 2, but framework in Phase 1
|
|
model Follow {
|
|
id String @id @default(cuid())
|
|
followerId String
|
|
follower User @relation("follower", fields: [followerId], references: [id], onDelete: Cascade)
|
|
|
|
followeeId String
|
|
followee User @relation("followee", fields: [followeeId], references: [id], onDelete: Cascade)
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
@@unique([followerId, followeeId])
|
|
}
|
|
|
|
model ChannelFollow {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
channelId String
|
|
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
@@unique([userId, channelId])
|
|
}
|
|
|
|
// Monetization - Added in Phase 4, framework in Phase 1
|
|
model Subscription {
|
|
id String @id @default(cuid())
|
|
userId String
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
channelId String
|
|
|
|
tier SubscriptionTier @default(BASIC)
|
|
stripeSubId String?
|
|
|
|
status SubStatus @default(ACTIVE) // ACTIVE, CANCELLED, EXPIRED
|
|
startDate DateTime @default(now())
|
|
renewalDate DateTime?
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
enum SubscriptionTier {
|
|
BASIC
|
|
PREMIUM
|
|
VIP
|
|
}
|
|
|
|
enum SubStatus {
|
|
ACTIVE
|
|
CANCELLED
|
|
EXPIRED
|
|
}
|
|
```
|
|
|
|
**Deliverables**:
|
|
- [ ] Prisma schema file
|
|
- [ ] Migration files
|
|
- [ ] Database deployed on Railway
|
|
- [ ] Connection tests passing
|
|
|
|
---
|
|
|
|
#### User Story 1.1.2: Clerk Authentication
|
|
```
|
|
AS A user
|
|
I WANT to sign up and authenticate
|
|
SO THAT I can access the platform securely
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Set up Clerk account
|
|
- [ ] Install @clerk/nextjs
|
|
- [ ] Create auth middleware
|
|
- [ ] Build sign-up page (`/auth/register`)
|
|
- [ ] Build login page (`/auth/login`)
|
|
- [ ] Build onboarding form (username, avatar, bio)
|
|
- [ ] Sync Clerk users to database
|
|
|
|
**Components to Build**:
|
|
```
|
|
components/auth/
|
|
├── SignUpForm.tsx
|
|
├── LoginForm.tsx
|
|
├── OnboardingForm.tsx
|
|
└── AuthGuard.tsx
|
|
```
|
|
|
|
**API Routes**:
|
|
- `POST /api/auth/onboard` - Create user profile after Clerk signup
|
|
- `GET /api/auth/user` - Get current user
|
|
- `PUT /api/auth/profile` - Update profile
|
|
|
|
**Deliverables**:
|
|
- [ ] Sign up flow working
|
|
- [ ] Clerk + Prisma sync
|
|
- [ ] Protected routes working
|
|
- [ ] User profiles created
|
|
|
|
---
|
|
|
|
#### User Story 1.1.3: Creator Profile Management
|
|
```
|
|
AS A creator
|
|
I WANT to manage my channel profile
|
|
SO THAT I can customize my brand
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Build profile edit page (`/dashboard/profile`)
|
|
- [ ] Avatar upload to Cloudflare R2
|
|
- [ ] Banner upload to Cloudflare R2
|
|
- [ ] Bio/description editing
|
|
- [ ] Social links configuration
|
|
- [ ] Theme preferences
|
|
|
|
**Components**:
|
|
```
|
|
components/dashboard/
|
|
├── ProfileEditor.tsx
|
|
├── AvatarUpload.tsx
|
|
├── BannerUpload.tsx
|
|
└── SocialLinksForm.tsx
|
|
```
|
|
|
|
**API Routes**:
|
|
- `PUT /api/profile` - Update user profile
|
|
- `POST /api/upload/avatar` - Upload avatar
|
|
- `POST /api/upload/banner` - Upload banner
|
|
|
|
**Deliverables**:
|
|
- [ ] Profile editing working
|
|
- [ ] File uploads to R2
|
|
- [ ] Profile display on public pages
|
|
|
|
---
|
|
|
|
### Sprint 1.2: Basic Streaming
|
|
**Duration**: Days 6-10 | **Team**: 2 devs | **Status**: ✅ MOSTLY DONE
|
|
|
|
#### User Story 1.2.1: Creator Dashboard
|
|
```
|
|
AS A creator
|
|
I WANT a dashboard to manage my streams
|
|
SO THAT I can go live and monitor activity
|
|
```
|
|
|
|
**Tasks**:
|
|
- [x] Build dashboard layout (`/dashboard`)
|
|
- [x] Display stream key securely
|
|
- [x] Show/hide stream key functionality
|
|
- [x] Copy stream key to clipboard
|
|
- [x] Stream status display
|
|
- [x] Viewer count display
|
|
- [x] Go live button
|
|
- [x] End stream button
|
|
|
|
**Components**:
|
|
```
|
|
components/dashboard/
|
|
├── Dashboard.tsx
|
|
├── StreamKeyDisplay.tsx
|
|
├── StreamStatus.tsx
|
|
├── GoLiveButton.tsx
|
|
└── StreamSettings.tsx
|
|
```
|
|
|
|
**Deliverables**:
|
|
- [x] Dashboard functional
|
|
- [x] Stream key shown securely
|
|
- [x] Go live/end stream buttons
|
|
|
|
---
|
|
|
|
#### User Story 1.2.2: HLS Player Implementation
|
|
```
|
|
AS A viewer
|
|
I WANT to watch live streams
|
|
SO THAT I can see creators' content
|
|
```
|
|
|
|
**Current Status**: ✅ DONE
|
|
|
|
**Components**:
|
|
```
|
|
components/
|
|
├── HLSPlayer.tsx (DONE)
|
|
├── VideoControls.tsx (DONE)
|
|
└── QualitySelector.tsx (DONE)
|
|
```
|
|
|
|
**Features Implemented**:
|
|
- [x] HLS.js integration
|
|
- [x] Adaptive bitrate switching
|
|
- [x] Auto-recovery on disconnection
|
|
- [x] Full-screen support
|
|
- [x] Mobile responsive
|
|
|
|
**Deliverables**:
|
|
- [x] Player component reusable
|
|
- [x] Error handling
|
|
- [x] Mobile responsive
|
|
|
|
---
|
|
|
|
#### User Story 1.2.3: Stream Ingestion Setup
|
|
```
|
|
AS PLATFORM OWNER
|
|
I WANT to receive RTMP streams
|
|
SO THAT creators can broadcast
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Set up Cloudflare Stream or Mux account
|
|
- [ ] Configure RTMP ingest endpoint
|
|
- [ ] Set up HLS playback endpoint
|
|
- [ ] Stream key validation
|
|
- [ ] Bitrate/quality management
|
|
- [ ] Automated stream archival
|
|
|
|
**Config**:
|
|
```
|
|
// config/streaming.ts
|
|
export const streamingConfig = {
|
|
provider: 'cloudflare-stream', // or 'mux'
|
|
rtmpIngest: 'rtmp://ingest.aethex.live/live',
|
|
hlsPlayback: 'https://video.aethex.live/{streamId}.m3u8',
|
|
recordingPath: 's3://aethex-archive/',
|
|
qualities: ['1080p', '720p', '480p'],
|
|
bitrates: [8000, 5000, 2500], // kbps
|
|
}
|
|
```
|
|
|
|
**API Routes**:
|
|
- `POST /api/stream/create` - Start streaming session
|
|
- `POST /api/stream/end` - End stream
|
|
- `GET /api/stream/{id}` - Get stream info
|
|
- `GET /api/stream/{id}/hls` - Get HLS URL
|
|
|
|
**Deliverables**:
|
|
- [ ] Cloudflare/Mux integrated
|
|
- [ ] RTMP ingest working
|
|
- [ ] HLS playback working
|
|
- [ ] Stream archival configured
|
|
|
|
---
|
|
|
|
#### User Story 1.2.4: Stream Lifecycle
|
|
```
|
|
AS A system
|
|
I WANT to manage stream state
|
|
SO THAT viewers and creators see accurate status
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Stream creation on go live
|
|
- [ ] Stream status updates
|
|
- [ ] View count tracking
|
|
- [ ] Peak viewer tracking
|
|
- [ ] Stream ending/cleanup
|
|
- [ ] Recording management
|
|
|
|
**Database Updates**:
|
|
- `streams.status` (OFFLINE → LIVE → ENDING → ARCHIVED)
|
|
- `streams.startTime`, `endTime`
|
|
- `streams.viewerCount`, `peakViewers`
|
|
- `streams.duration`
|
|
|
|
**API Routes**:
|
|
- `POST /api/streams/{channelId}/start` - Go live
|
|
- `PUT /api/streams/{id}/status` - Update status
|
|
- `POST /api/streams/{id}/end` - End stream
|
|
|
|
**Deliverables**:
|
|
- [ ] Stream state machine working
|
|
- [ ] Status updates real-time (via Socket.io)
|
|
- [ ] View counts accurate
|
|
|
|
---
|
|
|
|
### Sprint 1.3: Real-time Chat
|
|
**Duration**: Days 11-15 | **Team**: 1-2 devs | **Status**: 🔄 IN PROGRESS
|
|
|
|
#### User Story 1.3.1: Chat Backend Setup
|
|
```
|
|
AS A viewer
|
|
I WANT to send and receive chat messages
|
|
SO THAT I can interact in real-time
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Set up Socket.io server on Next.js
|
|
- [ ] Create chat rooms per stream
|
|
- [ ] User connection tracking
|
|
- [ ] Message broadcasting
|
|
- [ ] Message persistence to database
|
|
- [ ] Chat history loading
|
|
|
|
**Socket Events**:
|
|
```typescript
|
|
// Client → Server
|
|
socket.emit('chat:join', { streamId: string })
|
|
socket.emit('chat:send', { content: string })
|
|
socket.emit('chat:leave')
|
|
|
|
// Server → Client
|
|
socket.on('chat:message', (message: Message))
|
|
socket.on('chat:user-joined', (user: User))
|
|
socket.on('chat:user-left', (userId: string))
|
|
socket.on('chat:history', (messages: Message[]))
|
|
```
|
|
|
|
**API Routes**:
|
|
- `GET /api/streams/{id}/messages` - Get chat history
|
|
- `POST /api/streams/{id}/messages` - Send message
|
|
- `DELETE /api/messages/{id}` - Delete message (moderation)
|
|
|
|
**Deliverables**:
|
|
- [ ] Socket.io server running
|
|
- [ ] Chat messages persisted
|
|
- [ ] Real-time broadcasting
|
|
- [ ] History loading
|
|
|
|
---
|
|
|
|
#### User Story 1.3.2: Chat UI Component
|
|
```
|
|
AS A viewer
|
|
I WANT an intuitive chat interface
|
|
SO THAT I can easily participate
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Build chat message list
|
|
- [ ] Build message input
|
|
- [ ] Typing indicators
|
|
- [ ] User list (online viewers)
|
|
- [ ] Message timestamps
|
|
- [ ] Scroll to latest message
|
|
- [ ] Mobile responsive chat
|
|
|
|
**Components**:
|
|
```
|
|
components/chat/
|
|
├── ChatContainer.tsx
|
|
├── MessageList.tsx
|
|
├── MessageItem.tsx
|
|
├── ChatInput.tsx
|
|
├── UserList.tsx
|
|
└── TypingIndicator.tsx
|
|
```
|
|
|
|
**Features**:
|
|
- [ ] Auto-scroll to latest
|
|
- [ ] Emotes (Phase 5)
|
|
- [ ] Moderation badges
|
|
- [ ] Timestamp formatting
|
|
|
|
**Deliverables**:
|
|
- [ ] Chat UI fully functional
|
|
- [ ] Mobile responsive
|
|
- [ ] Accessible (ARIA labels)
|
|
|
|
---
|
|
|
|
#### User Story 1.3.3: Chat Moderation Foundation
|
|
```
|
|
AS A creator
|
|
I WANT to moderate chat
|
|
SO THAT I can enforce community standards
|
|
```
|
|
|
|
**Tasks**:
|
|
- [ ] Creator moderation dashboard
|
|
- [ ] Delete message functionality
|
|
- [ ] Basic profanity filter
|
|
- [ ] User block/ignore feature
|
|
- [ ] Message reporting UI
|
|
|
|
**API Routes**:
|
|
- `DELETE /api/messages/{id}` - Delete message
|
|
- `POST /api/users/{id}/block` - Block user
|
|
- `PUT /api/channels/{id}/filters` - Set content filters
|
|
- `POST /api/reports` - Report message/user
|
|
|
|
**Components**:
|
|
```
|
|
components/moderation/
|
|
├── ModerationPanel.tsx
|
|
├── MessageActions.tsx
|
|
├── BlockUserModal.tsx
|
|
└── FilterSettings.tsx
|
|
```
|
|
|
|
**Deliverables**:
|
|
- [ ] Message deletion working
|
|
- [ ] Block system working
|
|
- [ ] Moderation panel functional
|
|
|
|
---
|
|
|
|
### Integration: Stream Page
|
|
**Duration**: Days 16-20 | **Team**: 2 devs
|
|
|
|
Bring everything together into a complete live stream page.
|
|
|
|
#### User Story 1.3.4: Live Stream Viewer Page
|
|
```
|
|
AS A viewer
|
|
I WANT to watch a live stream with chat
|
|
SO THAT I can enjoy content and interact
|
|
```
|
|
|
|
**Route**: `/streams/{channelSlug}`
|
|
|
|
**Page Components**:
|
|
```
|
|
pages/streams/[channelSlug].tsx
|
|
├── HLSPlayer (full width)
|
|
├── ChatContainer
|
|
├── ViewerCount
|
|
├── StreamInfo (title, creator, description)
|
|
└── CreatorCard (follow button, social)
|
|
```
|
|
|
|
**Features**:
|
|
- [ ] Responsive layout (player + chat side-by-side on desktop)
|
|
- [ ] Chat mobile drawer (mobile)
|
|
- [ ] Real-time viewer count
|
|
- [ ] Stream information display
|
|
- [ ] Creator profile card with follow button
|
|
- [ ] Share buttons
|
|
- [ ] Quality selector
|
|
|
|
**Styling**:
|
|
- [ ] Use existing Tailwind setup
|
|
- [ ] Dark theme friendly
|
|
- [ ] Accessibility (keyboard nav, screen readers)
|
|
|
|
**Deliverables**:
|
|
- [ ] Full-featured stream page
|
|
- [ ] Mobile responsive
|
|
- [ ] Real-time updates
|
|
|
|
---
|
|
|
|
### Testing & Deployment
|
|
**Duration**: Days 21-28 | **Team**: 2-3 devs
|
|
|
|
#### Testing Coverage
|
|
- [ ] Unit tests for API routes (95% coverage)
|
|
- [ ] Integration tests for Socket.io
|
|
- [ ] E2E tests: Sign up → Create channel → Go live → View stream
|
|
- [ ] Load testing with 1000 concurrent viewers
|
|
- [ ] Chat stress test (1000 msg/sec)
|
|
|
|
#### Deployment Checklist
|
|
- [ ] Environment variables set on Railway
|
|
- [ ] Database migrations run
|
|
- [ ] Clerk configured for production
|
|
- [ ] Cloudflare/Mux configured
|
|
- [ ] R2 bucket created and policy set
|
|
- [ ] Socket.io CORS configured
|
|
- [ ] Vercel deployment working
|
|
- [ ] Custom domain DNS set
|
|
- [ ] SSL certificate configured
|
|
- [ ] Monitoring setup (Sentry, PostHog)
|
|
|
|
#### Production Monitoring
|
|
- [ ] Uptime monitoring (Uptime Robot)
|
|
- [ ] Error tracking (Sentry)
|
|
- [ ] Analytics (PostHog)
|
|
- [ ] Database performance (Railway dashboard)
|
|
- [ ] Stream quality (Cloudflare/Mux metrics)
|
|
|
|
---
|
|
|
|
## Database Schema - Complete Phase 1
|
|
|
|
See Prisma schema defined in Sprint 1.1 above. Key tables:
|
|
- `User` - User accounts
|
|
- `Profile` - User profiles
|
|
- `Channel` - Creator channels
|
|
- `Stream` - Live streams
|
|
- `Message` - Chat messages
|
|
- `Follow` - User-to-user follows (framework)
|
|
- `ChannelFollow` - Channel follows (framework)
|
|
- `Subscription` - Subscriptions (framework)
|
|
|
|
---
|
|
|
|
## API Routes - Phase 1
|
|
|
|
### Authentication
|
|
- `POST /api/auth/onboard` - Create user after signup
|
|
- `GET /api/auth/user` - Get current logged-in user
|
|
- `PUT /api/auth/profile` - Update profile
|
|
|
|
### User Management
|
|
- `GET /api/users/{id}` - Get user profile
|
|
- `PUT /api/users/{id}` - Update user
|
|
- `POST /api/users/{id}/block` - Block user
|
|
- `POST /api/upload/avatar` - Upload avatar
|
|
- `POST /api/upload/banner` - Upload banner
|
|
|
|
### Channels
|
|
- `POST /api/channels` - Create channel
|
|
- `GET /api/channels/{slug}` - Get channel info
|
|
- `PUT /api/channels/{id}` - Update channel
|
|
- `GET /api/channels/{id}/vod` - Get VODs
|
|
|
|
### Streaming
|
|
- `POST /api/streams` - Create stream session
|
|
- `GET /api/streams/{id}` - Get stream info
|
|
- `PUT /api/streams/{id}/status` - Update stream status
|
|
- `POST /api/streams/{id}/end` - End stream
|
|
- `GET /api/streams/{id}/messages` - Get chat history
|
|
|
|
### Chat
|
|
- `POST /api/messages` - Send message (via Socket.io preferred)
|
|
- `GET /api/streams/{id}/messages` - Get message history
|
|
- `DELETE /api/messages/{id}` - Delete message
|
|
|
|
See [API_STRUCTURE.md](API_STRUCTURE.md) for complete details.
|
|
|
|
---
|
|
|
|
## Components - Phase 1
|
|
|
|
### Layout Components
|
|
- `App/layout.tsx` - Root layout
|
|
- `components/Navigation.tsx` - Top nav
|
|
- `components/Sidebar.tsx` - Side navigation
|
|
|
|
### Auth Components
|
|
- `components/auth/SignUpForm.tsx`
|
|
- `components/auth/LoginForm.tsx`
|
|
- `components/auth/OnboardingForm.tsx`
|
|
|
|
### Dashboard Components
|
|
- `components/dashboard/Dashboard.tsx`
|
|
- `components/dashboard/StreamKeyDisplay.tsx`
|
|
- `components/dashboard/StreamStatus.tsx`
|
|
- `components/dashboard/ProfileEditor.tsx`
|
|
|
|
### Streaming Components
|
|
- `components/HLSPlayer.tsx` ✅
|
|
- `components/ViewerCount.tsx`
|
|
- `components/NowPlaying.tsx`
|
|
|
|
### Chat Components
|
|
- `components/chat/ChatContainer.tsx`
|
|
- `components/chat/MessageList.tsx`
|
|
- `components/chat/MessageItem.tsx`
|
|
- `components/chat/ChatInput.tsx`
|
|
- `components/chat/UserList.tsx`
|
|
|
|
### Page Components
|
|
- `app/page.tsx` - Home/landing
|
|
- `app/dashboard/page.tsx` - Creator dashboard
|
|
- `app/streams/[channelSlug]/page.tsx` - Stream viewer page
|
|
|
|
---
|
|
|
|
## Third-Party Integrations
|
|
|
|
### 1. Clerk (Authentication)
|
|
- **Status**: 🔄 IN PROGRESS
|
|
- **Setup**: Web dashboard at clerk.com
|
|
- **Config**: .env.local varaiables set
|
|
- **Integration**: Next.js middleware + components
|
|
|
|
### 2. Cloudflare Stream OR Mux (Video)
|
|
- **Status**: ⏳ NOT STARTED
|
|
- **Choose one**:
|
|
- Cloudflare Stream: $0.05/min cheaper, simpler
|
|
- Mux: Better UI, more features
|
|
- **Setup**: Account created, API key obtained
|
|
- **Integration**: API calls for stream creation, HLS URLs
|
|
- **Cost**: ~$200-500/month at scale
|
|
|
|
### 3. R2 (File Storage)
|
|
- **Status**: ⏳ NOT STARTED
|
|
- **Setup**: Cloudflare R2 bucket created
|
|
- **Access**: API tokens generated
|
|
- **Integration**: Avatar/banner uploads, VOD storage
|
|
- **Cost**: ~$20/month at scale
|
|
|
|
### 4. PostgreSQL (Database)
|
|
- **Status**: ⏳ NOT STARTED (or 🔄 IN PROGRESS)
|
|
- **Where**: Railway.app
|
|
- **Setup**: Database created, connection string obtained
|
|
- **Integration**: Prisma connection string in .env
|
|
- **Cost**: ~$10-20/month
|
|
|
|
### 5. Redis (Optional - for Phase 2+)
|
|
- **Status**: ⏳ NOT STARTED
|
|
- **Use**: Caching, rate limiting, sessions
|
|
- **Provider**: Upstash or Railway
|
|
- **Cost**: ~$5-10/month
|
|
|
|
---
|
|
|
|
## Success Metrics
|
|
|
|
### User Metrics
|
|
- [ ] 100+ creators signed up
|
|
- [ ] 500+ total users (including viewers)
|
|
- [ ] 10+ daily active creators
|
|
- [ ] 50+ daily active users
|
|
|
|
### Engagement Metrics
|
|
- [ ] 50+ concurrent peak viewers
|
|
- [ ] 100+ chat messages per stream
|
|
- [ ] Average 5+ minute watch time
|
|
- [ ] 20%+ creator return rate
|
|
|
|
### Technical Metrics
|
|
- [ ] 99.9% streaming uptime (0 minutes downtime)
|
|
- [ ] <2s stream connection latency
|
|
- [ ] <100ms chat message latency
|
|
- [ ] <500ms page load time
|
|
|
|
### Quality Metrics
|
|
- [ ] 0 critical bugs in production
|
|
- [ ] Zero unplanned downtime
|
|
- [ ] <5% error rate on API calls
|
|
- [ ] <2% failed chat messages
|
|
|
|
---
|
|
|
|
## Known Issues & Future Improvements
|
|
|
|
### Phase 1 Limitations
|
|
1. **Single server**: Not horizontally scalable yet
|
|
2. **No persistent chat**: Messages lost on server restart
|
|
3. **No clips/VOD**: Added in Phase 3
|
|
4. **No monetization**: Added in Phase 4
|
|
5. **Basic moderation**: Improved in Phase 5
|
|
|
|
### Improvements for Future Phases
|
|
- Phase 2: Discover, follow, recommendations
|
|
- Phase 3: VOD archival, clips editor
|
|
- Phase 4: Subscriptions, donations
|
|
- Phase 5: Advanced moderation, emotes
|
|
|
|
---
|
|
|
|
## Resources & Links
|
|
|
|
- **Clerk Docs**: https://clerk.com/docs
|
|
- **Prisma Docs**: https://www.prisma.io/docs
|
|
- **Cloudflare Stream**: https://developers.cloudflare.com/stream
|
|
- **Mux Docs**: https://docs.mux.com
|
|
- **Socket.io Docs**: https://socket.io/docs
|
|
- **HLS.js**: https://github.com/video-dev/hls.js
|
|
|
|
---
|
|
|
|
## Completion Checklist
|
|
|
|
### Sprint 1.1 ✅
|
|
- [ ] Database schema created
|
|
- [ ] Migrations working
|
|
- [ ] Clerk authentication integrated
|
|
- [ ] User profiles created
|
|
- [ ] Profile editing working
|
|
|
|
### Sprint 1.2 ✅
|
|
- [ ] Dashboard built
|
|
- [ ] Stream key management
|
|
- [ ] HLS player integrated
|
|
- [ ] Go live / end stream working
|
|
- [ ] Viewer count updating
|
|
|
|
### Sprint 1.3 🔄
|
|
- [ ] Socket.io server running
|
|
- [ ] Chat messages persisting
|
|
- [ ] Chat UI built
|
|
- [ ] Real-time messaging working
|
|
- [ ] Moderation basics working
|
|
|
|
### Integration
|
|
- [ ] Full stream page working
|
|
- [ ] Mobile responsive
|
|
- [ ] All systems integrated
|
|
|
|
### Testing & Deployment
|
|
- [ ] Tests passing
|
|
- [ ] Deployed to production
|
|
- [ ] Monitoring configured
|
|
- [ ] Team trained
|
|
|
|
---
|
|
|
|
**Phase 1 Estimated Completion**: Week 4 (by February 28, 2025)
|
|
**Next Phase**: Phase 2 - Social & Discovery (March 1, 2025)
|
|
|
|
See [PHASE_2_SOCIAL_DISCOVERY.md](PHASE_2_SOCIAL_DISCOVERY.md) for Phase 2 details.
|