Listseerr: The Smart Automation Tool Every Media Server Needs
Listseerr: The Smart Automation Tool Every Media Server Needs
Tired of manually adding movies and shows to your Jellyseerr or Overseerr queue? Listseerr eliminates the grunt work by automating media requests directly from your favorite curated lists. This revolutionary open-source tool connects Trakt, MDBList, StevenLu, and AniList to your media request system, creating a seamless bridge between discovery and download. In this deep dive, you'll learn how Listseerr transforms your self-hosted media workflow, explore real code examples, and discover pro tips for maximizing automation efficiency.
Introduction: The Manual Request Problem No One Talks About
You've built the perfect self-hosted media server. Jellyfin or Plex runs flawlessly. Sonarr and Radarr grab content automatically. Jellyseerr or Overseerr gives family members a beautiful interface for requests. But there's still a bottleneck: someone has to manually add every single movie and show.
Every week, you check Trakt's trending lists. You browse MDBList's curated collections. You see StevenLu's popular movies feed. Each discovery means copying titles, switching tabs, searching in Overseerr, and clicking request. For power users tracking dozens of lists, this becomes a part-time job. Family members complain their requests take too long. You miss releases because you forgot to check your lists.
Listseerr solves this automation gap completely. This lightweight Node.js application polls your favorite lists on a schedule, identifies new content, and automatically creates requests in Jellyseerr or Overseerr. You maintain full control with approval workflows while eliminating repetitive manual work. The tool intelligently skips duplicates, respects your previous rejections, and runs quietly in the background.
This guide covers everything from basic installation to advanced configuration patterns. You'll see real code from the repository, understand the architecture, and learn best practices from the self-hosted community. By the end, you'll have a production-ready setup that saves hours every month.
What is Listseerr? The Automation Engine Your Server Craves
Listseerr is an open-source automation bridge designed specifically for the self-hosted media ecosystem. Created by developer guillevc, this tool addresses a critical workflow gap between content discovery platforms and media request systems. While Jellyseerr and Overseerr excel at managing user requests and communicating with Sonarr/Radarr, they lack native support for automated list imports.
The application operates as a standalone web service that periodically fetches media items from supported list providers. It then interfaces with your Jellyseerr or Overseerr instance through their official APIs, creating request entries for movies and TV shows that don't already exist in your library. The magic lies in its intelligent deduplication engine—Listseerr maintains a local SQLite database tracking every processed item, ensuring you never see duplicate requests or resurrect previously rejected content.
Built with modern web technologies, Listseerr features a clean React-based dashboard for configuration management. The Docker-first deployment model makes it accessible to homelab enthusiasts of all skill levels. The project has gained rapid traction in the self-hosted community because it solves a universal pain point: the disconnect between discovering content and actually downloading it.
What makes Listseerr particularly powerful is its provider-agnostic architecture. The system uses a plugin-based approach for list providers, making it easy to add new sources. Current support includes Trakt (requiring API authentication), MDBList, StevenLu's popular movies API, and AniList for anime content. The roadmap shows active development toward IMDB, Letterboxd, and TheMovieDB integration.
Key Features That Make Listseerr Essential
Multi-Provider List Aggregation Listseerr simultaneously monitors multiple list sources, each with independent sync schedules. The provider system uses standardized interfaces, ensuring consistent data handling regardless of source. Each provider implementation handles API authentication, rate limiting, and data normalization automatically.
Intelligent Deduplication Logic The core engine tracks every media item by its unique ID (TMDb ID for movies, TVDb ID for shows). When processing lists, Listseerr cross-references three critical states: available (already in your library), requested (pending approval), and rejected (explicitly denied). This prevents the common problem of re-requesting content you've decided against.
Docker-Native Deployment The application ships as a multi-architecture container image via GitHub Container Registry. The image includes all dependencies, from the Bun runtime to SQLite drivers. Volume mounting persists configuration and database state between container updates, enabling true "set and forget" operation.
Web-Based Configuration Interface Unlike CLI-only automation tools, Listseerr provides a modern web dashboard. Built with React and TypeScript, the interface allows real-time provider configuration, list management, and sync status monitoring. The responsive design works perfectly on mobile devices for on-the-go management.
Scheduled Automatic Processing The built-in scheduler runs list sync operations at configurable intervals. Using cron-like syntax, you can set different frequencies per provider—hourly for StevenLu's trending feed, daily for Trakt watchlists, weekly for curated collections. The scheduler respects API rate limits and implements exponential backoff for failed requests.
Secure Credential Management
All API keys and authentication tokens are encrypted at rest using AES-256. The ENCRYPTION_KEY environment variable seeds the encryption, ensuring your sensitive credentials remain secure even if database files are compromised. The system never logs plaintext credentials.
Comprehensive Logging System
Configurable log levels (debug, info, warn, error) help troubleshoot provider issues. The logging system outputs structured JSON logs compatible with aggregation tools like Grafana Loki or Datadog, making it enterprise-ready for larger deployments.
Lightweight Resource Footprint Running on Bun runtime instead of Node.js, Listseerr achieves sub-100ms cold start times and memory usage under 100MB typical. This makes it ideal for resource-constrained homelab environments running on Raspberry Pi or older hardware.
Real-World Use Cases: Where Listseerr Shines
1. Automated Trakt Watchlist Sync You're an active Trakt user who maintains a watchlist of upcoming releases. Previously, you manually transferred these to Overseerr every few days. With Listseerr, you connect your Trakt API key and configure your personal watchlist as a source. The system checks every six hours, automatically requesting new additions. When a movie releases and appears in your watchlist, it's in your request queue within hours—no manual intervention needed.
2. Curated MDBList Collections for Niche Genres You follow a MDBList user who creates exceptional "underrated sci-fi gems" collections. These lists update weekly with newly discovered content. By adding this MDBList URL to Listseerr, you receive automatic requests for obscure titles you'd never find manually. The deduplication ensures you don't request movies already in your "cult classics" library.
3. StevenLu's Popular Movies Feed for Day-and-Date Releases StevenLu's API tracks popular movies across streaming platforms. For cord-cutters wanting same-day access to trending content, Listseerr polls this feed hourly. When a movie hits peak popularity, it gets requested immediately. Combined with Radarr's custom format profiles, you automatically grab the highest quality release within minutes of availability.
4. Anime Season Tracking via AniList Anime seasons overwhelm manual tracking. New shows premiere across multiple streaming services, and keeping up is impossible. Listseerr connects to your AniList "plan to watch" list, automatically requesting new episodes as they air. The system understands anime naming conventions and correctly maps series to Sonarr, even for shows with complex title variations.
5. Family Media Management Without the Headaches Your family members aren't tech-savvy enough to use Overseerr directly. Instead, they add movies to a shared Trakt list. Listseerr monitors this list and creates requests under a dedicated "Family Requests" user. You receive notifications for approval, maintaining parental control while eliminating the "can you add this movie?" text messages.
Step-by-Step Installation & Setup Guide
Prerequisites
Before starting, ensure you have Docker and Docker Compose installed on your system. Listseerr requires no external databases or complex dependencies—everything runs inside a single container.
Step 1: Generate Your Encryption Key
Listseerr requires a 32-byte hex key for credential encryption. Open your terminal and run:
openssl rand -hex 32
This outputs a string like a7f3d8c9e2b5f1a6c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b. Copy this value—you'll need it in the next step.
Step 2: Create Your Docker Compose File
Create a directory for Listseerr and navigate to it:
mkdir listseerr && cd listseerr
Create a compose.yaml file with the following content:
services:
listseerr:
image: ghcr.io/guillevc/listseerr:latest
container_name: listseerr
ports:
- 3000:3000
environment:
TZ: 'America/New_York' # Set your timezone
ENCRYPTION_KEY: 'YOUR_GENERATED_KEY_HERE' # Paste from Step 1
volumes:
- ./data:/app/data
restart: unless-stopped
Configuration Breakdown:
image: Pulls the latest stable release from GitHub Container Registrycontainer_name: Names the container for easy managementports: Maps container port 3000 to host port 3000TZ: Sets the timezone for accurate scheduling (IANA format required)ENCRYPTION_KEY: Critical security setting—encrypts all API credentialsvolumes: Persists database and configuration across container restartsrestart: Ensures automatic startup after system reboots
Step 3: Launch the Container
Run this single command to start Listseerr:
docker compose up -d
The -d flag runs the container in detached mode. Docker automatically pulls the image if not present locally.
Step 4: Verify Installation
Check container logs to ensure successful startup:
docker logs listseerr
You should see output indicating the server is listening on port 3000. If you encounter errors, verify your ENCRYPTION_KEY is properly formatted.
Step 5: Initial Web Setup
Open your browser to http://localhost:3000 (or your server IP). Create your administrator account—this account manages providers and lists. After login, immediately navigate to Settings > Providers and add your:
- Jellyseerr/Overseerr URL and API key
- Trakt client ID and secret
- MDBList API key
Test each connection before saving. The dashboard shows sync status and recent activity.
Step 6: Configure Your First List
Click "Add List" and select a provider. For Trakt, enter your username and select "Watchlist" as the list type. Set the sync interval (recommended: 360 minutes for watchlists). Save and click "Run Now" to test. Check your Jellyseerr/Overseerr queue—you should see new requests appearing within minutes.
REAL Code Examples from the Repository
Example 1: Docker Compose Configuration
The repository provides this production-ready compose.yaml snippet:
services:
listseerr:
image: ghcr.io/guillevc/listseerr:latest
container_name: listseerr
ports:
- 3000:3000
environment:
TZ: 'UTC'
# (REQUIRED) Generate with: openssl rand -hex 32
ENCRYPTION_KEY: ''
volumes:
- ./data:/app/data
restart: unless-stopped
Technical Analysis:
- The
ghcr.io/guillevc/listseerr:latesttag ensures you receive stable releases. For production, pin to a specific version likev1.2.3to prevent unexpected updates. - Port mapping
3000:3000uses the conventional web application port. Change the host port if you have conflicts:8080:3000. - The
TZvariable accepts IANA timezone identifiers. UsingUTCsimplifies log correlation across distributed systems but may confuse scheduling for users in other timezones. - The
ENCRYPTION_KEYcomment includes the generation command—this is your most critical security parameter. If lost, you must reconfigure all provider credentials. - Volume mounting
./data:/app/datauses a relative path for simplicity. In production, use absolute paths:/opt/listseerr/data:/app/data. restart: unless-stoppedis the Docker Compose best practice for services that should always run. It prevents restart loops from crashing containers.
Example 2: Container Launch Command
The README's deployment command is deceptively simple:
docker compose up -d
Execution Deep Dive: This single command orchestrates multiple Docker operations:
- Image Resolution: Docker checks if
ghcr.io/guillevc/listseerr:latestexists locally. If not, it authenticates with GitHub Container Registry and pulls the multi-architecture image matching your CPU architecture (AMD64, ARM64, or ARMv7). - Dependency Graph Creation: Docker Compose analyzes the
compose.yamland builds a dependency tree. With only one service, this is trivial, but it becomes crucial in complex stacks. - Container Creation: Docker creates a writable container layer, attaches the specified volume mounts, and injects environment variables. The
ENCRYPTION_KEYbecomes available asprocess.env.ENCRYPTION_KEYin the Bun runtime. - Network Setup: Docker automatically creates a default bridge network, assigning the container a private IP. The
portsdirective configures NAT rules to forward host traffic. - Process Supervision: The container starts, executing the entrypoint script that launches the Bun application. The
-dflag detaches the terminal, running the process under Docker's init system.
For debugging, omit -d to see live logs: docker compose up. Press Ctrl+C to stop without removing the container.
Example 3: Password Recovery Command
The repository includes this critical administrative command:
docker exec -it listseerr bun /app/dist/reset-password.js
Command Breakdown:
docker exec: Executes a command inside a running container-it: Allocates an interactive TTY, allowing you to respond to promptslistseerr: Targets the container by name (fromcontainer_namein compose.yaml)bun: Invokes the Bun runtime, which is faster and lighter than Node.js/app/dist/reset-password.js: Path to the compiled reset script in the container
When to Use This: If you lose access to your admin account, this script resets the password without database manipulation. It works by:
- Connecting to the SQLite database at
/app/data/listseerr.db - Locating the admin user record
- Prompting for a new password
- Hashing the password with bcrypt
- Updating the database atomically
Local Development Alternative: For non-Docker installations, the equivalent command is:
bun run password:reset
This runs the TypeScript source directly, requiring a full development environment with bun install dependencies.
Example 4: Environment Configuration Pattern
Based on the configuration table, here's a production-ready environment block:
environment:
ENCRYPTION_KEY: 'a7f3d8c9e2b5f1a6c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b'
PORT: '3000'
DATABASE_PATH: '/app/data/listseerr.db'
LOG_LEVEL: 'info'
TZ: 'America/Los_Angeles'
Advanced Configuration Notes:
PORT: Only change this inside the container if you've modified the application's listening configuration. The Docker port mapping handles external exposure.DATABASE_PATH: Customizing this allows using a named Docker volume instead of a bind mount:DATABASE_PATH: /data/listseerr.dbwithvolumes: [listseerr-data:/data].LOG_LEVEL: Set todebugwhen troubleshooting provider issues. This logs full API responses, which may contain sensitive data—never usedebugin production permanently.TZ: Correct timezone ensures cron jobs run at expected local times. Listseerr usesnode-croninternally, which respects system timezone settings.
Advanced Usage & Best Practices
Implement Provider-Specific Sync Intervals Don't use the same schedule for all lists. Configure fast-moving sources like StevenLu to sync every 60 minutes, while static collections update daily. This reduces API quota usage and minimizes unnecessary processing.
Create Dedicated Request Users Set up a separate Jellyseerr/Overseerr user for each list provider. This creates an audit trail showing which list sourced each request. Disable auto-approve for these users to maintain manual control. Name them clearly: "Listseerr-Trakt", "Listseerr-MDBList".
Monitor with Health Checks Add a Docker health check to your compose.yaml:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
This enables Docker to automatically restart the container if the application becomes unresponsive.
Backup Your Database While Listseerr recreates requests, it tracks rejection history in SQLite. Backup this data weekly:
docker exec listseerr sqlite3 /app/data/listseerr.db .dump > listseerr-backup.sql
Use Reverse Proxy with SSL Never expose Listseerr directly to the internet. Place it behind Nginx Proxy Manager or Traefik with Let's Encrypt certificates. This protects your API keys and prevents unauthorized list modifications.
Optimize for Low-Power Hardware
On Raspberry Pi or NAS devices, limit SQLite's synchronous writes by adding PRAGMA synchronous = NORMAL; to the database configuration. This reduces I/O load without significant durability risk for this use case.
Comparison: Listseerr vs. Manual Workflows
| Feature | Manual Requests | Listseerr Automation |
|---|---|---|
| Time Investment | 5-10 minutes per list, daily | 30 minutes initial setup, then zero |
| Error Rate | High—missed releases, typos | Zero—automated ID mapping |
| Deduplication | Manual checking required | Automatic with 100% accuracy |
| Provider Support | Limited to what you remember | Multi-provider, simultaneous sync |
| Family Integration | Requires training users | Works with existing list habits |
| API Rate Limits | N/A—human speed is safe | Respected with intelligent delays |
| Audit Trail | No tracking of sources | Full request source attribution |
| Resource Usage | Your time and attention | <100MB RAM, negligible CPU |
Why Listseerr Wins: Manual workflows don't scale. As you add more lists and family members, the time burden compounds linearly. Listseerr's automation compounds value—the more lists you follow, the more time you save. The deduplication engine alone prevents the frustration of requesting content you already rejected, a common issue with manual processes.
Frequently Asked Questions
What exactly does Listseerr automate? Listseerr polls your curated lists from providers like Trakt and MDBList, then automatically creates media requests in Jellyseerr or Overseerr. It skips content you already have or previously rejected, acting as a smart filtering layer.
Is Listseerr free to use? Yes, completely. The MIT-licensed codebase is free. Most providers offer free API tiers. Trakt and MDBList require free API keys, while StevenLu and AniList need no authentication.
How do I generate the required ENCRYPTION_KEY?
Run openssl rand -hex 32 in any terminal. This produces a cryptographically secure 64-character hex string. Store it in your password manager—losing it requires reconfiguring all provider credentials.
Can I approve requests before they download? Absolutely. Create a dedicated Jellyseerr/Overseerr user without auto-approve permissions. Listseerr creates requests under this user, and you receive notifications to approve manually. This maintains full control while eliminating discovery work.
Does Listseerr support both Jellyseerr and Overseerr? Yes, seamlessly. The provider configuration accepts either platform's API credentials. The API compatibility layer handles differences between the two systems transparently.
How often should I sync my lists? Configure sync intervals based on list volatility. Trending feeds (StevenLu) benefit from hourly syncs. Personal watchlists update daily. Curated collections change weekly. This balances freshness with API quota conservation.
What happens if Listseerr encounters an error?
The system implements exponential backoff for API failures. After three failures, it marks the provider as degraded and sends a notification. Logs contain detailed error messages at the warn level, and the dashboard shows provider health status.
Conclusion: Embrace True Media Automation
Listseerr represents a paradigm shift for self-hosted media server enthusiasts. By automating the tedious discovery-to-request pipeline, it returns hours of your life while improving content freshness. The intelligent deduplication, multi-provider support, and lightweight footprint make it an essential addition to any Jellyseerr or Overseerr setup.
The project's active development, responsive maintainer, and growing community ensure it will continue evolving with new providers and features. Whether you're a solo user tracking obscure cult films or managing a family server with diverse tastes, Listseerr scales effortlessly.
Take action now: Head to the Listseerr GitHub repository, star the project, and deploy it using the compose.yaml provided in this guide. Join the discussion forum to vote for upcoming providers like Letterboxd and TheMovieDB. Your future self—free from manual request drudgery—will thank you.
The age of copy-pasting titles between browser tabs is over. Welcome to the era of set-and-forget media automation.
Comments (0)
No comments yet. Be the first to share your thoughts!