wtwp

wtwp

Docker app from MrCorehh's Repository

Overview

What to Watch? Decide what to watch on your Plex server by swiping cards based on your group's preferences. Find a Movie or TV Show everyone wants to watch.

Image
GitHub Release Docker Pulls Discord

Decide what to watch on your Plex server by swiping cards based on your group's preferences.
Find a Movie or TV Show everyone wants to watch.
Self hosted with Docker. Available on the Unraid Community Apps store.





Main Features:

  • Modern and user friendly UI.
  • Quickly create or join a lobby as guest, or log in with Plex to filter out already watched items and integrate Watchlist.
  • Easy lobby joining via invite link or QR code.
  • Swipe with one or more friends.
  • Choose which libraries from your Plex server to include. Supports both Movies and TV Shows.
  • Optionally filter suggestions by Collections.
    Want to decide on which Christmas movie to watch? Select your Christmas collection and start a session!
  • Optionally start a session from your watchlist items.
  • Include or Exclude items based on Labels.
  • Users optionally set preferences for Genre, Era, Duration, Language and Minimum Rating to narrow down the suggestions. Tap once to prefer, twice to exclude.
  • Flip cards over for details, Swipe left for Nope and right for Yes.
  • Optionally watch Trailers streamed straight from your Plex server.
  • Use your own custom logo on the landing page.
  • Admin panel for Settings and a Session History tab.
  • Choose between Random or Fixed suggestion order.
  • Four Session Modes:
    • Classic: Swipe until you have a match liked by everyone.
    • Timed: Swipe for chosen amount of time and vote for the best matches. Includes a tie breaker.
    • Match Target: Swipe until chosen amount of matches are made and vote on them. Includes a tie breaker.
    • Timed + Target: Set both a duration and a match target. The session ends whichever happens first, then everyone votes on the collected matches. Includes a tie breaker.
  • Optionally limit who can create sessions: Plex users only and/or a session password.
  • Installable as PWA

Prerequisites

  • Docker and Docker Compose installed.
  • A running Plex server.
  • Suggested: Set up a reverse proxy for easy external access. (Make sure Websocket Support is enabled)

Quick Start

  1. Download the docker-compose.yml file from this repository. Edit the port, timezone and CORS_ORIGINS as needed.

[!NOTE] CORS_ORIGINS determines the allowed origins for accessing WTW
Add a comma-separated list of the allowed origins, e.g.:
e.g.: - CORS_ORIGINS=http://192.168.1.100:PORT,https://wtw.yourdomain.com

  1. Pull the latest image:
docker compose pull
  1. Start the container:
docker compose up -d

UNRAID

What to Watch on Plex is available on the Unraid Community Apps store as wtwp.
Click install and apply the default template.
Image

Make sure to add a CORS_ORIGINS environment variable.


Configuration

Plex Connection

  1. Access the app at http://localhost:3000. (or whichever port you mapped)
  2. Open the Admin Panel and set your Admin password.
  3. Enter your Plex http://IP:PORT and Plex Token
  4. Select your libraries ==> click on Save Settings ==> click on Refresh Cache and wait for the cache to be completed.

Allowed Domains

If you access this app through a custom domain or reverse proxy (e.g. wtw.mydomain.com), add it here. Only requests from allowed domains will be accepted. Equivalent to the CORS_ORIGINS environment variable, but managed at runtime without restarting the container. Setting either one is enough.

Optional Settings

  • Auto Refresh: Automatically refresh your cache at 3AM.
  • Custom Logo: Upload your custom logo to be used on the landing page.
  • Selection Limits: Choose how many Preferences and Exclusions users can set.
  • Question Stages: Enable or disable the questions individually. A disabled question is treated as if everyone answered "I don't mind", so it simply doesn't narrow the suggestions. Disabling all of them skips the questionnaire entirely and takes users straight from the lobby to swiping.
  • Minimum Rating question: When enabled, users pick a minimum rating (6+ to 8.5+) after the language question. It is compared against the rating source chosen in Rating Display (in Both mode an item passes if either rating qualifies). Unrated items are not removed.
  • Suggestion Order:
    • Random (suggestions appear randomly for each user).
    • Fixed (everyone gets the same suggestions in the same order).
  • Hard Filter Preferences: When enabled, preferred selections (green) strictly filter results: only matching items are suggested. When disabled, preferred items simply sort to the top of the deck.
  • Hard Filter Exclusions: When enabled, excluded selections (red) strictly filter results: excluded items are never suggested. When disabled, excluded items simply sort to the bottom of the deck.

[!NOTE] Preferences are seen just that. If user1 sets preference for comedy and user2 sets preference for action then the app will first try to find items with both genres, and otherwise suggests a mix of both.
Votes count. Every pick is weighed separately, so an item matching three people's preferences is suggested before one matching a single pick, and a genre three people picked outweighs a genre only one person picked. The same applies to every question (genre, era, runtime, language, minimum rating).
With Hard Filter Exclusions on, if a user marks horror in red, then no horror will be suggested at all. With it turned off, it will simply score items with horror lower and send them to the back of the deck.

  • Collections: Enable a collection picker for the host when creating a session. Only items from selected collections will be suggested.
  • Open in Plex Button: Enables a button on the match winner page to open the item in Plex. Only works by opening Plex in a browser tab.
  • Lobby QR Code: Display a QR code in the lobby for easy session joining.
  • Rating Display: Choose whether detail cards show Critic Rating, Audience Rating or both. The same choice decides which rating the Minimum Rating question compares against.
  • Trailers: Add a Watch Trailer button to cards. Trailers are streamed from your Plex server. Three modes:
    • Off (default): no trailer button.
    • On: trailer button on detail cards
    • Voting only: trailer button appears only on the voting cards at the end of Timed, Match Target and Timed + Target sessions — so swiping stays fast, but everyone can watch the trailers of the matched items before casting their final vote.

[!TIP] Missing trailers for certain items? Take a look at MTDP (Missing Trailer Downloader for Plex)

  • Label Restrictions: Include or Exclude items based on Plex labels.
  • Require Plex Server Access: Only allow users who log in with Plex and have access to your Plex server to use the app at all. Guests are blocked from creating and joining.
  • Session Creation: Limit who can start a session. Joining an existing session is unaffected. Two independent restrictions:
    • Plex users only: only users signed in with Plex oAuth who have access to your server can create a session.
    • Password protected: users need a password to create a session. This password is set here and is separate from the admin panel password.

[!NOTE] Both restrictions can be enabled at the same time, in which case a user needs to satisfy both to create a session.
Enabling Password protected without setting a password leaves creation open, so you can't lock yourself out.

  • PWA Customization: Customize the PWA name and icon.

🤝 Swiparr

WTWP was inspired by This post/Tweet.
Before starting development, I searched for existing options and came across Swiparr which already existed.
Swiparr at that point however did not support Plex so WTWP was created. The current version of Swiparr meanwhile does support Plex as well, but not all features are available in both apps. Here are the most important differences listed, so you can decide which is right for you:

(Optional) Feature WTWP Swiparr
Multi-media-server support ❌
(Plex only)
✅
(Jellyfin/Emby/Plex/TMDB)
TV show support ✅ ❌
Timed / Match-Target / Timed+Target session modes + tie-breaker ✅ ❌
Trailer playback ✅ ❌
Plex oAuth login guard ✅ ❌
User Watched-items auto-exclusion ✅ ❌
Group preference questionnaire filters (genre/era/runtime/language/minimum rating) ✅ ❌
Plex Label filters ✅ ❌
Streaming-availability ("where to watch") filter ❌ ✅
Sort by Trending / Popular ❌ ✅
Customizable (logo + PWA name and icon) ✅ ❌
Suggest from Watchlist and/or Collections ✅ ❌
Suggest items not owned in library ❌ ✅
Serverless deployment ❌
(self hosted only)
✅
(swiparr.com)

Feature sets evolve on both sides — please open an issue if anything here is out of date.


🩺 Troubleshooting Common Issues:

❌ Clients keep waiting on other users/other users are stuck on previous screen:

When you refresh the page, you'll most likely advance. This means your connection doesn't have websocket support.
If you are behind a reverse proxy, you need to enable websocket support. Nginx Example

❌ I can't start a session/ "No Media Found":

You first need to build a cache in settings. See step 4 above. Don't forget to click 'Save Settings' after connecting to Plex before refreshing cache.

❌ I get a blank page when accessing the webUI:

You need to add your hostname/ip to CORS_ORIGINS in the docker compose.


⚠️ Do you Need Help or have Feedback?

❤️ Support the Project

If you like this project, please ⭐ star the repository and share it with the community!


"Buy Me A Coffee"

Download Statistics

38,372
Total Downloads
2,806
This Month
6,239
Avg / Month

Total Downloads Over Time

Loading chart...

Related apps

Details

Repository
netplexflix/wtwp:latest
Last Updated2026-09-07
First Seen2026-02-10

Runtime arguments

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

Template configuration

/app/dataPathrw

Persistent data storage

Default
/mnt/user/appdata/wtwp
Value
/mnt/user/appdata/wtwp
CORS_ORIGINSVariable

EG: http://192.168.1.100:PORT,https://wtw.yourdomain.com

WEBUI_PORTPorttcp
Target
3000
Value
3000
TZVariable
Value
Australia/Brisbane
DATA_PATHVariable
Value
/app/data
NODE_ENVVariable
Default
production
Value
production
PUIDVariable

User ID for file permissions

Default
99
Value
99
PGIDVariable

Group ID for file permissions

Default
100
Value
100