Streamify is a production-ready video streaming platform similar to YouTube, featuring video uploads, user authentication, playlists, subscriptions, and more. Built with modern technologies and best practices.
Features Β· Demo Β· Installation Β· Documentation Β· Contributing
- Features
- Demo
- Tech Stack
- Architecture
- Installation
- Configuration
- API Reference
- Database Schema
- Project Structure
- Development
- Deployment
- Roadmap
- Troubleshooting
- Contributing
- License
| Feature | Description |
|---|---|
| Video Upload | Upload videos up to 2GB with drag-and-drop support |
| Auto Compression | Server-side video compression using FFmpeg |
| Custom Player | Built-in video player with playback controls |
| Thumbnails | Auto-generated or custom thumbnail upload |
| Publish Control | Publish/unpublish videos with one click |
| Video Editing | Update title, description, tags, and thumbnail |
| Feature | Description |
|---|---|
| Email Verification | Secure email verification on registration |
| Password Reset | Email-based password recovery |
| Profile Management | Custom avatars and cover images |
| Channel System | Each user has their own channel |
| JWT Authentication | Secure token-based authentication |
| Session Management | Auto token refresh, graceful logout |
| Feature | Description |
|---|---|
| Subscriptions | Subscribe to channels you love |
| Like/Dislike | React to videos |
| Comments | Comment on videos with replies |
| Watch History | Track your viewing history |
| Watch Later | Save videos to watch later |
| Playlists | Create and manage playlists |
| Feature | Description |
|---|---|
| Rate Limiting | Protection against brute force attacks |
| Helmet | HTTP security headers |
| CORS | Configurable cross-origin settings |
| Input Validation | Express-validator for all inputs |
| Lazy Loading | React.lazy for code splitting |
| GZIP Compression | Reduced response sizes |
| Home Page | Video Player | User Profile |
![]() |
![]() |
![]() |
Live Link: https://streamify-demo.vercel.app (Coming Soon)
MongoDB Connection Error
- Ensure your IP is whitelisted in MongoDB Atlas or allow all IPs (
0.0.0.0/0). - Check if
MONGODB_URLin.envis correct and includes username/password. - If password has special characters, URL encode them.
Cloudinary Upload Failed
- Verify
CLOUD_NAME,API_KEY, andAPI_SECRETinbackend/.env. - Ensure your internet connection is stable.
- Check file size limits in
constants.js(default 2GB for video).
Email Not Sending
- Ensure you are using an App Password for Gmail, not your login password.
- Check if
SMTP_HOSTandSMTP_PORTare correct. - Verify
EMAIL_FROMis a valid email address.
CORS Error
- Ensure
CORS_ORIGINinbackend/.envmatches your frontend URL (e.g.,http://localhost:5173). - If testing from a different device, ensure backend is accessible via network IP.
| Technology | Version | Purpose |
|---|---|---|
| React | 18.3 | UI library with hooks |
| Vite | 6.0 | Build tool & dev server |
| TailwindCSS | 3.4 | Utility-first CSS |
| Framer Motion | 12.6 | Animations |
| React Router | 7.1 | Client-side routing |
| Axios | 1.9 | HTTP client |
| React Hot Toast | 2.5 | Toast notifications |
| Heroicons | 2.2 | Icon library |
| Technology | Version | Purpose |
|---|---|---|
| Node.js | 18+ | JavaScript runtime |
| Express | 4.21 | Web framework |
| MongoDB | 7.0 | NoSQL database |
| Mongoose | 8.9 | MongoDB ODM |
| Cloudinary | 2.5 | Media storage & CDN |
| Nodemailer | 6.9 | Email service |
| FFmpeg | - | Video processing |
| JWT | 9.0 | Authentication |
| Tool | Purpose |
|---|---|
| ESLint | Code linting |
| Prettier | Code formatting |
| Nodemon | Dev auto-reload |
| Handlebars | Email templates |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π₯οΈ CLIENT LAYER β
β ββββββββββββββββ ββββββββββββββββ β
β β Web Browser β βMobile Browserβ β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
βββββββββββββββββββββββββββββββΌβββββββββββββββββΌβββββββββββββββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βοΈ FRONTEND (React + Vite) β
β βββββββββββ βββββββββββββββ ββββββββββββββ βββββββββ ββββββββββββββββ β
β β App.jsx ββ βReact Router ββ β Context ββ β Hooks ββ β API Services β β
β βββββββββββ βββββββββββββββ ββββββββββββββ βββββββββ ββββββββ¬ββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββ
β HTTP
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π BACKEND (Node.js + Express) β
β βββββββββββ ββββββββββ ββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Express ββ β Routes ββ β Middleware ββ β Controllers ββ β Models β β
β βββββββββββ ββββββββββ ββββββββββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββΌβββββββββββ
β β
ββββββββββββββββββββββΌββββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βοΈ EXTERNAL SERVICES β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β MongoDB β β Cloudinary β β Email Server β β
β β Atlas β β CDN β β (SMTP) β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββ ββββββββββββ ββββββββββββββ ββββββββββββ
β Client β β API β β Middleware β βControllerβ
ββββββ¬ββββββ ββββββ¬ββββββ βββββββ¬βββββββ ββββββ¬ββββββ
β β β β
β HTTP Request β β β
βββββββββββββββββββββ>β β β
β β β β
β β Rate Limit Check β β
β ββββββββββββββββββββββ>β β
β β β β
β β β Auth Validation β
β β βββββββββββββββββββββββ>
β β β β
β β β β ββββββββββββ
β β β ββ>β Database β
β β β β ββββββ¬ββββββ
β β β β β
β β β β<βββββββ
β β β β
β β β<ββββββββββββββββββββββ
β β<ββββββββββββββββββββββ β
β<βββββββββββββββββββββ β β
β JSON Response β β β
β β β β
βββββββββββββββββββ
β Unauthenticated β
ββββββββββ¬βββββββββ
β
ββββββββββββββββββββββββββΌβββββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββ ββββββββββββββββ ββββββββββββββββββ
β Register β β Login β βForgot Password β
βββββββββ¬ββββββββ ββββββββ¬ββββββββ βββββββββ¬βββββββββ
β β β
βΌ β βΌ
βββββββββββββββββ β ββββββββββββββββββ
β Email Sent β β β Reset Email β
βββββββββ¬ββββββββ β βββββββββ¬βββββββββ
β β β
βΌ β βΌ
βββββββββββββββββ β ββββββββββββββββββ
β Verified β β β Password Reset β
βββββββββ¬ββββββββ β βββββββββ¬βββββββββ
β β β
βββββββββββββ¬ββββββββββββ β
β β
βΌ β
βββββββββββββββββββββββββ β
β Authenticated β<ββββββββββββββββββββββββ
βββββββββββββ¬ββββββββββββ
β
βββββββββββββΌββββββββββββ
β β β
βΌ β βΌ
ββββββββββββββββββββ β βββββββββββββββββ
β Token Refresh β β β Logout β
ββββββββββ¬ββββββββββ β βββββββββ¬ββββββββ
β β β
βββββββββββββββ β
βΌ
βββββββββββββββββββ
β Unauthenticated β
βββββββββββββββββββ
Before you begin, ensure you have the following installed:
| Requirement | Version | Check Command |
|---|---|---|
| Node.js | 18+ | node --version |
| npm | 9+ | npm --version |
| MongoDB | 6+ | mongod --version |
| FFmpeg | 4+ | ffmpeg -version |
| Git | 2+ | git --version |
git clone https://github.com/Anurag-Basuri/streamify.git
cd streamify# Install backend dependencies
cd backend
npm install
# Install frontend dependencies
cd ../frontend
npm installCreate environment files in both directories (see Configuration section).
Terminal 1 - Backend:
cd backend
npm run devTerminal 2 - Frontend:
cd frontend
npm run dev| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend API | http://localhost:8000 |
| Health Check | http://localhost:8000/health |
| API Status | http://localhost:8000/status |
Create backend/.env:
# βββββββββββββββββββββββββββββββββββββββββββ
# SERVER CONFIGURATION
# βββββββββββββββββββββββββββββββββββββββββββ
PORT=8000
NODE_ENV=development
# βββββββββββββββββββββββββββββββββββββββββββ
# DATABASE
# βββββββββββββββββββββββββββββββββββββββββββ
MONGODB_URL=mongodb+srv://username:password@cluster.mongodb.net
DB_NAME=streamify
# βββββββββββββββββββββββββββββββββββββββββββ
# AUTHENTICATION
# βββββββββββββββββββββββββββββββββββββββββββ
ACCESS_TOKEN_SECRET=your_super_secret_access_key_min_32_chars
REFRESH_TOKEN_SECRET=your_super_secret_refresh_key_min_32_chars
ACCESS_TOKEN_EXPIRY=15m
REFRESH_TOKEN_EXPIRY=7d
SESSION_SECRET=your_session_secret
# βββββββββββββββββββββββββββββββββββββββββββ
# CLOUDINARY (Media Storage)
# βββββββββββββββββββββββββββββββββββββββββββ
CLOUD_NAME=your_cloudinary_cloud_name
API_KEY=your_cloudinary_api_key
API_SECRET=your_cloudinary_api_secret
# βββββββββββββββββββββββββββββββββββββββββββ
# EMAIL CONFIGURATION (Optional)
# βββββββββββββββββββββββββββββββββββββββββββ
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your_email@gmail.com
SMTP_PASS=your_app_password
EMAIL_FROM="Streamify <noreply@streamify.com>"
# βββββββββββββββββββββββββββββββββββββββββββ
# CORS & FRONTEND
# βββββββββββββββββββββββββββββββββββββββββββ
CORS_ORIGIN=http://localhost:5173
FRONTEND_URL=http://localhost:5173Create frontend/.env:
VITE_API_URL=http://localhost:8000π§ Gmail App Password (for Email)
- Go to Google Account Security
- Enable 2-Step Verification
- Go to App passwords
- Generate a new app password for "Mail"
- Use this password as
SMTP_PASS
βοΈ Cloudinary Credentials
- Sign up at Cloudinary
- Go to Dashboard
- Copy Cloud Name, API Key, and API Secret
- Use these in your
.envfile
π MongoDB Atlas
- Sign up at MongoDB Atlas
- Create a new cluster
- Create a database user
- Get connection string from "Connect" button
- Replace
<password>with your database user password
http://localhost:8000/api/v1
POST /users/register - Register new user
Request Body (multipart/form-data):
{
"userName": "johndoe",
"fullName": "John Doe",
"email": "john@example.com",
"password": "securepassword123",
"avatar": "[file]"
}Success Response (201):
{
"statusCode": 201,
"data": {
"_id": "...",
"userName": "johndoe",
"email": "john@example.com",
"isEmailVerified": false
},
"message": "Registration successful! Please check your email.",
"success": true
}POST /users/login - User login
Request Body:
{
"email": "john@example.com",
"password": "securepassword123"
}Success Response (200):
{
"statusCode": 200,
"data": {
"user": { ... },
"accessToken": "eyJhbG...",
"refreshToken": "eyJhbG..."
},
"message": "User logged in successfully",
"success": true
}GET /users/verify-email/:token - Verify email
Success Response (200):
{
"statusCode": 200,
"data": { "isEmailVerified": true },
"message": "Email verified successfully",
"success": true
}POST /users/forgot-password - Request password reset
Request Body:
{
"email": "john@example.com"
}Response (200):
{
"statusCode": 200,
"data": null,
"message": "If an account exists, a password reset email has been sent",
"success": true
}GET /videos - Get all videos
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | number | 1 | Page number |
| limit | number | 10 | Items per page |
| sort | string | -createdAt | Sort field |
Success Response (200):
{
"statusCode": 200,
"data": {
"videos": [...],
"totalDocs": 100,
"page": 1,
"limit": 10,
"hasNextPage": true,
"hasPrevPage": false
},
"success": true
}POST /videos/upload - Upload video
Headers:
Authorization: Bearer <accessToken>
Content-Type: multipart/form-data
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| videoFile | file | Yes | Video file (mp4, webm) |
| thumbnail | file | Yes | Thumbnail image |
| title | string | Yes | Video title |
| description | string | Yes | Video description |
| tags | string | Yes | JSON array of tags |
| Category | Method | Endpoint | Auth | Description |
|---|---|---|---|---|
| Auth | POST | /users/register | β | Register user |
| POST | /users/login | β | Login | |
| POST | /users/logout | β | Logout | |
| POST | /users/refresh-token | β | Refresh tokens | |
| GET | /users/verify-email/:token | β | Verify email | |
| POST | /users/forgot-password | β | Request reset | |
| POST | /users/reset-password/:token | β | Reset password | |
| User | GET | /users/current-user | β | Get profile |
| PATCH | /users/change-password | β | Change password | |
| PATCH | /users/change-avatar | β | Update avatar | |
| PATCH | /users/update-details | β | Update profile | |
| GET | /users/c/:username | β | Get channel | |
| Videos | GET | /videos | β | List videos |
| GET | /videos/:id | β | Get video | |
| POST | /videos/upload | β | Upload video | |
| PATCH | /videos/update/:id | β | Update video | |
| DELETE | /videos/:id | β | Delete video | |
| PATCH | /videos/:id/publish | β | Toggle publish | |
| POST | /videos/:id/views | β | Increment views | |
| Playlists | GET | /playlists | β | Get playlists |
| POST | /playlists | β | Create playlist | |
| PATCH | /playlists/:id | β | Update playlist | |
| DELETE | /playlists/:id | β | Delete playlist | |
| Comments | GET | /comments/:videoId | β | Get comments |
| POST | /comments/:videoId | β | Add comment | |
| DELETE | /comments/:id | β | Delete comment | |
| Likes | POST | /likes/video/:id | β | Like video |
| POST | /likes/comment/:id | β | Like comment | |
| Subscriptions | POST | /subscriptions/:channelId | β | Toggle subscribe |
| GET | /subscriptions | β | Get subscriptions | |
| History | GET | /history | β | Get history |
| DELETE | /history | β | Clear history | |
| Watch Later | GET | /watchlater | β | Get watch later |
| POST | /watchlater/:videoId | β | Add to watch later |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATABASE RELATIONSHIPS β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββ ββββββββββββ ββββββββββββ
β USER βββββββββ<β VIDEO β>βββββββββ PLAYLIST β
ββββββ¬ββββββ ββββββ¬ββββββ ββββββββββββ
β β
β βββββββββββββββββΌββββββββββββββββ
β β β β
βΌ βΌ βΌ βΌ
ββββββββββββ ββββββββββββ ββββββββββββ
β LIKE β β COMMENT β β HISTORY β
ββββββββββββ ββββββββββββ ββββββββββββ
β
βΌ
ββββββββββββββββ ββββββββββββββββ
β SUBSCRIPTION β β WATCH LATER β
ββββββββββββββββ ββββββββββββββββ
Legend:
ββββββ< One-to-Many >ββββββ Many-to-One
βββββββ Optional βββββββ Required
π€ User Collection
| Field | Type | Description |
|---|---|---|
_id |
ObjectId | Primary key |
userName |
String | Unique username |
email |
String | Unique email |
fullName |
String | Display name |
password |
String | Hashed password |
avatar |
String | Profile image URL |
coverImage |
String | Banner image URL |
isEmailVerified |
Boolean | Email verification status |
emailVerificationToken |
String | Token for email verification |
emailVerificationExpires |
Date | Token expiry |
passwordResetToken |
String | Password reset token |
passwordResetExpires |
Date | Reset token expiry |
refreshToken |
String | JWT refresh token |
createdAt |
Date | Account creation date |
updatedAt |
Date | Last update date |
π₯ Video Collection
| Field | Type | Description |
|---|---|---|
_id |
ObjectId | Primary key |
title |
String | Video title |
description |
String | Video description |
videoUrl |
String | Cloudinary video URL |
thumbnailUrl |
String | Thumbnail URL |
videoPublicId |
String | Cloudinary public ID |
thumbnailPublicId |
String | Thumbnail public ID |
duration |
Number | Video length in seconds |
views |
Number | View count |
isPublished |
Boolean | Publish status |
isDeleted |
Boolean | Soft delete flag |
owner |
ObjectId | Reference to User |
tags |
String[] | Video tags |
π Playlist Collection
| Field | Type | Description |
|---|---|---|
_id |
ObjectId | Primary key |
name |
String | Playlist name |
description |
String | Playlist description |
owner |
ObjectId | Reference to User |
videos |
ObjectId[] | Array of Video references |
π¬ Comment Collection
| Field | Type | Description |
|---|---|---|
_id |
ObjectId | Primary key |
content |
String | Comment text |
video |
ObjectId | Reference to Video |
owner |
ObjectId | Reference to User |
β€οΈ Like Collection
| Field | Type | Description |
|---|---|---|
_id |
ObjectId | Primary key |
video |
ObjectId | Reference to Video (optional) |
comment |
ObjectId | Reference to Comment (optional) |
likedBy |
ObjectId | Reference to User |
π Subscription Collection
| Field | Type | Description |
|---|---|---|
_id |
ObjectId | Primary key |
subscriber |
ObjectId | User who subscribed |
channel |
ObjectId | Channel being subscribed to |
streamify/
β
βββ π frontend/ # React Frontend Application
β βββ π public/ # Static assets
β βββ π src/
β β βββ π components/ # Reusable UI components
β β β βββ π Video/ # Video player, cards, list
β β β βββ π Playlist/ # Playlist components
β β β βββ π Upload/ # File upload components
β β β βββ π Profile/ # Profile components
β β β βββ π Form/ # Form components
β β β βββ π Header.jsx # Navigation header
β β β βββ π Sidebar.jsx # Side navigation
β β β βββ π Modal.jsx # Modal component
β β β
β β βββ π pages/ # Route page components
β β β βββ π Display/ # Home, Tweet, Subscription
β β β βββ π Account/ # History, Playlist, Videos
β β β βββ π You/ # Profile, Auth, Create
β β β
β β βββ π context/ # React Context providers
β β β βββ π AuthContext.jsx # Authentication state
β β β βββ π ThemeContext.jsx # Theme management
β β β
β β βββ π services/ # API client & services
β β β βββ π api.js # Axios instance & config
β β β βββ π authService.js # Auth API calls
β β β βββ π videoService.js # Video API calls
β β β
β β βββ π hooks/ # Custom React hooks
β β β βββ π useAuth.js # Auth hook
β β β βββ π useDebounce.js # Debounce hook
β β β βββ π useLocalStorage.js # LocalStorage hook
β β β βββ π useVideos.js # Videos hook
β β β
β β βββ π routes/ # Route definitions
β β β βββ π AppRoutes.jsx # All routes (lazy loaded)
β β β βββ π ProtectedRoute.jsx # Auth guard
β β β
β β βββ π constants/ # App constants
β β β βββ π index.js # Centralized constants
β β β
β β βββ π App.jsx # Root component
β β βββ π main.jsx # Entry point
β β βββ π index.css # Global styles
β β
β βββ π package.json
β βββ π vite.config.js
β βββ π tailwind.config.js
β
βββ π backend/ # Node.js Backend Application
β βββ π src/
β β βββ π controllers/ # Request handlers
β β β βββ π user.controller.js # User operations
β β β βββ π video.controller.js # Video CRUD
β β β βββ π email.controller.js # Email verification
β β β βββ π playlist.controller.js # Playlist operations
β β β βββ π comment.controller.js # Comment operations
β β β βββ π like.controller.js # Like operations
β β β βββ π subscription.controller.js
β β β
β β βββ π routes/ # Express routes
β β β βββ π user.routes.js # /api/v1/users
β β β βββ π video.routes.js # /api/v1/videos
β β β βββ π ... # Other routes
β β β
β β βββ π models/ # Mongoose schemas
β β β βββ π user.model.js
β β β βββ π video.model.js
β β β βββ π ...
β β β
β β βββ π middlewares/ # Express middleware
β β β βββ π auth.middleware.js # JWT verification
β β β βββ π multer.middleware.js # File upload
β β β βββ π validate.middleware.js # Input validation
β β β
β β βββ π utils/ # Utility functions
β β β βββ π cloudinary.js # Cloudinary helpers
β β β βββ π email.js # Email service
β β β βββ π APIerror.js # Error class
β β β βββ π APIresponse.js # Response class
β β β
β β βββ π templates/ # Email templates
β β β βββ π verify-email.hbs
β β β βββ π welcome.hbs
β β β βββ π password-reset.hbs
β β β βββ π password-changed.hbs
β β β
β β βββ π database/ # Database connection
β β β βββ π index.js # MongoDB connection
β β β
β β βββ π app.js # Express app setup
β β βββ π index.js # Server entry point
β β βββ π constants.js # Backend constants
β β
β βββ π package.json
β βββ π .env.example
β
βββ π README.md
βββ π LICENSE
Backend:
npm run dev # Start with nodemon (hot reload)
npm run start # Production startFrontend:
npm run dev # Start Vite dev server
npm run build # Production build
npm run preview # Preview production build
npm run lint # Run ESLint- ESLint for JavaScript linting
- Prettier for code formatting
- Conventional Commits for commit messages
Use the following tools to test API:
- Postman
- Insomnia
- Thunder Client (VS Code extension)
- Connect your GitHub repository
- Set build command:
npm run build - Set output directory:
dist - Add environment variables
- Connect your GitHub repository
- Set root directory:
backend - Set start command:
npm start - Add all environment variables
docker-compose up -d| Category | Feature | Priority | Status |
|---|---|---|---|
| π¨ UI/UX | Dark/Light theme toggle | π΄ High | π‘ In Progress |
| Mobile-responsive video player | π΄ High | π Planned | |
| Skeleton loading states | π Medium | π Planned | |
| Improved error messages & feedback | π Medium | π Planned | |
| π§ Backend | Redis caching for videos | π΄ High | π Planned |
| Video quality selection (360p, 720p, 1080p) | π΄ High | π Planned | |
| Improved video compression pipeline | π Medium | π Planned | |
| API documentation with Swagger | π Medium | π Planned | |
| π Security | Two-factor authentication (2FA) | π Medium | π Planned |
| OAuth providers (GitHub, Discord) | π’ Low | π Planned | |
| Account activity logging | π’ Low | π Planned | |
| β¨ Features | Video chapters/timestamps | π Medium | π Planned |
| Nested comment replies | π Medium | π Planned | |
| Share video to social media | π’ Low | π Planned |
| Category | Feature | Description |
|---|---|---|
| πΊ Streaming | Live Streaming | Real-time video broadcasting with WebRTC/HLS |
| Adaptive Bitrate Streaming | Auto-adjust quality based on network conditions | |
| Live Chat | Real-time chat during live streams with WebSocket | |
| π° Monetization | Creator Payments | Stripe integration for channel memberships |
| Super Chat / Tips | Allow viewers to tip creators during streams | |
| Premium Subscriptions | Ad-free experience for paying users | |
| π€ AI Features | Auto-generated Captions | Speech-to-text for video subtitles |
| Content Moderation | AI-powered comment and video moderation | |
| Video Recommendations | ML-based personalized video suggestions | |
| π± Platform | Mobile Apps | React Native apps for iOS and Android |
| Desktop App | Electron app for Windows/Mac/Linux | |
| TV Apps | Smart TV applications (Android TV, Roku) | |
| π§ Infrastructure | Microservices Architecture | Split into video, user, notification services |
| Kubernetes Deployment | Container orchestration for scalability | |
| Global CDN | Multi-region video delivery network | |
| π Analytics | Creator Dashboard | Detailed analytics for video performance |
| Viewer Insights | Watch time, retention, demographics | |
| Revenue Reports | Earnings breakdown and payout history |
Have an idea? Open an issue with the enhancement label!
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'feat: add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
| Prefix | Description |
|---|---|
feat: |
New feature |
fix: |
Bug fix |
docs: |
Documentation |
style: |
Formatting |
refactor: |
Code restructuring |
test: |
Tests |
chore: |
Maintenance |
This project is licensed under the MIT License - see the LICENSE file for details.
Anurag Basuri


