Mission control for your media server stack
Unified logging, intelligent issue detection, and AI-powered analysis for Plex, Jellyfin, Emby, Sonarr, Radarr, Prowlarr, Whisparr, Lidarr, Bazarr, Readarr, Seerr, qBittorrent, and more.
Running a media server stack means juggling multiple dashboards, each with their own logs and error reporting. When something breaks, you're chasing cascading failures across apps while the goalposts keep moving.
Logarr aggregates logs from all your servers, automatically detects and ranks issues by impact, and helps you track them to resolution—all from a single dashboard.
Real-time overview: health status, 24-hour activity, active sessions, and top issues at a glance
Real-time log streaming with WebSocket-based updates and instant filtering
Advanced filtering by level, source type (API/File), and full-text search
Filter by severity, status, and source. Impact scores help prioritize what matters most.
Deep analysis with root cause identification, AI summaries, and 24h activity charts
Connect and monitor all your media servers from one place
Configure API connections and file-based log ingestion per source
Track active playback sessions, transcoding status, and user activity
Configure multiple AI providers for issue analysis (Anthropic, OpenAI, Google, Ollama, LM Studio)
| Category | Capabilities |
|---|---|
| Log Aggregation | Real-time streaming, full-text search, advanced filtering by server/level/source type |
| File Ingestion | Direct container log reading, multi-line stack trace assembly, automatic rotation detection |
| Issue Detection | Automatic error fingerprinting, deduplication, impact scoring, status tracking |
| AI Analysis | Root cause identification, actionable fixes, multi-provider support (Anthropic, OpenAI, Google, Ollama, LM Studio) |
| Session Tracking | Active playback monitoring, transcoding visibility, user attribution |
| Dashboard | System health, 24-hour activity timeline, top issues, now playing |
| Server | Status | Server | Status |
|---|---|---|---|
| Jellyfin | ✅ Supported | Plex | ✅ Supported |
| Sonarr | ✅ Supported | Emby | ✅ Supported |
| Radarr | ✅ Supported | Whisparr | ✅ Supported |
| Prowlarr | ✅ Supported | Lidarr | ✅ Supported |
| Seerr | ✅ Supported | Readarr | |
| Bazarr | ✅ Supported | qBittorrent | ✅ Supported |
| Kodi | 🚧 Planned |
Seerr also covers Overseerr and Jellyseerr (same API). Use the admin API key (Settings → General). Activity comes from media requests and user-reported issues; application logs come from file ingestion of
seerr-YYYY-MM-DD.log(legacyoverseerr-/jellyseerr-files are supported).
*Readarr was retired upstream (archived June 2025, last release v0.4.18). Logarr supports it on a best-effort basis; expect permanent metadata (BookInfo) health errors on most installs.
Logarr uses a provider architecture—adding support for new servers is straightforward. Contributions welcome!
Logarr publishes pre-built Docker images to both GitHub Container Registry and Docker Hub:
# Create docker-compose.yml with:
services:
backend:
image: itz4blitz/logarr-backend:latest
# ... rest of configuration
frontend:
image: itz4blitz/logarr-frontend:latest
# ... rest of configurationSee the full docker-compose.yml for complete configuration.
git clone https://github.com/itz4blitz/logarr.git
cd logarr
cp .env.example .env
docker compose up -dOpen http://localhost:3001 and add your first server.
pnpm install
pnpm docker:dev # Start PostgreSQL & Redis
pnpm db:push # Initialize database
pnpm dev # Start dev servers- Frontend: http://localhost:3001
- API: http://localhost:4001/api
- Docs: http://localhost:4001/api/docs
flowchart TB
subgraph Client
FE[Next.js Frontend]
end
subgraph Backend
API[NestJS API]
WS[WebSocket Server]
end
subgraph Data
PG[(PostgreSQL)]
RD[(Redis)]
end
subgraph Providers
PX[Plex]
JF[Jellyfin]
EM[Emby]
SO[Sonarr]
RA[Radarr]
PR[Prowlarr]
WH[Whisparr]
LI[Lidarr]
SE[Seerr]
RE[Readarr]
BA[Bazarr]
QB[qBittorrent]
end
FE <--> API
FE <--> WS
API <--> PG
API <--> RD
API <--> PX & JF & EM & SO & RA & PR & WH & LI & BA & SE & RE & QB
Log Ingestion — Providers connect via WebSocket or polling (configurable per server). Logs are deduplicated using external activity IDs.
Error Fingerprinting — Similar errors are normalized and hashed to group thousands of occurrences into single trackable issues.
Impact Scoring — Each issue receives a 0-100 score based on severity (40%), frequency (25%), affected users (20%), sessions (10%), and recency (5%).
# Required
DATABASE_URL=postgresql://postgres:postgres@localhost:5433/logarr
REDIS_URL=redis://localhost:6380
# Optional - AI Analysis (auto-configured on startup if set)
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
GOOGLE_AI_API_KEY=...
# Optional - Local AI
OLLAMA_BASE_URL=http://localhost:11434
LMSTUDIO_BASE_URL=http://localhost:1234/v1
# Optional - Media Servers (auto-configured on startup if set)
JELLYFIN_URL=http://jellyfin:8096
JELLYFIN_API_KEY=...
PLEX_URL=http://plex:32400
PLEX_TOKEN=...
# Optional - Data Retention (defaults shown)
LOG_RETENTION_DAYS=30 # Days to keep info/debug logs
LOG_RETENTION_ERROR_DAYS=90 # Days to keep error/warn logs
LOG_CLEANUP_ENABLED=true # Enable automatic cleanup
LOG_CLEANUP_CRON=0 3 * * * # Cleanup schedule (default: 3 AM daily)Logarr automatically cleans up old logs to prevent unbounded database growth—essential for home servers with limited storage.
| Setting | Default | Description |
|---|---|---|
| Info/Debug logs | 30 days | Lower-priority logs cleaned first |
| Error/Warn logs | 90 days | Kept 3x longer for debugging |
| Cleanup schedule | 3 AM daily | Configurable via cron expression |
Configuration options:
- Environment variables — Set defaults in
docker-compose.ymlor.env - Settings UI — Adjust at runtime via Settings → Data Management
Issues and statistics are preserved even after logs are deleted. The Data Management page shows storage usage, cleanup history, and lets you preview or trigger manual cleanup.
- Navigate to Sources → Add Source
- Select server type and enter URL + API key
- Test connection and save
Alternatively, set environment variables (e.g., JELLYFIN_URL and JELLYFIN_API_KEY) and servers will be auto-configured on startup.
For deeper log analysis, Logarr can read log files directly from your media servers. This captures detailed application logs that APIs don't expose.
- Set log paths in
.env— Point to your host machine's log directories:
# Media Servers
PLEX_LOGS_PATH=/path/to/plex/Library/Application Support/Plex Media Server/Logs
JELLYFIN_LOGS_PATH=/path/to/jellyfin/config/log
EMBY_LOGS_PATH=/path/to/emby/config/logs
# *arr Apps
SONARR_LOGS_PATH=/path/to/sonarr/config/logs
RADARR_LOGS_PATH=/path/to/radarr/config/logs
PROWLARR_LOGS_PATH=/path/to/prowlarr/config/logs
WHISPARR_LOGS_PATH=/path/to/whisparr/config/logs
LIDARR_LOGS_PATH=/path/to/lidarr/config/logs
READARR_LOGS_PATH=/path/to/readarr/config/logs
# Bazarr (note: the directory is `log`, singular, and contains bazarr.log)
BAZARR_LOGS_PATH=/path/to/bazarr/config/log
# Request Managers
SEERR_LOGS_PATH=/path/to/seerr/config/logs
# Download clients
QBITTORRENT_LOGS_PATH=/path/to/qbittorrent/config/qBittorrent/logsBazarr notes: Bazarr writes naive local timestamps (no timezone), so run Logarr in the same timezone as Bazarr (e.g. set
TZon both containers). Bazarr health issues are recorded once per distinct issue, not on every poll. Bazarr reports history dates in its host's locale format; Logarr infers whether it is day-first or month-first from the data and skips timestamps it cannot read unambiguously.
-
Restart Logarr — The docker-compose mounts these paths automatically.
-
Configure in UI — Go to Sources → Edit your server → Enable file ingestion with the container path:
| Server | Container Path |
|---|---|
| Plex | /plex-logs |
| Jellyfin | /jellyfin-logs |
| Emby | /emby-logs |
| Sonarr | /sonarr-logs |
| Radarr | /radarr-logs |
| Prowlarr | /prowlarr-logs |
| Whisparr | /whisp-logs |
| Lidarr | /lidarr-logs |
| Seerr | /seerr-logs |
| Readarr | /readarr-logs |
| Bazarr | /bazarr-logs |
| Server | Container Path |
| ----------- | ------------------- |
| Plex | /plex-logs |
| Jellyfin | /jellyfin-logs |
| Emby | /emby-logs |
| Sonarr | /sonarr-logs |
| Radarr | /radarr-logs |
| Prowlarr | /prowlarr-logs |
| Whisparr | /whisp-logs |
| Lidarr | /lidarr-logs |
| qBittorrent | /qbittorrent-logs |
qBittorrent is a standalone provider (WebUI API v2) and is detected from the stored credentials:
| Setup | Username | Password / API key | Notes |
|---|---|---|---|
| Username + password | set | WebUI password | Cookie session, re-login on expiry |
| API key (qBittorrent >= 5.2) | empty | API key | Sent as Authorization: Bearer |
| No authentication | empty | empty | "Bypass authentication" for Logarr's IP / subnet enabled |
Environment variables for auto-setup: QBITTORRENT_URL, QBITTORRENT_USERNAME, QBITTORRENT_PASSWORD.
- Stored passwords and API keys are never returned by the API. When editing a source, leave the password / API key field empty to keep the stored value. The request proxy sends API keys to qBittorrent as
Authorization: Bearerand does not support username/password sources. - qBittorrent bans an IP for 1 hour after 5 failed logins. After a failed login Logarr backs off (5, 15, then 60 minutes) instead of retrying every poll; fix the credentials and edit the source to retry immediately.
- Behind a reverse proxy or with Host header validation enabled, qBittorrent may answer 401; allow Logarr's host name in "Server domains".
- The API log feed only reports warnings and critical messages, and is skipped when a log path is configured (the
qbittorrent.logfile is tailed instead). Log file timestamps have no timezone: set the backendTZto qBittorrent's timezone. - Default log locations are best guesses:
/config/qBittorrent/logs(linuxserver) and/config/logs(hotio) are unverified, so set the log path explicitly.
To run multiple instances of the same server type, use numbered environment variables:
# Primary Radarr instance (for Movies)
RADARR_URL=http://radarr-movies:7878
RADARR_API_KEY=your_api_key
RADARR_LOGS_PATH=/path/to/radarr-movies/logs
# Secondary Radarr instance (for Shorts)
RADARR_LOGS_PATH_1=/path/to/radarr-shorts/logs
RADARR_LOGS_PATH_2=/path/to/radarr-4k/logsThe numbered instances are mounted as:
/radarr-logs-1/radarr-logs-2/radarr-logs-3
Simply add multiple servers in the UI using the same server type but different URLs and log paths.
| Instance | Container Path |
|---|---|
| Primary | /radarr-logs |
| Instance 1 | /radarr-logs-1 |
| Instance 2 | /radarr-logs-2 |
| Instance 3 | /radarr-logs-3 |
Note: You can have up to 3 additional instances per server type beyond the primary. Add each instance as a separate server in the Sources UI.
| Server | Docker | Linux | Windows |
|---|---|---|---|
| Plex | /config/Library/.../Logs |
/var/lib/plexmediaserver/.../Logs |
%LOCALAPPDATA%\Plex Media Server\Logs |
| Jellyfin | /config/log |
/var/lib/jellyfin/log |
C:\ProgramData\Jellyfin\Server\log |
| Emby | /config/logs |
/var/lib/emby/logs |
C:\ProgramData\Emby-Server\logs |
| Sonarr | /config/logs |
~/.config/Sonarr/logs |
C:\ProgramData\Sonarr\logs |
| Radarr | /config/logs |
~/.config/Radarr/logs |
C:\ProgramData\Radarr\logs |
| Prowlarr | /config/logs |
~/.config/Prowlarr/logs |
C:\ProgramData\Prowlarr\logs |
| Whisparr | /config/logs |
~/.config/Whisparr/logs |
C:\ProgramData\Whisparr\logs |
| Lidarr | /config/logs |
~/.config/Lidarr/logs |
C:\ProgramData\Lidarr\logs |
| Seerr | /app/config/logs |
~/.config/seerr/logs |
C:\ProgramData\seerr\logs |
| Readarr | /config/logs |
~/.config/Readarr/logs |
C:\ProgramData\Readarr\logs |
| Bazarr | /config/log |
~/.config/bazarr/log |
C:\ProgramData\Bazarr\log |
| Server | Docker | Linux | Windows |
| ----------- | ---------------------------------------------------- | ----------------------------------- | --------------------------------------- |
| Plex | /config/Library/.../Logs |
/var/lib/plexmediaserver/.../Logs |
%LOCALAPPDATA%\Plex Media Server\Logs |
| Jellyfin | /config/log |
/var/lib/jellyfin/log |
C:\ProgramData\Jellyfin\Server\log |
| Emby | /config/logs |
/var/lib/emby/logs |
C:\ProgramData\Emby-Server\logs |
| Sonarr | /config/logs |
~/.config/Sonarr/logs |
C:\ProgramData\Sonarr\logs |
| Radarr | /config/logs |
~/.config/Radarr/logs |
C:\ProgramData\Radarr\logs |
| Prowlarr | /config/logs |
~/.config/Prowlarr/logs |
C:\ProgramData\Prowlarr\logs |
| Whisparr | /config/logs |
~/.config/Whisparr/logs |
C:\ProgramData\Whisparr\logs |
| Lidarr | /config/logs |
~/.config/Lidarr/logs |
C:\ProgramData\Lidarr\logs |
| qBittorrent | /config/qBittorrent/logs (linuxserver, unverified) |
~/.local/share/qBittorrent/logs |
%LOCALAPPDATA%\qBittorrent\logs |
Once running, Swagger docs are available at http://localhost:4001/api/docs.
| Endpoint | Description |
|---|---|
GET /api/logs |
Search and filter logs |
GET /api/issues |
Issue management and AI analysis |
GET /api/sessions |
Active and historical sessions |
GET /api/servers |
Server management |
// Connect to ws://localhost:4001/logs
socket.on('log', (log) => {}); // New log entry
socket.on('issue.created', (issue) => {}); // New issue detected
socket.on('session.started', (session) => {}); // Playback startedlogarr/
├── apps/
│ ├── backend/ # NestJS API
│ └── frontend/ # Next.js app
├── packages/
│ ├── core/ # Shared types and utilities
│ ├── provider-plex/ # Plex integration
│ ├── provider-jellyfin/ # Jellyfin integration
│ ├── provider-emby/ # Emby integration
│ ├── provider-sonarr/ # Sonarr integration
│ ├── provider-radarr/ # Radarr integration
│ ├── provider-prowlarr/ # Prowlarr integration
│ ├── provider-whisparr/ # Whisparr integration
│ ├── provider-lidarr/ # Lidarr integration
│ ├── provider-seerr/ # Seerr integration (Overseerr/Jellyseerr compatible)
│ ├── provider-readarr/ # Readarr integration (retired upstream)
│ ├── provider-bazarr/ # Bazarr integration
│ ├── provider-qbittorrent/ # qBittorrent integration
│ └── provider-arr/ # Base *arr provider
└── docker-compose.yml
Logarr uses pre-built Docker images by default, making upgrades simple:
Linux/Mac:
chmod +x update.sh
./update.shWindows (PowerShell):
.\update.ps1docker compose down
docker compose pull
docker compose up -dBy default, Logarr uses the :latest tag. To pin to a specific version (recommended for production):
# In your .env file or docker-compose.yml
LOGARR_VERSION=0.5.5Or set it per-run:
LOGARR_VERSION=0.5.5 docker compose up -dIf you prefer to build from source instead of using pre-built images:
# Set environment variable to enable local builds
LOGARR_BUILD_LOCALLY=1
# Or build manually
docker compose build --no-cache
docker compose up -dLogarr images are published to:
- GitHub Container Registry:
ghcr.io/itz4blitz/logarr-backendandghcr.io/itz4blitz/logarr-frontend - Docker Hub:
itz4blitz/logarr-backendanditz4blitz/logarr-frontend
To use Docker Hub instead of GHCR:
LOGARR_IMAGE_REGISTRY=docker.io/itz4blitzgit checkout -b feature/your-feature
# Make changes
git commit -m 'Add your feature'
git push origin feature/your-feature
# Open a Pull RequestGuidelines: TypeScript strict mode, ESLint + Prettier, tests for new features.
Logarr has comprehensive test coverage using Vitest.
pnpm test # Run all tests
pnpm test:coverage # Run with coverage report
pnpm test:e2e # Run Playwright E2E tests| Package | Description |
|---|---|
@logarr/backend |
Backend services and controllers |
frontend |
React components, hooks, and utilities |
@logarr/core |
Core HTTP utilities |
@logarr/provider-arr |
*arr application log parser |
@logarr/provider-emby |
Emby log parser |
@logarr/provider-readarr |
Readarr provider |
@logarr/provider-whisparr |
Whisparr provider |
@logarr/provider-lidarr |
Lidarr provider |
@logarr/provider-seerr |
Seerr provider and log parser |
@logarr/provider-bazarr |
Bazarr provider |
@logarr/provider-qbittorrent |
qBittorrent provider |
Coverage thresholds are enforced at 80% for statements, branches, functions, and lines.
This project is under active development. Check out our GitHub Discussions for feature requests, ideas, and community conversations.
MIT — see LICENSE for details.