EasyX-Viewer

EasyX-Viewer

Docker app from Raccommode's Repository

Overview

EasyX Viewer is a private, self-hosted library for browsing videos and images. It recursively indexes an existing media folder without modifying it and provides search, filters, favorites, watch progress, history, HTTP Range streaming, and on-demand FFmpeg video thumbnails.

EasyX Viewer

EasyX Viewer is a private, self-hosted media library for videos and images. It is the viewing half of the EasyX suite: it works on its own with any media folder today and is designed to integrate with EasyX Downloader without replacing it.

[!IMPORTANT] EasyX is for adults viewing content they are legally allowed to access and retain. The current release is intended for a private LAN or an authenticated reverse proxy. Do not expose it directly to the public internet.

Current foundation

  • Recursive, non-destructive video and image indexing
  • Search, media-type filters, performer folders with automatic content covers, and multiple sort modes
  • Dedicated home shelves for in-progress, oldest unfinished, recent videos, and recent photos
  • Dedicated theater-style video/photo pages with HTTP Range streaming
  • On-demand optimized photo thumbnails, midpoint video thumbnails, and cached whole-video GIF previews through FFmpeg
  • Viewport-aware media loading that keeps off-screen shelves and horizontal cards out of the critical path
  • Hover previews that sample evenly spaced moments without loading the original video
  • Favorites, watch progress, 90% completion detection, view counts, history, and exact resume playback
  • Library filters for performer, source, watch state, favorites, media type, and sort order
  • SQLite application state with a read-only media mount
  • Automatic background scans and manual rescan
  • Local automatic subtitles with original-language detection and optional translations
  • Manual WebVTT/SRT subtitle imports from the player
  • Custom player with exact resume, keyboard controls, persistent audio, subtitles, fullscreen, and filter-aware autoplay
  • Shareable URLs for every page, video, photo, performer search, and active library filter
  • Single-container Docker deployment for the viewer and local subtitle processing
  • English-only interface for the initial releases

This is the first functional slice of a broader Stash-class library. Tags, studios, galleries, richer metadata editing, duplicate review, playlists, and the Downloader event bridge are tracked in the product roadmap.

Quick start

git clone https://github.com/raccommode/EasyX-Viewer.git
cd EasyX-Viewer
mkdir -p data media
# Put media in ./media, or change the host side of the media volume.
docker compose up -d

Open http://localhost:3220. The first scan starts automatically.

For an existing library, change the volume in compose.yaml:

volumes:
  - ./data:/data
  - /path/to/your/library:/media:ro

The media mount is read-only by default. EasyX Viewer stores thumbnails, animated previews, favorites, and playback state only in ./data.

Local subtitles

The EasyX Viewer container includes its local subtitle worker. Open Settings → Automatic subtitles, enable it, then select any additional translation languages. The original spoken language is always detected and transcribed. If an additional language matches the original, EasyX Viewer reuses the original track instead of translating it.

Whisper and NLLB run inside the same container as EasyX Viewer; audio and generated text never leave the Docker installation. The first enabled job downloads the models into the persistent ./data/subtitle-models directory; reserve roughly 6 GB for the default model cache. Processing uses one CPU thread and stays idle while the feature is disabled.

You can also import an existing .vtt or .srt file from the subtitle menu in the player without enabling automatic generation.

Container packages

Every push runs tests, builds the complete single-container application, and publishes it to GitHub Container Registry:

docker pull ghcr.io/raccommode/easyx-viewer:latest

main publishes latest; every push also publishes branch and immutable sha-<commit> tags.

Development

Requires Node.js 22.5+ and FFmpeg for generated video thumbnails.

npm install
npm run dev
  • Web interface: http://localhost:5173
  • API: http://localhost:3220/api

Run the complete local check with npm run check.

License

MIT

Install EasyX-Viewer on Unraid in a few clicks.

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

Requirements

This Unraid template runs EasyX Viewer as nobody:users (UID 99, GID 100) so it can write to standard Unraid appdata paths without running as root. EasyX Viewer is intended for media you are legally allowed to access and retain. The current release has no user accounts; keep port 3220 on a private LAN or behind an authenticated reverse proxy and do not expose it directly to the internet. The Media path is mounted read-only, so scans and playback do not modify your library. Thumbnails, favorites, watch progress, history, and the SQLite database are stored in the writable Data path. To view downloads from EasyX Downloader, point both templates at the same Media host path; Downloader mounts it read-write while Viewer mounts it read-only.

Related apps

Details

Repository
ghcr.io/raccommode/easyx-viewer:latest
Last Updated2026-08-24
First Seen2026-08-24

Runtime arguments

Web UI
http://[IP]:[PORT:3220]
Network
bridge
Shell
sh
Privileged
false
Extra Params
--user=99:100

Template configuration

Web UI PortPorttcp

EasyX Viewer web interface and API port. Keep this accessible only on a trusted LAN or through an authenticated reverse proxy. Container port: 3220.

Target
3220
Default
3220
Value
3220
DataPathrw

Stores the SQLite database, generated thumbnails, favorites, watch progress, view counts, and history. Back up this path.

Target
/data
Default
/mnt/user/appdata/easyx-viewer
Value
/mnt/user/appdata/easyx-viewer
Media LibraryPathro

Existing video and image library indexed by EasyX Viewer. This mount is read-only. Use the same host path as EasyX Downloader to view its completed downloads.

Target
/media
Default
/mnt/user/EasyX
Value
/mnt/user/EasyX
Scan IntervalVariable

Minutes between automatic background library scans. The minimum effective value is 1 minute.

Target
EASYX_SCAN_INTERVAL_MINUTES
Default
10
Value
10
Log LevelVariable

Fastify log level, for example fatal, error, warn, info, debug, trace, or silent.

Target
EASYX_LOG_LEVEL
Default
info
Value
info
TimezoneVariable

Timezone used by the container, for example America/Toronto.

Target
TZ
Default
America/Toronto
Value
America/Toronto