Self-hosted video streaming server with a Netflix-like interface. Stream your personal video library to your Apple TV, web browser, or any device on your local network.
- Auto-discovery of video files organized by category and genre
- Native tvOS application with cinematic UI
- Web interface optimized for TV displays (1920x1080)
- HTTP range requests for efficient video streaming
- Automatic thumbnail extraction via ffmpeg
- Custom thumbnail support (PNG, JPG, WebP)
- Multi-format support: MP4, MKV, MOV, AVI, WebM, M4V
FreeFlix/
├── server/ # Node.js Express backend
├── Front/ # Vue.js web frontend (TV-optimized)
├── FreeFlixTVOS/ # Native tvOS SwiftUI application
└── Videos/ # Media library root
└── Categories/
├── Films/
│ ├── Action/
│ ├── Comedy/
│ └── ...
└── Series/
├── Drama/
└── ...
- Node.js 18+
- ffmpeg (for thumbnail generation)
- Xcode 15+
- tvOS 17+
- Apple TV 4K
npm install
cd Front && npm install && cd ..Organize your media files in the Videos/Categories/ directory:
Videos/Categories/
├── Films/
│ ├── Action/
│ │ ├── Movie.mp4
│ │ └── Movie.jpg # Optional custom thumbnail
│ └── Comedy/
│ └── Another.mkv
└── Series/
└── SciFi/
├── Show.S01E01.mp4
└── Show.S01E01.png # Optional custom thumbnail
npm startServer runs at http://localhost:3001
Open http://<your-server-ip>:3001 in a browser or configure the tvOS app.
| Endpoint | Description |
|---|---|
GET /api/categories |
Library organized by category > genre > videos |
GET /api/library |
Full directory tree structure |
GET /api/thumbnail/:path |
Video thumbnail (auto-generated or custom) |
GET /api/stream/:path |
Video stream with range support |
| Variable | Default | Description |
|---|---|---|
PORT |
3001 | Server port |
The tvOS app connects to the server via the Settings screen. Default server address: 192.168.1.159:3001
Configure in APIService.swift or through the app's settings.
cd Front
npm install
npm run dev # Development server at http://localhost:5173
npm run build # Production build to Front/dist/- Open
FreeFlixTVOS/FreeFlix/FreeFlix.xcodeprojin Xcode - Select your Apple TV as the target device
- Build and run (Cmd+R)
Dependencies (resolved via Swift Package Manager):
Place an image file with the same name as the video in the same directory:
Videos/Categories/Films/Action/
├── Movie.mp4
└── Movie.jpg # or .png, .jpeg, .webp
If no custom thumbnail exists, the server extracts a frame from the video at 5 seconds using ffmpeg.
For Apple TV access, ensure:
- Server and Apple TV are on the same network
- Port 3001 is accessible (firewall rules)
- tvOS app is configured with the correct server IP
npm run server # Start backend only
npm run dev # Start frontend dev server
npm run build # Build frontend for productionMIT
