22 KiB
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:
- Sign up and create a channel
- Get an RTMP ingest URL for streaming
- Go live and manage their stream
- 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:
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 signupGET /api/auth/user- Get current userPUT /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 profilePOST /api/upload/avatar- Upload avatarPOST /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:
- Build dashboard layout (
/dashboard) - Display stream key securely
- Show/hide stream key functionality
- Copy stream key to clipboard
- Stream status display
- Viewer count display
- Go live button
- End stream button
Components:
components/dashboard/
├── Dashboard.tsx
├── StreamKeyDisplay.tsx
├── StreamStatus.tsx
├── GoLiveButton.tsx
└── StreamSettings.tsx
Deliverables:
- Dashboard functional
- Stream key shown securely
- 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:
- HLS.js integration
- Adaptive bitrate switching
- Auto-recovery on disconnection
- Full-screen support
- Mobile responsive
Deliverables:
- Player component reusable
- Error handling
- 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 sessionPOST /api/stream/end- End streamGET /api/stream/{id}- Get stream infoGET /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,endTimestreams.viewerCount,peakViewersstreams.duration
API Routes:
POST /api/streams/{channelId}/start- Go livePUT /api/streams/{id}/status- Update statusPOST /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:
// 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 historyPOST /api/streams/{id}/messages- Send messageDELETE /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 messagePOST /api/users/{id}/block- Block userPUT /api/channels/{id}/filters- Set content filtersPOST /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 accountsProfile- User profilesChannel- Creator channelsStream- Live streamsMessage- Chat messagesFollow- User-to-user follows (framework)ChannelFollow- Channel follows (framework)Subscription- Subscriptions (framework)
API Routes - Phase 1
Authentication
POST /api/auth/onboard- Create user after signupGET /api/auth/user- Get current logged-in userPUT /api/auth/profile- Update profile
User Management
GET /api/users/{id}- Get user profilePUT /api/users/{id}- Update userPOST /api/users/{id}/block- Block userPOST /api/upload/avatar- Upload avatarPOST /api/upload/banner- Upload banner
Channels
POST /api/channels- Create channelGET /api/channels/{slug}- Get channel infoPUT /api/channels/{id}- Update channelGET /api/channels/{id}/vod- Get VODs
Streaming
POST /api/streams- Create stream sessionGET /api/streams/{id}- Get stream infoPUT /api/streams/{id}/status- Update stream statusPOST /api/streams/{id}/end- End streamGET /api/streams/{id}/messages- Get chat history
Chat
POST /api/messages- Send message (via Socket.io preferred)GET /api/streams/{id}/messages- Get message historyDELETE /api/messages/{id}- Delete message
See API_STRUCTURE.md for complete details.
Components - Phase 1
Layout Components
App/layout.tsx- Root layoutcomponents/Navigation.tsx- Top navcomponents/Sidebar.tsx- Side navigation
Auth Components
components/auth/SignUpForm.tsxcomponents/auth/LoginForm.tsxcomponents/auth/OnboardingForm.tsx
Dashboard Components
components/dashboard/Dashboard.tsxcomponents/dashboard/StreamKeyDisplay.tsxcomponents/dashboard/StreamStatus.tsxcomponents/dashboard/ProfileEditor.tsx
Streaming Components
components/HLSPlayer.tsx✅components/ViewerCount.tsxcomponents/NowPlaying.tsx
Chat Components
components/chat/ChatContainer.tsxcomponents/chat/MessageList.tsxcomponents/chat/MessageItem.tsxcomponents/chat/ChatInput.tsxcomponents/chat/UserList.tsx
Page Components
app/page.tsx- Home/landingapp/dashboard/page.tsx- Creator dashboardapp/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
- Single server: Not horizontally scalable yet
- No persistent chat: Messages lost on server restart
- No clips/VOD: Added in Phase 3
- No monetization: Added in Phase 4
- 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 for Phase 2 details.