Framerr Deployment & Usage Guide
Self-hosted homelab dashboard with drag-and-drop widgets, Plex SSO, and deep integrations for Sonarr, Radarr, Overseerr, and more.
1. Prerequisites
Required
- Docker & Docker Compose (recommended) OR a system with Node.js 20+ (for development)
- 64-bit Linux, macOS, or Windows (with WSL2)
- At least 512MB RAM (1GB+ recommended for multiple integrations)
- 500MB disk space for application + database
Optional (for integrations)
- Plex, Jellyfin, or Emby server
- Sonarr, Radarr, Overseerr, qBittorrent, etc.
- Existing reverse proxy (Nginx, Traefik, Caddy) for SSL termination
2. Installation
Option A: Docker Compose (Recommended)
- Create a
docker-compose.ymlfile:
services:
framerr:
image: pickels23/framerr:latest
container_name: framerr
environment:
- PUID=1000 # Your user ID (run: id -u)
- PGID=1000 # Your group ID (run: id -g)
- TZ=America/New_York # Your timezone
- SECRET_ENCRYPTION_KEY= # Generate: openssl rand -hex 32
volumes:
- /path/to/appdata/framerr:/config
ports:
- "3001:3001" # Host:Container port mapping
restart: unless-stopped
- Generate encryption key:
openssl rand -hex 32
Copy the output and paste it as the value for SECRET_ENCRYPTION_KEY.
- Start the container:
docker-compose up -d
- Access at
http://your-server-ip:3001
Option B: Unraid
- Download
docs/unraid/Framerr.xml - Copy to
/boot/config/plugins/dockerMan/templates/on your Unraid server - Add container from Docker tab → "Add Container" → select "Framerr"
- Set
SECRET_ENCRYPTION_KEY(generate as above) and volume paths - Apply and start
Option C: Development (Local)
# Clone repository
git clone https://github.com/Framerrr/Framerr.git
cd Framerr
# Install dependencies
npm install
cd server && npm install && cd ..
# Run in development mode (hot reload)
npm run dev:all
Access at http://localhost:3001
3. Configuration
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
SECRET_ENCRYPTION_KEY | Yes | — | 32-byte hex key for encrypting integration secrets. Generate with openssl rand -hex 32. |
PORT | No | 3001 | Internal container port (host port mapped via Docker ports:) |
PUID | No | 0 | User ID for file permissions (set to your user's UID, e.g., 1000) |
PGID | No | 0 | Group ID for file permissions (set to your group's GID, e.g., 1000) |
TZ | No | UTC | Timezone (e.g., America/New_York, Europe/London) |
DATA_DIR | No | /config | Path for persistent data (database, uploads, backups) |
First-Run Setup Wizard
- Open
http://your-server:3001 - Create admin account (username/password)
- Configure basic settings:
- Application URL (for SSO callbacks)
- Email settings (for notifications)
- Default theme
- Complete setup → redirected to dashboard
Integration Configuration
After setup, add integrations via Settings → Integrations:
-
Plex SSO (optional but recommended):
- Plex URL:
http://plex:32400(or your Plex URL) - Plex Token: Get from Plex.tv → Account → API
- Enable "Allow Plex login" in Settings → Authentication
- Plex URL:
-
Sonarr/Radarr:
- URL:
http://sonarr:8989(or your instance URL) - API Key: From Sonarr/Radarr → Settings → General → Security → API Key
- URL:
-
Overseerr:
- URL:
http://overseerr:5055 - API Key: Overseerr → Settings → General → API Key
- URL:
-
qBittorrent:
- URL:
http://qbittorrent:8080 - Username/Password: Your qBittorrent credentials
- URL:
Note: Integration URLs must be reachable from the Framerr container. Use Docker network names (e.g.,
http://sonarr:8989) if on same Docker network.
4. Build & Run
Development Build
# Install all dependencies (root + server)
npm install
cd server && npm install && cd ..
# Start both frontend (Vite) and backend (Express) with hot reload
npm run dev:all
# Or separately:
# Terminal 1: npm run dev (frontend)
# Terminal 2: npm run server:dev (backend)
Production Build
# Build frontend
npm run build
# Build server (creates dist/ folder)
npm run build:server
# Start production server
npm start
Docker Build (Custom)
docker build -t framerr:custom .
5. Deployment
Docker Compose (Production)
Use the same docker-compose.yml as installation, but add:
services:
framerr:
# ... existing config ...
networks:
- homelab # Use your existing Docker network
labels:
- "traefik.enable=true"
- "traefik.http.routers.framerr.rule=Host(`framerr.yourdomain.com`)"
- "traefik.http.services.framerr.loadbalancer.server.port=3001"
# Optional: resource limits
deploy:
resources:
limits:
memory: 1G
Behind Reverse Proxy
Framerr works with:
- Authelia/Authentik: Set
AUTH_PROXY_MODE=trueand whitelist proxy IPs - Nginx Proxy Manager: Add custom Nginx config:
location / { proxy_pass http://framerr:3001; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; } - Cloudflare Tunnel: Create tunnel to
framerr:3001
Backup Strategy
Persistent data is in /config (or $DATA_DIR). Backup:
# Stop container
docker-compose stop framerr
# Backup entire config directory
tar -czf framerr-backup-$(date +%Y%m%d).tar.gz /path/to/appdata/framerr/
# Restore: extract to same location and restart
docker-compose start framerr
6. Troubleshooting
Container Won't Start
- Check logs:
docker logs framerr - Missing SECRET_ENCRYPTION_KEY: Ensure it's set and is 32-byte hex (64 characters)
- Permission errors: Set
PUID/PGIDto your user's IDs (id -uandid -g) - Port conflict: Change host port mapping (
"8080:3001"instead of"3001:3001")
Integrations Not Working
- Verify connectivity from inside container:
docker exec framerr curl -I http://sonarr:8989 - Check API keys in Framerr integration settings
- Ensure services on same Docker network (use
docker network lsanddocker network inspect) - Review service logs in Framerr: Settings → System Logs
Dashboard Not Loading / Blank Screen
- Browser console errors: Check for CORS or mixed-content (HTTP vs HTTPS)
- Clear browser cache and localStorage (
Applicationtab → Clear storage) - Check backend logs for startup errors
Mobile Layout Issues
- Framerr uses a separate mobile layout. Ensure widgets are added to mobile view via:
- Enter edit mode (pencil icon)
- Switch to mobile view (phone icon)
- Drag widgets to mobile grid
- Save layout
Database Corruption
If /config/framerr.db is corrupted:
- Stop container
- Backup current
/configfolder - Delete
framerr.db(Framerr will recreate empty DB on startup) - Restart and reconfigure integrations (widget configurations are stored in DB)
Performance Issues
- High CPU: Reduce polling intervals in integration settings (default: 10-30s)
- Memory: Limit number of real-time widgets (Plex streams, qBittorrent)
- History data: Metric history retention defaults to 3 days. Adjust in Settings → System → Metric History
Support & Updates
- Documentation: https://framerrr.github.io/Framerr/
- Changelog: CHANGELOG.md
- Issues: GitHub Issues
- Donate: Buy Me a Coffee
Warning: Framerr is in early development (
0.x.x). Breaking changes may occur between minor releases. Pin your Docker image version (e.g.,pickels23/framerr:0.2.1) for production stability.