unmove

unmove

Docker app from Yusseiin's Repository

Overview

File transfer application with TVDB/TMDB integration for organizing media files. Identify TV series and movies, rename them properly, and move them to your media library. This template uses a single /data mount for INSTANT file moves (no copy+delete). Your downloads and media folders should be subdirectories of the Data Path. NOTE: Instant moves only work if downloads and media are on the SAME physical disk. If they are on different disks, the app will automatically fall back to copy+delete. To guarantee instant moves, mount a specific disk (e.g., /mnt/disk1) instead of /mnt/user.

UnMove Logo
UnMove

A self-hosted web application to organize your media library by identifying files using TVDB or TMDB and moving them with proper naming conventions

Docker Pulls License Stars Last Commit
Next.js React Tailwind Docker Unraid

FeaturesScreenshotsInstallationConfigurationDevelopment


Features

  • File Browser - Browse your downloads folder with parsed information (title, year, season, episode)
  • TVDB & TMDB Integration - Search and identify movies/TV shows using TVDB or TMDB APIs
  • Auto-Match - Automatically matches files to search results based on filename similarity
  • Batch Processing - Identify and move multiple files at once
  • Multiple TV Series - Handle episodes from different series in a single workflow
  • Smart Renaming - Automatically renames files following media server conventions (Plex/Jellyfin/Emby compatible)
  • Plex Integration - Trigger Plex library refresh directly from the app after moving files
  • Configurable Paths - Set custom download and media library paths

Screenshots

Homepage    Identify Media    Multi-Series

Installation

Docker (Recommended - Instant Moves)

For instant file moves (no copy+delete), mount downloads and media under the same parent directory:

docker run -d \
  --name unmove \
  -p 3000:3000 \
  -e PUID=99 \
  -e PGID=100 \
  -v /mnt/user:/data \
  -v /path/to/config:/config \
  -e DOWNLOAD_PATH=/data/downloads \
  -e MEDIA_PATH=/data/media \
  yusseiin/unmove:latest

Why? When downloads and media are on the same Docker volume, moving files is instant (just a rename). With separate volumes, Docker must copy the file then delete it.

Docker Compose (Recommended - Instant Moves)

version: "3.8"
services:
  unmove:
    image: yusseiin/unmove:latest
    container_name: unmove
    ports:
      - "3000:3000"
    environment:
      - PUID=99
      - PGID=100
      - DOWNLOAD_PATH=/data/downloads
      - MEDIA_PATH=/data/media
      # Optional: Plex integration
      - PLEX_URL=http://192.168.1.100:32400
      - PLEX_TOKEN=your-plex-token
    volumes:
      - /mnt/user:/data          # Single mount for instant moves
      - /path/to/config:/config
    restart: unless-stopped

Docker (Legacy - Separate Volumes)

If you prefer separate volume mounts (moves will copy+delete instead of instant):

docker run -d \
  --name unmove \
  -p 3000:3000 \
  -e PUID=99 \
  -e PGID=100 \
  -v /path/to/downloads:/downloads \
  -v /path/to/media:/media \
  -v /path/to/config:/config \
  -e DOWNLOAD_PATH=/downloads \
  -e MEDIA_PATH=/media \
  yusseiin/unmove:latest

Unraid

Available in Community Applications. Search for "unmove" or install manually using the Docker Hub image yusseiin/unmove:latest.

For instant moves on Unraid, use the recommended configuration that mounts /mnt/user as a single volume.

⚠️ Important Note about Instant Moves on Unraid

Even with a single Docker volume mount, instant moves will only work if both the downloads and media folders are on the same physical disk. Unraid's /mnt/user is a virtual filesystem (shfs/fuse) that spans multiple disks. If your downloads are on disk1 and media is on disk2, the system must copy+delete the file regardless of the Docker configuration.

To ensure instant moves:

  • Configure both shares (downloads and media) to use the same disk in Unraid's share settings, OR
  • Mount a specific disk directly: -v /mnt/disk1:/data instead of /mnt/user:/data

If your files are on different physical disks, the application will automatically fall back to copy+delete (which is slower but works correctly).

Configuration

Environment Variables

Variable Default Description
PUID 99 User ID for file permissions
PGID 100 Group ID for file permissions
DOWNLOAD_PATH /data/downloads Path to downloads inside container
MEDIA_PATH /data/media Path to media library inside container
PLEX_URL - Plex server URL (e.g., http://192.168.1.100:32400)
PLEX_TOKEN - Plex authentication token (how to get it)

Volumes

Recommended (Instant Moves):

Container Path Description
/data Parent directory containing both downloads and media (enables instant moves)
/config Configuration storage

With DOWNLOAD_PATH=/data/downloads and MEDIA_PATH=/data/media

Legacy (Separate Volumes):

Container Path Description
/downloads Your downloads folder (source)
/media Your media library (destination)
/config Configuration storage

With DOWNLOAD_PATH=/downloads and MEDIA_PATH=/media

API Keys

You can use either TVDB, TMDB, or both as metadata providers. Configure your preferred provider in the application settings.

TVDB API Key

  1. Create a free account at thetvdb.com
  2. Go to API Information and generate an API key
  3. Set the TVDB_API_KEY environment variable

TMDB API Key

  1. Create a free account at themoviedb.org
  2. Go to API Settings and request an API key
  3. Set the TMDB_API_KEY environment variable

Plex Integration

UnMove can trigger Plex library refreshes after moving files, so Plex immediately picks up your newly organized media.

Setup

  1. Get your Plex authentication token (instructions)
  2. Set the environment variables:
    • PLEX_URL: Your Plex server URL (e.g., http://192.168.1.100:32400)
    • PLEX_TOKEN: Your Plex authentication token

Usage

Once configured, click the Plex icon in the top navigation bar to:

  • View all your Plex library sections
  • Refresh individual libraries or all libraries at once

Application Settings

Settings are accessible via the gear icon in the top-right corner of the interface and are stored in /config/unmove-config.json.

Setting Default Description
Language en Interface language and folder naming. Options: en (English), it (Italian). Affects season folder names (e.g., "Season 01" vs "Stagione 01")
Series Metadata Provider tvdb Metadata provider for TV series. Options: tvdb (TVDB), tmdb (TMDB). Can be switched per-search in the identify dialogs
Movies Metadata Provider tmdb Metadata provider for movies. Options: tvdb (TVDB), tmdb (TMDB). Can be switched per-search in the identify dialogs
Series Base Folders [] List of base folders for TV series. Each folder has a name and preserveQualityInfo setting to keep quality/encoding info in filenames
Movies Base Folders [] List of base folders for movies. Each folder has a name and preserveQualityInfo setting to keep quality/encoding info in filenames
Movie Folder Structure name How movie files are organized. Options: name (Movie Name (Year)/Movie.mkv), year (Year/Movie.mkv), or none (Movie.mkv directly in base folder)

Example unmove-config.json

{
  "language": "en",
  "seriesMetadataProvider": "tvdb",
  "moviesMetadataProvider": "tmdb",
  "seriesBaseFolders": [
    { "name": "TV Series", "preserveQualityInfo": true },
    { "name": "Anime", "preserveQualityInfo": false }
  ],
  "moviesBaseFolders": [
    { "name": "Movies", "preserveQualityInfo": false },
    { "name": "4K Movies", "preserveQualityInfo": true }
  ],
  "movieFolderStructure": "name"
}

Naming Examples

TV Series with preserveQualityInfo: true on the folder:

/media/TV Series/Breaking Bad (2008)/Season 01/Breaking Bad - S01E01 - Pilot [1080p.x264].mkv

TV Series with preserveQualityInfo: false on the folder:

/media/Anime/Naruto (2002)/Season 01/Naruto - S01E01 - Enter Naruto Uzumaki.mkv

Movies with preserveQualityInfo: true and movieFolderStructure: "name":

/media/4K Movies/Avatar - The Way of Water (2022)/Avatar - The Way of Water (2022) [2160p.x265].mkv

Movies with preserveQualityInfo: false and movieFolderStructure: "year":

/media/Movies/2022/Avatar - The Way of Water (2022).mkv

Movies with movieFolderStructure: "none" (no subfolder):

/media/Movies/Avatar - The Way of Water (2022).mkv

Usage

  1. Open the web interface at http://your-server:3000
  2. Click the gear icon and select your preference
  3. Browse your downloads folder
  4. Select files to identify
  5. Use "Identify" for single files or "Batch Identify" for multiple files
  6. Review the matches and move files to your media library

Development

Prerequisites

  • Node.js 22+
  • pnpm

Setup

# Clone the repository
git clone https://github.com/yusseiin/unmove.git
cd unmove

# Install dependencies
pnpm install

# Set environment variables
cp .env.example .env.local
# Edit .env.local with your paths

# Run development server
pnpm dev

Open http://localhost:3000 to view the app.

Building

# Build for production
pnpm build

# Start production server
pnpm start

Docker Build

docker build --build-arg NEXT_PUBLIC_VERSION=0.0.1 -t unmove .

Tech Stack

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

Acknowledgments

  • TVDB for providing the media database API
  • TMDB for providing the media database API
  • Unraid community for testing and feedback

Install Unmove on Unraid in a few clicks.

Find Unmove in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Unmove Review the template variables and paths Click Install

Download Statistics

2,765
Total Downloads

Related apps

Explore more like this

Explore all

Details

Repository
yusseiin/unmove:latest
Last Updated2026-05-23
First Seen2026-01-05

Runtime arguments

Web UI
http://[IP]:[PORT:3000]
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

Web interface port

Target
3000
Default
3213
Value
3213
Data PathPathrw

Parent directory containing downloads and media folders. Using a single mount enables INSTANT file moves instead of copy+delete.

Target
/data
Default
/mnt/user
Value
/mnt/user
Config PathPathrw

Path to store application config

Target
/config
Default
/mnt/user/appdata/unmove
Value
/mnt/user/appdata/unmove
DOWNLOAD_PATHVariable

Path to downloads folder inside container (relative to Data Path /data/)

Default
/data/downloads
Value
/data/downloads
MEDIA_PATHVariable

Path to media folder inside container (relative to Data Path /data/)

Default
/data/media
Value
/data/media
CONFIG_PATHVariable

Internal config path (don't change)

Default
/config
Value
/config
TVDB API KeyVariable

Your TVDB API key (get one at https://thetvdb.com/api-information)

Target
TVDB_API_KEY
TMDB API KeyVariable

Your TMDB API key (get one at https://developer.themoviedb.org/docs/getting-started)

Target
TMDB_API_KEY
Plex URLVariable

Your Plex server URL (e.g., http://192.168.1.100:32400)

Target
PLEX_URL
Plex TokenVariable

Your Plex authentication token (see https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/)

Target
PLEX_TOKEN
PUIDVariable

User ID for file permissions (99 = nobody on Unraid)

Default
99
Value
99
PGIDVariable

Group ID for file permissions (100 = users on Unraid)

Default
100
Value
100