VOD Uploads
Uploading and organizing video-on-demand content
VOD is the main workflow: upload a source file, transcode to adaptive streams, then play, share, or embed.
Upload via admin panel
- Go to Videos in the admin panel
- Select a collection (folder) from the sidebar
- Drag and drop or browse for a video file
Uploads run in the background. Status goes from pending to processing to completed (or failed). It's queue-based, not instant.
Because NixStream is self-hosted, upload capacity depends on your server (disk, PHP, and Nginx), not a product-imposed format or size limit. If uploads fail at the network layer, raise client_max_body_size in Nginx and upload_max_filesize / post_max_size in PHP.
Encoding profile
New uploads use the default encoding profile unless you select another in the upload dialog. Profiles control resolution ladder, bitrates, and encryption. See Encoding Profiles.
Collections
Videos are organized in a tree of collections. The root collection path is root. Sub-folders use paths like root/marketing/2026 (nested under root/marketing).
Collections can have their own metadata fields and security profiles. Create folders from the collection sidebar in the admin panel.
Upload statuses
| Status | Meaning |
|---|---|
pending | Queued, waiting for a worker |
processing | FFmpeg transcoding and packaging |
completed | Ready for playback and sharing |
failed | Error during encode (check queue logs) |
Monitor progress from the video detail page. Failed jobs log errors to storage/logs/laravel.log and queue stdout.
Via Client API
curl -X POST "https://your-domain.com/api/client/v1/uploads" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "video=@/path/to/video.mp4" \
-F "folder=root/marketing"Returns 202 Accepted with a video ID and processing status.
Poll upload status:
curl "https://your-domain.com/api/client/v1/uploads/{videoId}" \
-H "Authorization: Bearer YOUR_API_KEY"See Uploads API for full request and response schemas.
Metadata
Custom metadata fields live in Settings > Metadata. Supported types: input, textarea, select, multiselect, number, rating, date, and image.
Attach metadata during upload or edit later from the video detail page. Metadata is searchable in the library and exposed via the Client API.
Thumbnails and posters
Encoding generates thumbnail sprites and poster images. Pick the poster from the video detail page after processing completes.
Transcription
If Whisper transcription is enabled, subtitles generate after encoding or on manual trigger. See Transcription.
After upload
Once encoding completes, the video is available for:
- Playback in the admin panel and public player
- Share links and embeds (Sharing & Embeds)
- Client API listing (
GET /api/client/v1/videos) - Transcription (Whisper) if enabled
Troubleshooting uploads
Upload hangs at 100%: check Nginx body size limits and PHP max_execution_time.
Stuck on processing: confirm queue workers are running:
docker compose exec queue supervisorctl status
docker compose logs queueWrong folder: API uploads need the full collection path (e.g. root/marketing, not just marketing).
Encode pipeline details: Encoding & Transcoding. Where files land: Storage. Panel walkthrough: Admin Panel.