Skip to content

Discord bot for requesting movies/TV and receiving notifications when items are added to your media server.

License

Notifications You must be signed in to change notification settings

nairdahh/Anchorr

Repository files navigation

Anchorr logo-text

A helpful Discord bot for requesting media via Jellyseerr and receiving Jellyfin notifications for new content in your library.

FeaturesQuick StartConfigurationCommandsDockerChangelogContributingDiscord

💬 Discord Server

Before anything else, I invite you to join my Discord server for faster assistance, discussions, and important information such as an organized list of known bugs that are currently being tracked or planned features scheduled for future releases!

This helps avoid duplicate requests and keeps everyone informed about what's coming next!

Join Here:

I also have a dedicated channel on the r/JellyfinCommunity server (if you are already a member): Join me here

🌟 Features

  • 🔍 Media Search: Search for movies and TV shows with /search command - you can then request it later within the message embed
  • 🔥 Trending Content: Browse weekly trending movies and TV shows with /trending command
  • 📤 One-Click Requests: Directly request media to Jellyseerr with /request command
  • 📺 Smart TV Handling: Choose specific seasons when searching for TV series using /search, or request all seasons at once with /request
  • 🎚️ Server and Quality: Choose which Radarr or Sonarr instance to request to, and which quality profile
  • 🚫 Duplicate Detection: Automatically check if content already exists in Jellyseerr before allowing requests
  • 🏷️ Tag Selection: Select Radarr/Sonarr tags when requesting media for better organization and categorization
  • 📬 Jellyfin Notifications: Automatic Discord notifications when new media is added to your library
  • 📚 Library Filtering and Mapping: Choose which Jellyfin libraries send notifications and to which Discord channel
  • 👤 User Mapping: Map Discord users to Jellyseerr accounts so requests appear from the correct user
  • 🔐 Role-Based Permissions: Control which users can use bot commands via Discord roles (allowlist/blocklist)
  • 🔔 Private Notifications: Optional PM when your requested content becomes available on Jellyfin
  • 👻 Ephemeral Mode: Make bot responses visible only to the command user
  • 🌍 Multi-Language Support: Fully translated interface with automatic language detection
  • 🎨 Rich Embeds: Beautiful, detailed embeds with:
    • Movie/TV show posters and backdrops
    • Director/Creator information
    • IMDb ratings and links
    • Runtime, genres, and synopsis
    • Quick action buttons (IMDb, Letterboxd, Watch Now)
  • 🔗 Autocomplete Support: Intelligent autocomplete for search queries with rich metadata
  • ⚙️ Web Dashboard: User-friendly web interface for configuration with auto-detection

📋 Prerequisites

Before getting started, ensure you have:

  • ✅ A running Jellyfin server
  • ✅ A running Jellyseerr instance
  • ✅ A Discord account with a server where you have admin privileges
  • ✅ API keys from:
  • Node.js v18+ or Docker & Docker Compose

🚀 Quick Start

1️⃣ Clone and Install

git clone https://github.com/nairdahh/anchorr.git
cd anchorr
npm install

2️⃣ Start the Application

node app.js

The web dashboard will be available at http://localhost:8282

3️⃣ Configure via Web Dashboard

  1. Open http://localhost:8282 in your browser
  2. Fill in your Discord Bot credentials, API keys, and service URLs
  3. Click the test buttons to verify connections
  4. Start the bot using the dashboard button

4️⃣ Invite Bot to Discord

Generate an OAuth2 URL in Discord Developer Portal:

  • OAuth2 → URL Generator
  • Scopes: bot, applications.commands
  • Permissions: Send Messages, Embed Links
  • Copy generated URL and open in browser

5️⃣ Configure Jellyfin Webhook

In Jellyfin Dashboard → Webhooks:

  1. Click + to add new Discord webhook
  2. Enter URL: http://<bot-host>:<port>/jellyfin-webhook
  3. Example: http://192.168.1.100:8282/jellyfin-webhook
  4. Save and you're done! 🎉

⚙️ Configuration

Configuration is managed through a web dashboard at http://localhost:8282/. However, you can also configure it programmatically.

🐳 Docker Deployment

Deploying with Docker is the recommended method for running Anchorr. You can use Docker Compose (the easiest way) or run the container manually.

Method 1: Docker Compose

Option A: Clone the full repository

git clone https://github.com/nairdahh/anchorr.git
cd anchorr
docker compose up -d

Option B: Download only docker-compose.yml

mkdir anchorr && cd anchorr
wget https://raw.githubusercontent.com/nairdahh/anchorr/main/docker-compose.yml
# OR with curl: curl -O https://raw.githubusercontent.com/nairdahh/anchorr/main/docker-compose.yml
docker compose up -d

Access: Open browser at http://<your-server-ip>:8282 (e.g., http://192.168.1.100:8282 or http://localhost:8282)

Method 2: Manual Docker Run

# Run container (using port 8282)
docker run -d \
  --name anchorr \
  --restart unless-stopped \
  -p 8282:8282 \
  -v ./anchorr-data:/usr/src/app/config \
  -e WEBHOOK_PORT=8282 \
  -e NODE_ENV=production \
  nairdah/anchorr:latest

Access: Open browser at http://<your-server-ip>:8282

Important parameters:

  • -p 8282:8282 - Port mapping (host:container). First number is the port on your host.
  • -v ./anchorr-data:/usr/src/app/config - Persistent config storage (saves to ./anchorr-data/config.json)
  • --restart unless-stopped - Auto-restart on failure
  • -e WEBHOOK_PORT=8282 - Web dashboard port
  • -e NODE_ENV=production - Production mode

Example for Unraid: When adding the container in Unraid Community Apps, add this volume mapping in the "Path" section:

  • Container Path: /usr/src/app/config
  • Host Path: /mnt/user/appdata/anchorr
  • Access Mode: RW (Read-Write)

Method 3: Install Directly from Docker Hub

If you use Docker Desktop or other GUI tools (Portainer, Unraid, etc.), you can install directly from Docker Hub without cloning the repository:

  1. Open Docker Desktop → Images (or search in your GUI)
  2. Search for nairdah/anchorr or just anchorr
  3. Pull the latest image
  4. Create a new container with these settings:
    • Port: 8282:8282 (or change as needed)
    • Volume: ./anchorr-data/usr/src/app/config
    • Environment variables:
      • WEBHOOK_PORT=8282
      • NODE_ENV=production
    • Restart policy: Unless stopped

Using a Different Port

If port 8282 is already in use:

Docker Compose: Edit docker-compose.yml

ports:
  - "9000:8282" # Change 9000 to your desired port

Docker Run: Change the first port number

docker run -d \
  --name anchorr \
  --restart unless-stopped \
  -p 9000:8282 \              # Use port 9000 on host
  -v ./anchorr-data:/usr/src/app/config \
  -e WEBHOOK_PORT=8282 \
  -e NODE_ENV=production \
  nairdah/anchorr:latest

Then access at: http://localhost:9000

🔄 Updates

Node.js Installation

cd anchorr
git pull origin main
npm install
# Restart the application (Ctrl+C, then run: node app.js)

Docker Compose

cd anchorr
git pull origin main
docker compose up -d --pull always

Docker Manual Run

docker pull nairdah/anchorr:latest
docker stop anchorr
docker rm anchorr
docker run -d \
  --name anchorr \
  --restart unless-stopped \
  -p 8282:8282 \
  -v ./anchorr-data:/usr/src/app/config \
  -e WEBHOOK_PORT=8282 \
  -e NODE_ENV=production \
  nairdah/anchorr:latest

📸 Screenshots (a bit outdated for now)

Feature Screenshot
Autocomplete Autocomplete
Search Results Search
Request Confirmation Request
Jellyfin Notification New Media

🤝 Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.

🌍 Adding Translations

Help make Anchorr accessible to more users by contributing translations! The system now automatically detects and loads new languages.

Quick start:

npm run create-translation es "Español" "Your Name"

See TRANSLATION_GUIDE.md for detailed instructions.

👥 Contributors

A huge thank you to all the amazing people who have contributed to making Anchorr better! 🎉


nairdahh

lucideds

retardgerman

TheColorman

IPvNick

whoopsi-daisy

📄 License

This project is released under the Unlicense — it's public domain. Do anything you want with the code!

About

Discord bot for requesting movies/TV and receiving notifications when items are added to your media server.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published

Contributors 8