A stateless, self-hosted, server-side rendered (SSR) dashboard for managing a private LiveKit server. Built with FastAPI and Jinja2 templates, using only the LiveKit Python SDK for real-time server management.
- π― Stateless Architecture - No database, no Redis, no background workers
- π Simple Authentication - HTTP Basic Auth with one admin account
- π Comprehensive Analytics - Real-time analytics for all LiveKit services
- π Overview Dashboard - Server status, active rooms, participants count, SDK latency
- πͺ Room Management - List, create, close rooms; view participants and tracks
- π« Token Generation - Generate join tokens on-the-fly for testing
- π₯ Participant Control - Kick participants, view tracks, connection stats
- πΉ Egress/Recordings - Start/stop composite egress, view active jobs
- π₯ Ingress Monitoring - Stream analytics and connection quality metrics
- π SIP Integration - (Optional) Manage SIP trunks, outbound/inbound calls
- π§ Settings View - Read-only configuration and server info
- π§ͺ Sandbox - Token generator with HMAC verification helper
- Connection Success Rate - Based on room health and participant status
- Platform Distribution - Web, iOS, Android, React Native client detection
- Connection Types - WebRTC Direct vs TURN Relay analysis
- Session Duration - Live calculation from participant join times
- Room Analytics - Active rooms, participant distribution, room sizes
- Egress Analytics - Job status, success rates, storage usage, type distribution
- Ingress Analytics - Stream monitoring, connection quality, bitrate analysis
- SIP Analytics - Trunk status, call volume, dispatch rules (when enabled)
- Interactive Charts - Chart.js doughnut charts for data distribution
- Responsive Design - Mobile-friendly analytics cards
- Real-time Updates - Live data from LiveKit APIs
- Error Handling - Graceful fallbacks and debug information
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User Browser β
β (HTTP Basic Auth) β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β HTTPS
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FastAPI + Jinja2 (SSR) β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β Routes: Overview, Rooms, Egress, SIP... β β
β βββββββββββββββββββ¬ββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββΌββββββββββββββββββββββββββββ β
β β LiveKitClient (SDK Wrapper) β β
β βββββββββββββββββββ¬ββββββββββββββββββββββββββββ β
ββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β SDK API Calls
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LiveKit Server β
β (Your Private Deployment) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Stateless: All data is fetched directly from LiveKit on each request
- SSR: Server-side rendered HTML with Jinja2 templates
- Progressive Enhancement: HTMX for auto-refresh and better UX
- Secure: HTTP Basic Auth, CSRF protection, security headers
- Minimal: No external dependencies beyond FastAPI and LiveKit SDK
- Python 3.10 or higher
- A running LiveKit server instance
- LiveKit API key and secret
# Clone the repository
git clone <repository-url>
cd livekit-dashboard
# Install dependencies
make install
# Create and configure .env file
make env-example
# Edit .env with your LiveKit credentials
nano .env
# Run in development mode
make dev# Clone the repository
git clone <repository-url>
cd livekit-dashboard
# Create .env file
cp .env.example .env
# Edit .env with your credentials
nano .env
# Build and run with Docker Compose
make docker-run
# Or manually:
docker-compose up -d# Install Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Install dependencies
poetry install
# Set environment variables
export LIVEKIT_URL="https://your-livekit-server.com"
export LIVEKIT_API_KEY="your-api-key"
export LIVEKIT_API_SECRET="your-api-secret"
export ADMIN_USERNAME="admin"
export ADMIN_PASSWORD="secure-password"
export APP_SECRET_KEY="$(openssl rand -hex 32)"
# Run the application
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000All configuration is done via environment variables. Create a .env file:
# LiveKit Server Configuration
LIVEKIT_URL=https://your-livekit-server.com
LIVEKIT_API_KEY=your-api-key
LIVEKIT_API_SECRET=your-api-secret
# Admin Authentication
ADMIN_USERNAME=admin
ADMIN_PASSWORD=changeme
# Application Settings
APP_SECRET_KEY=your-secret-key-for-csrf-and-sessions
DEBUG=false
HOST=0.0.0.0
PORT=8000
# Feature Flags
ENABLE_SIP=false| Variable | Required | Default | Description |
|---|---|---|---|
LIVEKIT_URL |
β | - | LiveKit server URL (e.g., https://your-server.com) |
LIVEKIT_API_KEY |
β | - | LiveKit API key |
LIVEKIT_API_SECRET |
β | - | LiveKit API secret |
ADMIN_USERNAME |
β | admin |
Dashboard admin username |
ADMIN_PASSWORD |
β | changeme |
Dashboard admin password |
APP_SECRET_KEY |
β | - | Secret key for CSRF tokens (generate with openssl rand -hex 32) |
DEBUG |
β | false |
Enable debug mode |
HOST |
β | 0.0.0.0 |
Host to bind to |
PORT |
β | 8000 |
Port to listen on |
ENABLE_SIP |
β | false |
Enable SIP features |
- Open your browser and navigate to
http://localhost:8000 - Enter your admin credentials when prompted
- You'll see the overview dashboard with server stats
- View server status and health
- See total rooms and participants
- Monitor SDK latency
- Quick access to recent rooms
- List all active rooms
- Create new rooms with custom settings
- View room details and participants
- Close/delete rooms
- Generate join tokens for participants
- List active egress jobs
- Start room composite recordings
- Stop active recordings
- View file outputs and download URLs
- View configured SIP trunks
- Create outbound SIP calls
- View inbound dispatch rules
- Generate test tokens for development
- Customize permissions and TTL
- Copy tokens to clipboard
- Quick links to test apps
- View server configuration
- Check connection status
- Review security settings
- See feature flags
make help # Show all available commands
make install # Install dependencies
make dev # Run in development mode with auto-reload
make run # Run in production mode
make test # Run tests
make test-cov # Run tests with coverage report
make fmt # Format code with Black
make lint # Lint code with Ruff and mypy
make clean # Clean up cache and temporary files
make docker-build # Build Docker image
make docker-run # Run with Docker Compose
make docker-stop # Stop Docker services
make docker-logs # View Docker logslivekit-dashboard/
βββ app/
β βββ main.py # FastAPI application entry point
β βββ routes/ # Route handlers
β β βββ overview.py # Overview/dashboard
β β βββ rooms.py # Room management
β β βββ egress.py # Egress/recordings
β β βββ sip.py # SIP telephony
β β βββ settings.py # Settings page
β β βββ sandbox.py # Token generator
β β βββ auth.py # Authentication
β βββ services/ # Business logic
β β βββ livekit.py # LiveKit SDK wrapper
β βββ security/ # Security modules
β β βββ basic_auth.py # HTTP Basic Auth
β β βββ csrf.py # CSRF protection
β βββ templates/ # Jinja2 templates
β β βββ base.html.j2 # Base template
β β βββ index.html.j2 # Overview page
β β βββ rooms/ # Room templates
β β βββ egress/ # Egress templates
β β βββ sip/ # SIP templates
β β βββ settings.html.j2 # Settings page
β β βββ sandbox.html.j2 # Token generator
β βββ static/ # Static assets
β βββ css/ # Stylesheets
β βββ js/ # JavaScript
βββ Dockerfile # Docker image definition
βββ docker-compose.yml # Docker Compose configuration
βββ pyproject.toml # Python dependencies
βββ Makefile # Development commands
βββ README.md # This file
-
Always use HTTPS in production
- Configure a reverse proxy (nginx, Caddy) with TLS
- Update security headers accordingly
-
Change default credentials
export ADMIN_USERNAME="your-admin-user" export ADMIN_PASSWORD="$(openssl rand -base64 32)"
-
Generate a strong secret key
export APP_SECRET_KEY="$(openssl rand -hex 32)"
-
Keep LiveKit credentials secure
- Never commit
.envfiles - Use environment variable injection in production
- Rotate API keys regularly
- Never commit
-
Enable security headers
- HSTS, CSP, X-Frame-Options (enabled by default)
- Adjust Content-Security-Policy for your needs
-
Rate limiting (optional)
- Consider adding rate limiting middleware
- Use a reverse proxy with rate limiting
The application automatically sets these security headers:
X-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockReferrer-Policy: strict-origin-when-cross-originStrict-Transport-Security(in production)Content-Security-Policy(restrictive by default)
# 1. Build the image
docker build -t livekit-dashboard:latest .
# 2. Run with environment variables
docker run -d \
--name livekit-dashboard \
-p 8000:8000 \
-e LIVEKIT_URL="https://your-server.com" \
-e LIVEKIT_API_KEY="your-key" \
-e LIVEKIT_API_SECRET="your-secret" \
-e ADMIN_USERNAME="admin" \
-e ADMIN_PASSWORD="secure-password" \
-e APP_SECRET_KEY="$(openssl rand -hex 32)" \
livekit-dashboard:latest# Start services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down# Run all tests
make test
# Run with coverage
make test-cov
# Run linting
make lint
# Run formatting
make fmt
# Run all checks
make check| Endpoint | Method | Description | Auth Required |
|---|---|---|---|
/ |
GET | Overview dashboard | β |
/rooms |
GET | List rooms | β |
/rooms |
POST | Create room | β |
/rooms/{name} |
GET | Room details | β |
/rooms/{name}/delete |
POST | Delete room | β |
/rooms/{name}/token |
POST | Generate token | β |
/egress |
GET | List egress jobs | β |
/egress/start |
POST | Start egress | β |
/egress/{id}/stop |
POST | Stop egress | β |
/sip-outbound |
GET | SIP outbound page | β |
/sip-inbound |
GET | SIP inbound page | β |
/sandbox |
GET | Token generator | β |
/settings |
GET | Settings page | β |
/logout |
GET | Logout page | β |
/health |
GET | Health check | β |
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Use Black for Python formatting:
make fmt - Use Ruff for linting:
make lint - Follow existing patterns and conventions
- Add tests for new features
This project is licensed under the MIT License - see the LICENSE file for details.
- LiveKit - Open source WebRTC infrastructure
- FastAPI - Modern Python web framework
- Bootstrap - UI framework
- HTMX - Progressive enhancement library
- Documentation: LiveKit Docs
- Issues: GitHub Issues
- Community: LiveKit Discord
- WebSocket live updates
- Advanced participant management
- Recording download management
- Multi-user support with roles
- Ingress management
- Analytics and metrics
- Dark mode theme
- Mobile-responsive improvements
- β App is stateless: no DB/Redis/background workers
- β All data fetched directly from LiveKit per request
- β HTTP Basic Auth using one admin account from env
- β
All routes protected except
/healthand/logout - β
SSR pages:
/,/rooms,/rooms/{name},/sip-outbound,/sip-inbound,/settings,/sandbox - β Docker image builds and runs with environment variables
- β Secrets never shown in full UI
- β Secure headers enabled
- β CSRF protection on POST forms
- β HTMX for auto-refresh and progressive enhancement
- β Token generation works on-the-fly
- β Room and participant management operational
- β Egress start/stop functionality
- β SIP features (when enabled)
Made with β€οΈ for the LiveKit community
