Overview
Panel offers a user interface for device management, action execution, real-time monitoring, and system configuration. Built with Elysia and integrated with PocketBase for authentication and data.Configuration
Docker Compose
Environment variables
| Variable | Description | Default |
|---|---|---|
PORT | Service port | 4000 |
POCKETBASE_URL | PocketBase connection URL | Required |
Dependencies
Panel uses minimal dependencies:Features
Device management
- Device list - View all registered devices
- Device details - View device information and status
- Device configuration - Edit device settings
- Connection management - Configure primary and secondary slots
Action execution
- Quick actions - Execute common device actions
- Custom actions - Run any configured action
- Parameter input - Provide action parameters
- Execution history - View past action executions
Real-time monitoring
- Live streams - View device video streams
- Status indicators - Real-time device status
- Health monitoring - Slot health and connectivity
- Telemetry data - Battery, GPS, IMU data
Media gallery
- Event browsing - View captured media events
- Thumbnail preview - Quick media preview
- Download media - Download event files
- Delete events - Remove old media
User interface components
Device list view
Main dashboard showing all devices:- Device name and status
- Current mode (live, off, auto)
- Active slot indicator
- Quick action buttons
Device detail view
Detailed device information:- Device configuration
- Connection settings
- Action controls
- Status metrics
Stream viewer
Real-time video streaming:- WebRTC or HLS streams
- Full-screen mode
- Stream quality controls
- Recording controls
Media gallery
Browse device media:- Grid view of events
- Thumbnail previews
- Filter by type and date
- Bulk operations
API endpoints
Panel provides API endpoints for the UI:Get devices
Get device details
Execute action
Get media events
Health check
Authentication
Panel uses PocketBase for authentication:Login
Users authenticate via PocketBase:Session management
Sessions stored in PocketBase:- Automatic token refresh
- Secure cookie storage
- Session expiration
User roles
Role-based access control:- Admin - Full system access
- Operator - Device control and monitoring
- Viewer - Read-only access
Real-time updates
Panel uses various methods for real-time updates:PocketBase realtime
Subscribe to database changes:WebSocket notifications
Receive push notifications:Polling
Periodic updates for telemetry:UI customization
Themes
Panel supports light and dark themes:- System theme detection
- Manual theme toggle
- Custom color schemes
Layout
Customizable layout options:- Grid or list view
- Sidebar position
- Dashboard widgets
Preferences
User preferences saved in PocketBase:- Default views
- Notification settings
- Display options
Integration with services
Joystick integration
Execute actions via Joystick API:Studio integration
Browse media from Studio:Switcher integration
Control device modes:Baker integration
Manage scheduled actions:Responsive design
Panel is responsive across devices:- Desktop - Full feature set
- Tablet - Optimized layout
- Mobile - Touch-friendly interface
Accessibility
Panel follows accessibility guidelines:- Keyboard navigation
- Screen reader support
- High contrast mode
- Focus indicators
Performance optimization
Lazy loading
Load components on demand:Caching
Cache API responses:Debouncing
Debounce user inputs:Development mode
Run Panel in development mode:- Hot module reload
- Debug logging
- Source maps
- API mocking
Troubleshooting
Cannot connect to PocketBase
- Verify
POCKETBASE_URLis correct - Check network connectivity
- Ensure PocketBase is healthy
Actions not executing
- Check Joystick service is running
- Verify authentication token
- Review browser console for errors
Stream not loading
- Verify MediaMTX is running
- Check device is in live mode
- Test stream URL directly
UI not updating
- Check WebSocket connection
- Verify realtime subscriptions
- Review network tab for failed requests
Traefik routing
Panel is exposed at/panel path: