Swiparr is a fun way to discover and decide what to watch next from your Jellyfin media library. Think "Tinder for Movies" β swipe through your library, match with friends in a session, and find something everyone wants to watch.
It's a web app built with Next.js, connects to your Jellyfin server, and is available to host as a docker container. Open source and free forever.
- Swipe discovery: Quickly browse your Jellyfin library with a card-based interface.
- Sessions: Create or join a session with friends to find common likes (matches). Sessions are fundamentally temporary "in-the-moment" experiences; when you leave a session, your swipes and matches for that session are cleared.
- Native Jellyfin integration: Pulls directly from your Jellyfin server.
- Guest Mode: Let friends join your session without needing their own Jellyfin account by "lending" your connection temporarily.
- Mobile friendly: Optimized for use on your phone.
Highly recommended: Download as a web app on mobile, and use the keyboard shortcuts on desktop.
To make your final choice, use the Random button to pick a movie from your matches.
Swiparr includes a Guest mode designed for situations where some participants don't have a Jellyfin account.
- Enable lending: A host (with a Jellyfin account) enables "Guest lending" in their Swiparr settings.
- Proxy connection: When guests join that host's session, Swiparr uses the host's credentials to fetch movie data and images from Jellyfin.
- Identity: Guests choose a display name and get a unique ID. Their likes and matches are tracked separately from the host.
- Security: Guests can only swipe within the session. They cannot modify the host's Jellyfin account, favorites, or settings.
This makes it easy to host sessions with guests who aren't part of your home lab ecosystem.
When you create a session, you can customize how it behaves to fit your group's preferences:
- Two or more: A match is created as soon as any two members in the session like the same movie. Great for larger groups.
- Unanimous: Every single member in the session must like the movie for it to appear in the matches list.
- Max likes: Limit how many right swipes each person gets. This forces everyone to be more selective.
- Max nopes: Limit how many left swipes each person gets. Useful if you want to prevent members from just saying no to everything.
- Max matches: Stop registering matches once a the set max number of matches have been found.
The easiest way to run Swiparr is with Docker Compose.
- Create a or add to an existing
docker-compose.ymlfile (or copydocker-compose.example.yml):
services:
swiparr:
image: ghcr.io/m3sserstudi0s/swiparr:latest
container_name: swiparr
restart: unless-stopped
environment:
- JELLYFIN_URL=http://your-jellyfin-internal-ip:8096
# - JELLYFIN_PUBLIC_URL=https://jellyfin.yourdomain.com
volumes:
- ./swiparr-data:/app/data
ports:
- 4321:4321- Run the container:
docker compose up -dAlternatively, you can run the container directly with the Docker CLI:
docker run -d \
--name swiparr \
--restart unless-stopped \
-p 4321:4321 \
-v $(pwd)/swiparr-data:/app/data \
-e JELLYFIN_URL=http://your-jellyfin-internal-ip:8096 \
ghcr.io/m3sserstudi0s/swiparr:latest- Access Swiparr at
http://your-server-ip:4321.
| Variable | Description | Default |
|---|---|---|
JELLYFIN_URL |
Required: Internal URL to your Jellyfin server. | - |
JELLYFIN_PUBLIC_URL |
Optional: Public URL to your Jellyfin server. Defaults to JELLYFIN_URL. |
- |
AUTH_SECRET |
Optional: Random string (min 32 chars). Generated automatically if not set. | - |
JELLYFIN_USE_WATCHLIST |
Optional: Set to true to use "Watchlist" instead of "Favorites". |
false |
USE_SECURE_COOKIES |
Optional: Security: Set to true if you are accessing Swiparr over HTTPS. |
false |
DATABASE_URL |
Optional: Path to the SQLite database file. | file:/app/data/swiparr.db |
PORT |
Optional: The port the container listens on. | 4321 |
HOSTNAME |
Optional: The hostname the server binds to. | 0.0.0.0 |
ADMIN_USERNAME |
Optional: A Jellyfin username that will always have admin privileges. | - |
X_FRAME_OPTIONS |
Optional: Security: X-Frame-Options header. Set to DISABLED to remove. |
DENY |
CSP_FRAME_ANCESTORS |
Optional: Security: Content-Security-Policy: frame-ancestors directive. |
none |
PUID |
Optional: User ID to run the application as. | 1001 |
PGID |
Optional: Group ID to run the application as. | 1001 |
Note: Watchlist is not a feature in vanilla Jellyfin, but available either through the Jellyfin Enhanced plugin or Kefwin Tweaks script.
The first user to log in to Swiparr is automatically appointed as the system administrator. Admins can:
- Configure which Jellyfin libraries are included in discovery.
- Access future admin-only features and management tools.
Alternatively, you can manually assign an admin by setting the ADMIN_USERNAME environment variable to a specific Jellyfin username.
If you are running Swiparr behind a reverse proxy (Nginx, Traefik, Caddy, Nginx Proxy Manager), ensure you:
- Set
USE_SECURE_COOKIES=truein your environment variables if using HTTPS. - Ensure your proxy passes the
Hostheader to Swiparr. In Nginx, this isproxy_set_header Host $host;. Without this, authentication will fail due to Next.js 15 security checks. - Forward other standard headers:
X-Forwarded-For,X-Forwarded-Proto. - Swiparr runs on port
4321by default.
JELLYFIN_URL: Internal URL used by the Swiparr backend to communicate with Jellyfin.- If Jellyfin is in the same Docker network, use the container name:
http://jellyfin:8096. - Otherwise, use the internal IP:
http://192.168.1.10:8096. - Note: This URL should be accessible from within the Swiparr container.
- If Jellyfin is in the same Docker network, use the container name:
JELLYFIN_PUBLIC_URL: The public-facing URL your browser uses to access Jellyfin (e.g.,https://jellyfin.yourdomain.com). This is used for links and redirects. Defaults toJELLYFIN_URLif not provided.
I use GitHub discussions for everything related to Swiparr
- π¬ Ask a question
- π‘ Propose a feature
- π Report a bug
- π General discussion
Please note: I am currently not accepting pull requests.
Swiparr is released under the MIT License.
