This guide covers everything you need to know to set up and use StreamVault effectively.
- Installation
- Initial Setup
- Adding Streamers
- Recording Configuration
- Notification Setup
- Video Management
- Media Server Integration
- Troubleshooting
- Docker and Docker Compose installed
- A server with at least 2GB RAM and 50GB+ storage
- Public HTTPS domain for Twitch EventSub webhooks
- Twitch Developer Application (instructions below)
-
Clone the repository:
git clone https://github.com/Serph91P/StreamVault.git cd StreamVault -
Copy the environment template:
cp .env.example .env
-
Edit
.envwith your configuration (see Configuration section below) -
Start the application:
docker compose -f docker/docker-compose.yml up -d
-
Access the web interface at
https://your-domain.com
StreamVault requires a Twitch application to access the Twitch API:
- Go to Twitch Developer Console
- Click "Create Application"
- Fill in the details:
- Name: StreamVault (or your preferred name)
- OAuth Redirect URLs:
https://your-domain.com/auth/callback - Category: Application Integration
- Copy the Client ID and generate a Client Secret
- Add these to your
.envfile:TWITCH_APP_ID=your_client_id_here TWITCH_APP_SECRET=your_client_secret_here
Edit your .env file with the following required settings:
# Twitch API Configuration
TWITCH_APP_ID=your_twitch_client_id
TWITCH_APP_SECRET=your_twitch_client_secret
TWITCH_OAUTH_TOKEN= # Optional - for H.265/1440p quality
# Application URLs
BASE_URL=https://your-domain.com # Must be HTTPS with valid certificate
EVENTSUB_SECRET=random_secure_string # Generate a random string
# Database Configuration
POSTGRES_USER=streamvault
POSTGRES_PASSWORD=strong_secure_password
POSTGRES_DB=streamvault
# Optional Settings
TZ=Europe/Berlin # Your timezone
LOG_LEVEL=INFO # Logging verbosity (DEBUG, INFO, WARNING, ERROR)Twitch EventSub webhooks require a valid HTTPS certificate. Choose one of these options:
Option 1: Nginx Reverse Proxy with Let's Encrypt
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
location / {
proxy_pass http://localhost:7000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}Option 2: Cloudflare Tunnel (No Port Forwarding Required)
- Install Cloudflare Tunnel on your server
- Configure tunnel to point to
http://localhost:7000 - Cloudflare provides HTTPS automatically
Option 3: Caddy (Automatic HTTPS)
your-domain.com {
reverse_proxy localhost:7000
}By default, StreamVault can record up to 1080p60 in H.264. To unlock H.265 codec and 1440p quality:
- Open Twitch.tv in your browser and log in
- Press F12 to open Developer Tools
- Go to the Console tab
- Run this command:
document.cookie.split("; ").find(item=>item.startsWith("auth-token="))?.split("=")[1]
- Copy the 30-character token
- Add it to your
.envfile:TWITCH_OAUTH_TOKEN=your_30_character_token_here
- Restart the container:
docker compose restart app
Benefits of Browser Token:
- H.265/HEVC codec (60% smaller files, same quality)
- Access to 1440p60 quality streams
- Ad-free recordings (with Twitch Turbo subscription)
Note: Browser tokens expire after 60-90 days. You'll need to update it when it expires.
- Navigate to the "Streamers" page
- Click "Add Streamer"
- Enter the Twitch username (without @ symbol)
- Configure recording settings:
- Auto Record: Automatically start recording when streamer goes live
- Quality: best, 1080p60, 720p60, etc.
- Filename Template: Customize output filename format
- Navigate to the "Streamers" page
- Click "Import from Twitch"
- Log in with your Twitch account
- Select which followed channels to add
- All selected streamers will be added with default settings
Configure default recording behavior in Settings > Recording:
Output Directory
- Path where recordings are saved
- Default:
/recordings - Ensure sufficient disk space (streams can be 2-8GB per hour)
Filename Template
- Customize recording filenames using variables:
{streamer}- Streamer username{title}- Stream title{date}- Recording date (YYYY-MM-DD){time}- Recording time (HH-MM-SS){category}- Stream category/game
- Example:
{streamer}/{date}/{streamer}_{date}_{time}.ts
Quality Settings
- best - Highest available quality
- 1080p60 - 1080p at 60fps
- 720p60 - 720p at 60fps
- worst - Lowest quality (bandwidth saving)
Post-Processing Options
- Remux to MP4: Convert TS files to MP4 after recording
- Generate Chapters: Create chapter files from stream events
- Create Thumbnails: Generate video thumbnails
- Generate Metadata: Create NFO files for media servers
Override global settings for specific streamers:
- Go to Streamer detail page
- Click "Edit Settings"
- Configure custom settings:
- Recording quality
- Output directory
- Filename template
- Auto-record enabled/disabled
- Cleanup policies
Automatically delete old recordings to manage storage:
Global Cleanup Policy
- Apply to all streamers without custom policies
- Configure in Settings > Recording
Per-Streamer Cleanup Policy
- Override global policy for specific streamers
- Useful for favorites (keep longer) or test channels (delete sooner)
Cleanup Options:
- Max Age: Delete recordings older than X days
- Max Size: Delete oldest recordings when total exceeds X GB
- Max Files: Keep only the most recent X recordings
- Enabled: Toggle cleanup on/off
Example configuration:
{
"max_age_days": 30,
"max_size_gb": 100,
"max_files": 50,
"enabled": true
}StreamVault supports notifications through Apprise, which works with 100+ services including:
- Discord
- Telegram
- Slack
- Ntfy
- Pushover
- Email (SMTP)
- And many more
- Go to Settings > Notifications
- Enable notifications
- Add notification URL in Apprise format
Example URLs:
Discord:
discord://webhook_id/webhook_token
Telegram:
tgram://bot_token/chat_id
Ntfy:
ntfy://topic_name
Email (SMTP):
mailtos://user:password@smtp.example.com
See Apprise Documentation for complete URL format guide.
Configure which events trigger notifications:
- Stream Online: Streamer went live
- Stream Offline: Streamer went offline
- Stream Updated: Stream title or category changed
- Favorite Category: Streamer started streaming a favorite game
- Recording Started: Recording successfully started
- Recording Failed: Recording encountered an error
- Recording Completed: Recording finished successfully
Recommended Settings:
- Enable "Recording Failed" to catch issues immediately
- Disable "Recording Started" and "Recording Completed" to avoid notification spam
- Enable "Favorite Category" to get notified about specific games
Enable browser notifications:
- Go to Settings > Notifications
- Click "Enable Browser Notifications"
- Allow notifications when prompted by browser
- VAPID keys are automatically generated on first use
Web push works even when browser is closed (requires PWA installation).
-
Navigate to "Videos" page
-
Browse recordings by:
- All videos
- By streamer
- By date
- By category
-
Use search and filters to find specific recordings
Click on any video thumbnail to open the video player:
Player Features:
- Custom touch-optimized controls
- Keyboard shortcuts:
- Space: Play/Pause
- F: Fullscreen
- M: Mute/Unmute
- Arrow Left/Right: Seek backwards/forwards
- Chapter navigation (if chapters available)
- Quality selection (if multiple qualities available)
- Playback speed control
Single Video:
- Open video details
- Click "Delete" button
- Confirm deletion
Bulk Deletion:
- Go to Videos page
- Select multiple videos
- Click "Delete Selected"
Important: Deletion is permanent and cannot be undone.
Click the download icon on any video to download it to your local device.
StreamVault generates metadata files compatible with popular media servers.
- Configure StreamVault to generate NFO files (Settings > Recording)
- Set output directory to Plex library location
- Enable "Generate Metadata" option
- Plex will automatically detect and index recordings
Folder Structure:
recordings/
├── StreamerName/
│ ├── 202501/ # YYYYMM season format
│ │ ├── stream_01.mp4
│ │ ├── stream_01.nfo
│ │ ├── stream_01-poster.jpg
│ │ └── stream_01-fanart.jpg
Same as Plex - both support NFO metadata format.
Enable NFO generation and ensure proper folder structure. Kodi will read metadata from NFO files.
- NFO files: XML metadata with stream info, chapters, artwork paths
- Poster images: Vertical artwork (streamer profile or category)
- Fanart images: Horizontal background artwork
- Chapter files: VTT or XML chapter markers
Problem: Recordings not starting automatically
Solutions:
- Check EventSub webhook status in Settings > System
- Verify BASE_URL is HTTPS with valid certificate
- Check Twitch Application OAuth redirect URL matches BASE_URL
- Ensure EVENTSUB_SECRET is set in environment
Problem: Poor video quality or buffering
Solutions:
- Check internet connection speed
- Try lower quality setting (720p instead of 1080p)
- Configure proxy if streaming issues persist
- Check server CPU/RAM usage during recording
Problem: Storage filling up quickly
Solutions:
- Enable cleanup policies (Settings > Recording)
- Set max age for recordings (e.g., 30 days)
- Lower recording quality to reduce file sizes
- Enable H.265 codec (60% smaller files than H.264)
Problem: Recording fails immediately
Solutions:
- Check logs:
docker logs streamvault - Verify Twitch OAuth token is valid
- Test network connectivity to Twitch
- Check disk space availability
- Verify Streamlink is properly installed
Problem: Can't log in to web interface
Solutions:
- Clear browser cache and cookies
- Try incognito/private browsing mode
- Check database is running:
docker ps - Restart application:
docker compose restart app
Docker logs:
docker logs streamvault -fApplication logs:
docker exec streamvault cat /app/logs/app.logDatabase logs:
docker logs streamvault_dbIf you encounter issues not covered in this guide:
- Check GitHub Issues for similar problems
- Open a new issue with:
- Clear description of the problem
- Steps to reproduce
- Relevant log excerpts
- Your environment (OS, Docker version, etc.)
- Join discussions in GitHub Discussions
If you experience connection issues with Twitch, configure a proxy:
- Go to Settings > Proxy
- Add proxy URL (HTTP/HTTPS supported)
- Test proxy connection
- Enable proxy for recordings
StreamVault includes automatic audio-sync optimization for proxy connections.
StreamVault provides a REST API for automation:
Documentation: https://your-domain.com/docs
Example API Calls:
List streamers:
curl https://your-domain.com/api/streamersStart recording manually:
curl -X POST https://your-domain.com/api/recording/start/123Get recording status:
curl https://your-domain.com/api/recording/statusSee API documentation for complete endpoint reference.
StreamVault uses a background task queue for post-processing:
Task Types:
- Metadata generation
- Chapter creation
- MP4 remuxing
- Thumbnail generation
- File validation
- Cleanup operations
Monitoring:
- View queue status in Settings > System
- See active tasks and completion status
- Retry failed tasks manually
- Cancel long-running tasks if needed
Backup your database regularly to prevent data loss:
# Backup database
docker exec streamvault_db pg_dump -U streamvault streamvault > backup.sql
# Restore database
docker exec -i streamvault_db psql -U streamvault streamvault < backup.sqlStore backups securely off-site.