The VLog Admin UI provides a modern, responsive interface for managing your video platform. This guide covers all features and common workflows.
URL: http://your-server:9001
If no users exist, you'll see the Setup Wizard to create the initial admin account:
- Navigate to the Admin UI
- Enter a username, email, and password (minimum 12 characters)
- Click "Create Admin Account"
- You'll be logged in automatically
VLog uses multi-user authentication with role-based access control:
- Enter your username or email
- Enter your password
- Click "Sign In"
OIDC/SSO: If configured, you can also sign in with your organization's identity provider by clicking "Sign in with SSO".
Note: The admin panel is intended for internal use and should not be exposed to the public internet.
The admin interface has nine main tabs:
| Tab | Purpose |
|---|---|
| Videos | Browse, search, edit, and manage all videos |
| Categories | Create and manage video categories |
| Playlists | Create and manage playlists and collections |
| Upload | Upload new videos with metadata |
| Workers | Monitor transcoding workers and job status |
| Webhooks | Configure event notifications |
| Analytics | View playback statistics and trends |
| Users | Manage users and invites (Admin only) |
| Settings | Configure runtime settings and watermarks |
The Videos tab displays all videos with their status, category, and metadata.
Features:
- Search: Full-text search by title or description
- Filter by Status: pending, processing, ready, failed
- Filter by Category: Filter videos by category
- Bulk Selection: Select multiple videos for batch operations
| Status | Color | Description |
|---|---|---|
| Ready | Green | Transcoding complete, video is playable |
| Processing | Blue | Currently being transcoded |
| Pending | Yellow | Waiting for transcoding to start |
| Failed | Red | Transcoding failed (click to see error) |
Click on any video to open the edit panel:
- Metadata: Edit title, description, category
- Thumbnail: Select from video frames or upload custom image
- Custom Fields: Fill in category-specific metadata fields
- Tags: Add or remove tags
- Actions: Delete, restore, retry transcoding
VLog offers two ways to set video thumbnails:
Option 1: Select from Video Frames
- Open the video edit panel
- Click "Select from Video"
- Use the timeline scrubber to find the perfect frame
- Click "Use This Frame"
Option 2: Upload Custom Image
- Open the video edit panel
- Click "Upload Custom"
- Select an image file (JPEG, PNG, WebP)
- Images are automatically resized to optimal dimensions
Select multiple videos using checkboxes, then:
- Delete Selected: Move videos to archive
- Change Category: Assign a new category
- Retry Failed: Re-queue failed transcoding jobs
| Action | Description |
|---|---|
| Edit | Open video metadata editor |
| Delete | Soft-delete (moves to archive) |
| Restore | Restore from archive |
| Retry | Retry failed transcoding |
| Re-upload | Replace source file |
| Re-transcribe | Regenerate captions |
| Generate Sprites | Create timeline preview thumbnails |
| Queue Re-encode | Convert to CMAF format |
Chapters provide timeline navigation within videos.
Adding Chapters:
- Open the video edit panel
- Click the "Chapters" tab
- Click "Add Chapter"
- Enter:
- Title: Chapter name
- Start Time: When chapter begins (seconds or MM:SS format)
- End Time: Optional end time
- Click "Save"
Managing Chapters:
- Drag and drop to reorder chapters
- Click to edit chapter details
- Click X to remove a chapter
- Maximum 50 chapters per video
Chapter Display:
- Chapters appear in the video player timeline
- Viewers can click to jump to specific chapters
- Chapter titles shown on hover
Sprite sheets enable thumbnail previews when scrubbing the video timeline.
Generating Sprites:
- Open the video edit panel
- Click "Generate Sprites" in actions menu
- Wait for background processing
- Preview thumbnails appear on timeline hover
Configuration:
- Frame interval: seconds between captures (default: 5)
- Grid size: thumbnails per sheet (default: 10x10)
- See CONFIGURATION.md
Convert legacy HLS/TS videos to modern CMAF format.
Queue Individual Video:
- Open the video edit panel
- Click "Queue Re-encode" in actions menu
- Select priority (high, normal, low)
- Video joins re-encode queue
Bulk Queue:
- From Videos tab, filter by format = "hls_ts"
- Select multiple videos
- Click "Queue Re-encode"
- Choose priority level
Monitor Queue:
- View queue status in Workers tab
- See pending, in-progress, and completed jobs
- Cancel pending jobs if needed
Categories help organize videos and can have custom metadata fields.
- Click "New Category"
- Enter the category name
- Optionally add a description
- Click "Create"
Categories can have custom fields that appear when editing videos in that category.
Supported Field Types:
| Type | Description | Example Use |
|---|---|---|
| text | Short text input | Director, Producer |
| number | Numeric value | Release Year, Rating |
| date | Date picker | Release Date |
| select | Dropdown with options | Genre, Rating |
| multi_select | Multiple selection | Tags, Languages |
| url | URL with validation | IMDb Link, Website |
Creating Custom Fields:
- Open a category for editing
- Click "Add Custom Field"
- Configure:
- Name: Internal field identifier
- Label: Display name shown in UI
- Type: Select field type
- Required: Whether the field is mandatory
- Options: For select/multi_select types
Example: Movie Category Fields
Field: release_year (number) - "Release Year"
Field: director (text) - "Director"
Field: genre (multi_select) - "Genre" [Action, Comedy, Drama, ...]
Field: imdb_link (url) - "IMDb Page"
Playlists allow you to organize videos into curated collections, series, or courses.
- Click "New Playlist"
- Enter a title (required)
- Add an optional description
- Select playlist type:
- Playlist - General purpose
- Collection - Curated collection
- Series - Sequential series (numbered)
- Course - Educational course
- Set visibility:
- Public - Visible to all viewers
- Private - Admin-only
- Unlisted - Accessible by direct link
- Toggle "Featured" to highlight on homepage
- Click "Create"
Adding Videos:
- Open a playlist
- Click "Add Videos"
- Search or browse videos
- Select videos to add
- Click "Add Selected"
Reordering Videos:
- Open the playlist
- Drag and drop videos to reorder
- Changes save automatically
Removing Videos:
- Hover over a video in the playlist
- Click the remove button (X)
- Confirm removal
| Setting | Description |
|---|---|
| Title | Display name for the playlist |
| Description | Optional description shown on playlist page |
| Thumbnail | Uses first video's thumbnail (auto) or custom |
| Type | playlist, collection, series, course |
| Visibility | public, private, unlisted |
| Featured | Show on homepage featured section |
| Type | Best For | Display |
|---|---|---|
| Playlist | Loose grouping | Grid layout |
| Collection | Related content | Grid layout |
| Series | Sequential viewing | Numbered list |
| Course | Learning paths | Numbered list with progress |
- Select File: Drag and drop or click to browse
- Enter Title: Required, will be used in URLs
- Add Description: Optional, shown on video page
- Select Category: Optional, helps organize videos
- Click Upload: Progress bar shows upload status
VLog accepts most video formats that FFmpeg can process:
- MP4, MKV, AVI, MOV, WebM
- Most codecs (H.264, H.265, VP9, AV1, etc.)
- Maximum File Size: 100 GB (configurable via
VLOG_MAX_UPLOAD_SIZE) - Chunk Size: 1 MB (for reliable uploads)
After successful upload:
- Video appears in Videos tab with "pending" status
- Worker picks up the job and begins transcoding
- Status changes to "processing" with progress indicator
- When complete, status changes to "ready"
- Transcription runs automatically (if enabled)
Monitor distributed transcoding workers and job status.
| Status | Description |
|---|---|
| Online | Worker is connected and sending heartbeats |
| Offline | No heartbeat received (> 2 minutes) |
| Busy | Currently processing a job |
| Idle | Online but not processing |
For each worker:
- Name: Worker identifier
- Type: nvidia, intel, or cpu
- Current Job: Video being processed (if any)
- Progress: Transcoding progress percentage
- Last Heartbeat: Time since last health check
The Workers tab uses Server-Sent Events (SSE) for real-time updates:
- Worker status changes immediately
- Progress updates every few seconds
- No manual refresh needed
View the transcoding queue:
- Pending Jobs: Waiting for an available worker
- Active Jobs: Currently being processed
- Queue Priority: High, Normal, Low
Registering Workers:
vlog worker register --name "k8s-worker-1"Save the returned API key for the worker configuration.
Revoking Workers:
- Find the worker in the list
- Click "Revoke" to disable API key
- Worker will be unable to claim new jobs
The Workers tab shows the re-encode queue status:
| Section | Description |
|---|---|
| Pending | Jobs waiting for workers |
| In Progress | Currently being re-encoded |
| Completed | Recently finished jobs |
| Failed | Jobs that encountered errors |
Queue Actions:
- Cancel pending jobs
- Retry failed jobs
- View job details and error messages
Track container deployments and rolling updates:
- Deployment timestamp
- Image version deployed
- Rollout status
- Worker pod names
Configure webhook notifications for external integrations.
- Click "New Webhook"
- Enter webhook URL (HTTPS recommended)
- Select events to subscribe to
- Optionally add a description
- Click "Create"
A unique secret key will be generated for signature verification.
| Event | Description |
|---|---|
video.ready |
Transcoding completed |
video.processing |
Transcoding started |
video.failed |
Transcoding failed |
video.deleted |
Video soft-deleted |
video.restored |
Video restored from archive |
video.purged |
Video permanently deleted |
transcription.complete |
Captions generated |
transcription.failed |
Caption generation failed |
worker.connected |
Worker came online |
worker.disconnected |
Worker went offline |
Testing:
- Open webhook details
- Click "Test"
- Select an event type
- View the response
Viewing Deliveries:
- Click on a webhook
- See delivery history with status codes
- View request/response details
- Retry failed deliveries
Status Indicators:
- Green checkmark: Successful delivery
- Red X: Failed (will retry)
- Yellow clock: Pending retry
- Gray circle: Circuit breaker open
Each webhook has a unique secret for signature verification. See CONFIGURATION.md for verification examples.
View playback statistics and trends.
| Metric | Description |
|---|---|
| Total Views | All-time video views |
| Unique Viewers | Distinct viewer count |
| Watch Time | Total hours watched |
| Completion Rate | Average video completion percentage |
Filter analytics by:
- Last 24 hours
- Last 7 days
- Last 30 days
- All time
Click on any video to see:
- View count over time
- Average watch duration
- Completion rate
- Geographic distribution (if available)
See your most popular content:
- Most viewed
- Highest completion rate
- Most watch time
Manage users, invites, and access control. Admin only.
| Role | Description |
|---|---|
| Admin | Full system access including user management |
| Editor | Upload and manage own videos, view own analytics |
| Viewer | Browse and watch videos (for private instances) |
The Users tab displays all registered users with:
- Username and display name
- Email address
- Role (admin, editor, viewer)
- Status (active, disabled, pending)
- Last login time
Features:
- Search: Find users by username, email, or display name
- Filter by Role: Show only admins, editors, or viewers
- Filter by Status: Show only active, disabled, or pending users
Option 1: Direct Creation (Admin)
- Click "New User"
- Enter username (3-100 characters)
- Enter email address
- Enter password (minimum 12 characters)
- Optionally add display name
- Select role
- Click "Create"
Option 2: Send Invite
- Click "Invite User"
- Enter email address
- Select role for the new user
- Set expiration (1-90 days)
- Click "Send Invite"
- Share the invite link with the user
Editing a User:
- Click on a user row
- Update fields:
- Username
- Display name
- Role
- Status (active/disabled)
- Click "Save"
Disabling a User:
- Select the user
- Click "Disable"
- User's sessions are invalidated immediately
- User cannot log in until re-enabled
Force Password Reset:
- Select the user
- Click "Reset Password"
- User is logged out immediately
- Reset link is sent via email (if configured)
Pending Invites:
- View all pending invites
- See email, role, and expiration date
- Revoke invites that are no longer needed
Invite Status:
| Status | Description |
|---|---|
| Pending | Invite sent, not yet accepted |
| Accepted | User created account |
| Expired | Invite expired before use |
| Revoked | Admin revoked the invite |
Each user can create personal API keys for programmatic access.
User API Keys (Self-Service):
- Click your profile icon
- Select "API Keys"
- Click "New Key"
- Enter a name and optional expiration
- Copy the key immediately (shown only once)
Admin View:
- Admins can see all users' API key metadata
- Cannot view actual key values (hashed)
- Can revoke any user's keys
Users can view and manage their active sessions:
- Click your profile icon
- Select "Sessions"
- View all active sessions with:
- IP address
- Browser/device info
- Login time
- Click "Revoke" to terminate a session
Configure runtime settings without restarting services.
Add a watermark overlay to all video playback:
Image Watermark:
- Enable watermark
- Select "Image" type
- Upload watermark image (PNG recommended)
- Set position (corner or center)
- Adjust opacity (0-100%)
Text Watermark:
- Enable watermark
- Select "Text" type
- Enter watermark text
- Set font size and color
- Set position and opacity
Configurable settings include:
| Setting | Description |
|---|---|
| HLS Segment Duration | Segment length in seconds |
| Transcription Enabled | Auto-transcribe new uploads |
| Archive Retention | Days before permanent deletion |
| Worker Poll Interval | How often workers check for jobs |
- Settings are stored in the database
- Changes take effect within 60 seconds (cache TTL)
- No service restart required
- Previous values are logged for audit
The Admin UI is fully responsive and works on mobile devices:
- Collapsible navigation menu
- Touch-friendly controls
- Swipe gestures for video cards
- Mobile-optimized video preview
On mobile, action buttons appear as floating action buttons (FAB):
- Edit video
- Delete video
- More options menu
| Shortcut | Action |
|---|---|
/ |
Focus search |
Esc |
Close modal/panel |
Enter |
Confirm action |
? |
Show keyboard shortcuts |
- Check browser console for errors
- Verify Admin API is running:
curl http://localhost:9001/health - Check authentication if enabled
- Check file size limits
- Verify storage directory is writable
- Check Admin API logs:
journalctl -u vlog-admin -f
- Verify Worker API is running:
curl http://localhost:9002/api/health - Check Redis connection (for real-time updates)
- Fallback: Click "Refresh" button
- Check database connection
- Verify user has write permissions
- Check browser network tab for error responses
- Never expose port 9001 to the internet
- Use a VPN or internal network for admin access
- Create the initial admin via the setup wizard
- Use strong passwords (minimum 12 characters)
- Enable OIDC/SSO for centralized identity management
- Regularly review user accounts and disable unused ones
- Use API keys with expiration dates for programmatic access
- Review audit logs regularly
- API.md - API endpoint reference
- CONFIGURATION.md - All configuration options
- MONITORING.md - Prometheus metrics
- TROUBLESHOOTING.md - Common issues