Watchma

Watchma

Docker app from grtgbln's Repository

Overview

A movie voting system for groups on Jellyfin.

Watchma

+ +

Why I made this

How many times have you thought "Man there's nothing to watch"? But then you actually have hundreds of movies at your disposal and you're simply overwhelmed by choices and your friends can't actually decide on what to watch so you just end up scrolling Jellyfin and arguing?

Ok maybe this is a specific me problem, but if it's not, that's why I made this site, hopefully to make the process of picking a movie more fun.

The voting system is influenced by the young CGP Grey. Everyone Should Vote More Than Once

Dev Setup

For this to work you must have 5 things installed and in your $PATH

Setting .env variables

Copy .env.example to .env and fill in your values:

cp .env.example .env

Optional: Configure Jellyfin credentials to fetch real movie data. Without these, the app will use dummy data for testing:

  • JELLYFIN_API_KEY
  • JELLYFIN_BASE_URL

Optional: Add OPENAI_API_KEY for AI-generated game messages. Uses ~$0.01 per 100 games.

See .env.example for all available configuration options including PORT, LOG_LEVEL, and IS_DEV.

Using Bruno (basically offline postman)

I have some of the api endpoints saved in the _bruno folder install bruno if you want to use these endpoints. Make sure to copy your .env file in the root of the _bruno directory so the endpoints can use the environment variables in their requests. Jellyfin requires an API key in each of it's requests. here's some info on how to store bruno secrets.

The Layers / Setup

I have this project split into distinct layers to keep things organized.

  • web/features: Handle HTTP Requests, perform handler operations for rendering pages, similar setup to Northstar
  • web/views: Just for common templ files / or pages
  • pkg/: Handle all of the business logic. Grab data from external services with providers (i.e. Jellyfin/openAi)
  • db: Handles the CRUD operations directly on the database. Migrations, sqlc, etc.

Testing

Right now I have basic clickthrough testing setup using playwright, npm test or npm run test:ui for detailed results. Testing is put in place on push to prevent regression, if your git client is giving you an error, try running npm test to see more detailed errors.

NOTE: You cannot have the app running when you run playwright tests, full e2e tests mean it needs the ports for NATS and the app itself

Deployment

Building and Pushing Docker Image

Build and push multi-platform Docker images (linux/amd64 and linux/arm64) to Docker Hub:

# Build and push latest
./build-and-push.sh

# Build and push specific version
./build-and-push.sh v1.2.3

Note: Make sure you're logged in to Docker Hub first:

docker login

To use your own Docker Hub username, set the DOCKER_USERNAME environment variable:

DOCKER_USERNAME=yourusername ./build-and-push.sh

Support

If you really enjoy using Watchma, I'm a simple man, I like money. But mainly, thanks for trying it out!

Install Watchma on Unraid in a few clicks.

Find Watchma 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 Watchma Review the template variables and paths Click Install

Requirements


        Requires a separate Jellyfin instance.
    

Download Statistics

675
Total Downloads

Related apps

Details

Repository
jsonbateman/watchma:latest
Last Updated2026-01-19
First Seen2026-01-19

Runtime arguments

Web UI
http://[IP]:[PORT:58008]/
Network
bridge
Privileged
false

Template configuration

Web UI PortPorttcp

Container Port: 58008

Target
58008
Default
58008
Value
58008
Jellyfin - URLVariable

The base URL of your Jellyfin server.

Target
JELLYFIN_BASE_URL
Default
http://IP_ADDRESS:8096
Value
http://IP_ADDRESS:8096
Jellyfin - API KeyVariable

Your Jellyfin API key.

Target
JELLYFIN_API_KEY
OpenAI - API KeyVariable

Optional, OpenAI API key for AI-generated messages.

Target
OPENAI_API_KEY
App DataPath

Path to app data folder

Target
/data
Default
/mnt/user/appdata/watchma/data
Value
/mnt/user/appdata/watchma/data
Log LevelVariable

Set the logging level

Target
LOG_LEVEL
Default
WARN|INFO|DEBUG|ERROR
Development ModeVariable

Enable development mode

Target
IS_DEV
Default
false|true
Internal PortVariable

Internal port for the application. Not recommended to change.

Target
PORT
Default
58008
Value
58008