A sleek, responsive web application for browsing and viewing your Plex, Jellyfin, or Emby media library content. This dockerized solution fetches metadata and artwork from your media server and presents it in an elegant, user-friendly interface with support for multiple media servers.
- Modern Interface: Clean, responsive design that works on mobile and desktop
- Multi-Server Support: Connect to Plex, Jellyfin, Emby, or multiple servers simultaneously
- Media Browsing: View your Movies and TV Shows with poster art
- Search Capability: Quickly find content across your libraries
- Detailed View: See cast information, genres, and descriptions
- Watch Movie Trailers: Preview content directly from the interface
- Random Content Selection: "Roll the Dice" feature for discovering random Movies or TV Shows
- Genre Filters: Easily filter media by genre
- Sort AβZ / ZβA: Alphabetical sorting
- Sort by Date Added (Ascending / Descending): Sort media by when it was added
- Server Toggle: Switch between multiple configured servers with one click
- Automatic Theme Adaptation: Interface automatically adapts to match your primary server
- Library Exclusion: Selectively exclude specific libraries from being displayed
- MD5 Checksum Verification: Only downloads images when they've changed
- Dockerized: Easy deployment with Docker and Docker Compose
- Customizable: Configure update schedule, app title, and more
- Installable as PWA: Access your media library like a native app on any device
- Docker and Docker Compose installed on your host system
- A running Plex Media Server, Jellyfin Media Server, and/or Emby Media Server
- Authentication tokens for your media server(s)
- Basic knowledge of Docker and containerization
Create a directory for your data
mkdir -p Glimpse/data
Create a docker-compose.yml file
curl -o Glimpse/docker-compose.yml https://raw.githubusercontent.com/jeremehancock/Glimpse/main/docker-compose.yml
Change to Glimpse directory
cd Glimpse
Edit docker-compose.yml
to set your media server details. You can configure any combination of Plex, Jellyfin, and/or Emby servers:
environment:
- PRIMARY_SERVER=plex
- PLEX_URL=http://your-plex-server:32400
- PLEX_TOKEN=your-plex-token
- PLEX_EXCLUDE_LIBRARIES= # Optional: Comma-separated list of library names or IDs to exclude
- CRON_SCHEDULE=0 */6 * * * # Update every 6 hours
- TZ=UTC # Your timezone
- APP_TITLE=Glimpse # Set app title
- SORT_BY_DATE_ADDED=false # Sort by date instead of title
environment:
- PRIMARY_SERVER=jellyfin
- JELLYFIN_URL=http://your-jellyfin-server:8096
- JELLYFIN_TOKEN=your-jellyfin-api-token
- JELLYFIN_EXCLUDE_LIBRARIES= # Optional: Comma-separated list of library names or IDs to exclude
- CRON_SCHEDULE=0 */6 * * * # Update every 6 hours
- TZ=UTC # Your timezone
- APP_TITLE=Glimpse # Set app title
- SORT_BY_DATE_ADDED=false # Sort by date instead of title
environment:
- PRIMARY_SERVER=emby
- EMBY_URL=http://your-emby-server:8096
- EMBY_TOKEN=your-emby-api-token
- EMBY_EXCLUDE_LIBRARIES= # Optional: Comma-separated list of library names or IDs to exclude
- CRON_SCHEDULE=0 */6 * * * # Update every 6 hours
- TZ=UTC # Your timezone
- APP_TITLE=Glimpse # Set app title
- SORT_BY_DATE_ADDED=false # Sort by date instead of title
To configure multiple servers, simply include the environment variables for each server you want to use. For example, to use both Plex and Jellyfin:
environment:
- PRIMARY_SERVER=plex # Which server to show by default
- PLEX_URL=http://your-plex-server:32400
- PLEX_TOKEN=your-plex-token
- PLEX_EXCLUDE_LIBRARIES=Adult Movies,Personal Collection
- JELLYFIN_URL=http://your-jellyfin-server:8096
- JELLYFIN_TOKEN=your-jellyfin-api-token
- JELLYFIN_EXCLUDE_LIBRARIES=XXX Content,Private Shows
- CRON_SCHEDULE=0 */6 * * * # Update every 6 hours
- TZ=UTC # Your timezone
- APP_TITLE=Glimpse # Set app title
- SORT_BY_DATE_ADDED=false # Sort by date instead of title
docker-compose up -d
Open your browser and navigate to:
http://your-server:9090
Variable | Description | Default | Required |
---|---|---|---|
PRIMARY_SERVER |
Which server to show by default | plex |
No |
PLEX_URL |
URL of your Plex server | None | If using Plex |
PLEX_TOKEN |
Authentication token for Plex | None | If using Plex |
PLEX_EXCLUDE_LIBRARIES |
Libraries to exclude from Plex | None | No |
JELLYFIN_URL |
URL of your Jellyfin server | None | If using Jellyfin |
JELLYFIN_TOKEN |
API token for Jellyfin | None | If using Jellyfin |
JELLYFIN_EXCLUDE_LIBRARIES |
Libraries to exclude from Jellyfin | None | No |
EMBY_URL |
URL of your Emby server | None | If using Emby |
EMBY_TOKEN |
API token for Emby | None | If using Emby |
EMBY_EXCLUDE_LIBRARIES |
Libraries to exclude from Emby | None | No |
CRON_SCHEDULE |
When to update data (cron format) | 0 */6 * * * (every 6 hours) |
No |
TZ |
Timezone for scheduled tasks | UTC |
No |
APP_TITLE |
Custom title for the application | Glimpse |
No |
SORT_BY_DATE_ADDED |
Sort items by date added instead of title | false |
No |
You can exclude specific libraries from being displayed in Glimpse. This is useful for:
- Adult content libraries
- Test or development libraries
- Personal or private collections
- Music libraries (if not supported)
- Any content you don't want visible in the interface
Exclusion lists are comma-separated and can include library names or IDs:
# Exclude by library name (case-sensitive)
- PLEX_EXCLUDE_LIBRARIES=Adult Movies,Personal Collection,Test Library
# Exclude by library ID
- JELLYFIN_EXCLUDE_LIBRARIES=1,5,12
# Mixed names and IDs
- EMBY_EXCLUDE_LIBRARIES=Adult Movies,5,Personal Collection
Plex:
- Open Plex Web interface
- Go to Settings > Libraries
- Library names are displayed in the list
Jellyfin:
- Open Jellyfin Web interface
- Go to Dashboard > Libraries
- Library names are shown in the list
Emby:
- Open Emby Web interface
- Go to Dashboard > Libraries
- Library names are visible in the management interface
- Single Server: Configure only one server's credentials. The app will automatically detect and use the available server.
- Multi-Server: Configure credentials for any combination of servers. The app will show a dropdown to switch between servers.
- Primary Server: When multiple servers are configured,
PRIMARY_SERVER
determines which one is shown by default and affects the app's theme. - Automatic Detection: If
PRIMARY_SERVER
is set incorrectly or credentials are missing, the app will automatically detect and switch to an available server. - Clean Data Updates: When libraries are excluded, the fetchers automatically clean existing data files to ensure excluded content doesn't persist.
You can find your Plex authentication token (X-Plex-Token) by following these steps:
- Log in to your Plex Web App
- Browse to any media item
- Click the 3 dots menu and select "Get Info"
- In the info dialog, click "View XML"
- In the URL of the new tab, find the "X-Plex-Token=" parameter
For more detailed instructions, visit the Plex support article.
To get your Jellyfin API token:
- Log in to your Jellyfin Web Interface
- Go to Administration β Dashboard
- Navigate to Advanced β API Keys
- Click + to create a new API key
- Give it a name (e.g., "Glimpse Media Viewer")
- Copy the generated API key
Alternatively, you can find your API token in the Jellyfin server logs when you first authenticate, or use the Jellyfin API documentation to generate one programmatically.
To get your Emby API token:
- Log in to your Emby Web Interface
- Go to Settings β Advanced β API Keys
- Click New API Key
- Give it a name (e.g., "Glimpse Media Viewer")
- Copy the generated API key
Alternatively, you can create an API key through the Emby server settings or by using the Emby API documentation.
Glimpse/
β
βββ docker-compose.yml # Docker Compose configuration
βββ Dockerfile # Docker build configuration
β
βββ scripts/
β βββ plex_data_fetcher.py # Python script to fetch Plex data
β βββ jellyfin_data_fetcher.py # Python script to fetch Jellyfin/Emby data
β
βββ web/
β βββ index.html # Frontend web interface
β βββ manifest.json # PWA manifest file
β βββ sw.js # Service worker for PWA functionality
β βββ offline.html # Offline fallback page
β βββ images/ # Icons and images
β βββ icon.png # Original app icon
β βββ android-chrome-192x192.png # App icon (192Γ192)
β βββ android-chrome-512x512.png # App icon (512Γ512)
β βββ apple-touch-icon.png # Apple Touch icon (180x180)
β βββ favicon.ico # Favicon
β βββ favicon-16x16.png # Favicon (16x16)
β βββ favicon-32x32.png # Favicon (32x32)
β βββ icons/ # Server icons for dropdown menus
β β βββ plex.png # Plex server icon
β β βββ jellyfin.png # Jellyfin server icon
β β βββ emby.png # Emby server icon
β βββ jellyfin/ # Jellyfin-specific themed icons
β β βββ android-chrome-192x192.png
β β βββ android-chrome-512x512.png
β β βββ apple-touch-icon.png
β βββ emby/ # Emby-specific themed icons
β βββ android-chrome-192x192.png
β βββ android-chrome-512x512.png
β βββ apple-touch-icon.png
β
βββ config/
β βββ entrypoint.sh # Container entrypoint script
β βββ nginx.conf # Nginx configuration
β βββ supervisord.conf # Supervisor configuration
β
βββ data/ # Persistent data directory
βββ plex/ # Plex server data
β βββ movies.json # Plex movie metadata
β βββ tvshows.json # Plex TV show metadata
β βββ checksums.pkl # MD5 checksums for Plex artwork
β βββ posters/ # Plex movie and TV show posters
β βββ backdrops/ # Plex movie and TV show backgrounds
βββ jellyfin/ # Jellyfin server data
β βββ movies.json # Jellyfin movie metadata
β βββ tvshows.json # Jellyfin TV show metadata
β βββ checksums.pkl # MD5 checksums for Jellyfin artwork
β βββ posters/ # Jellyfin movie and TV show posters
β βββ backdrops/ # Jellyfin movie and TV show backgrounds
βββ emby/ # Emby server data
βββ movies.json # Emby movie metadata
βββ tvshows.json # Emby TV show metadata
βββ checksums.pkl # MD5 checksums for Emby artwork
βββ posters/ # Emby movie and TV show posters
βββ backdrops/ # Emby movie and TV show backgrounds
- Data Fetching: Python scripts connect to your media server(s) using the provided tokens and fetch metadata for all movies and TV shows.
- Library Filtering: Excluded libraries are automatically skipped during data fetching, and existing data files are cleaned to ensure consistency.
- Multi-Server Support: When multiple servers are configured, data is fetched separately and stored in server-specific directories.
- Image Processing: Media posters and backdrops are downloaded, with MD5 checksums to avoid re-downloading unchanged files.
- Theming: The interface automatically adapts its theme based on your primary server (Plex orange/yellow, Jellyfin blue, or Emby green).
- Server Switching: If multiple servers are configured, users can switch between them with a dropdown menu.
- Web Server: Nginx serves the static web interface and the downloaded data.
- Scheduled Updates: Cron runs the data fetchers on the configured schedule to keep content up-to-date.
- Persistence: All data is stored in volumes mapped to your host, ensuring it persists between container restarts.
Modify the CRON_SCHEDULE
environment variable in your docker-compose.yml
:
- CRON_SCHEDULE=0 0 * * * # Once a day at midnight
Common cron patterns:
0 */6 * * *
- Every 6 hours0 0 * * *
- Daily at midnight0 0 * * 0
- Weekly on Sunday*/30 * * * *
- Every 30 minutes
Modify the ports
section in docker-compose.yml
:
ports:
- "9090:80" # Change to your desired port
Set the APP_TITLE
environment variable:
- APP_TITLE=My Movie Collection
When multiple servers are configured, set which one appears by default:
- PRIMARY_SERVER=jellyfin # Options: plex, jellyfin, emby
This affects:
- Which server's content is shown when the app first loads
- The app's color theme (Plex = orange/yellow, Jellyfin = blue, Emby = green)
- The default offline page styling
View all container logs
docker-compose logs
Follow logs in real-time
docker-compose logs -f
View specific service logs
docker-compose logs glimpse-media-viewer
To trigger a data update manually (using your configured exclusions):
Plex:
docker exec glimpse-media-viewer bash -c 'python /app/scripts/plex_data_fetcher.py --url "$PLEX_URL" --token "$PLEX_TOKEN" --output /app/data/plex'
Jellyfin:
docker exec glimpse-media-viewer bash -c 'python /app/scripts/jellyfin_data_fetcher.py --url "$JELLYFIN_URL" --token "$JELLYFIN_TOKEN" --output /app/data/jellyfin'
Emby:
docker exec glimpse-media-viewer bash -c 'python /app/scripts/jellyfin_data_fetcher.py --url "$EMBY_URL" --token "$EMBY_TOKEN" --output /app/data/emby'
To manually specify different exclusions for testing:
Plex with custom exclusions:
docker exec glimpse-media-viewer bash -c 'python /app/scripts/plex_data_fetcher.py --url "$PLEX_URL" --token "$PLEX_TOKEN" --exclude-libraries "Adult Content" "Personal Files" --output /app/data/plex'
Jellyfin with custom exclusions:
docker exec glimpse-media-viewer bash -c 'python /app/scripts/jellyfin_data_fetcher.py --url "$JELLYFIN_URL" --token "$JELLYFIN_TOKEN" --exclude-libraries "Adult Content" "Personal Files" --output /app/data/jellyfin'
Emby with custom exclusions:
docker exec glimpse-media-viewer bash -c 'python /app/scripts/jellyfin_data_fetcher.py --url "$EMBY_URL" --token "$EMBY_TOKEN" --exclude-libraries "Adult Content" "Personal Files" --output /app/data/emby'
If you see the default Nginx welcome page, there might be an issue with the configuration:
Check if the app files are present
docker exec glimpse-media-viewer ls -la /app/web
Check Nginx configuration
docker exec glimpse-media-viewer cat /etc/nginx/conf.d/default.conf
Restart Nginx
docker exec glimpse-media-viewer nginx -s reload
If media images aren't displaying:
- Check permissions on the data directory
- Ensure the media server is accessible from the container
- Verify your server token is valid
- Check the container logs for fetch errors
If you configured multiple servers but don't see the server dropdown:
- Verify all server URLs and tokens are correct
- Check the container logs for authentication errors
- Ensure all servers are accessible from the container
- Try restarting the container after fixing configuration
If the app shows the wrong theme:
- Check your
PRIMARY_SERVER
setting - Clear your browser cache and reload
- Un-install and Re-install PWA
If excluded libraries are still appearing:
- Check library names: Ensure the library names match exactly (case-sensitive)
- Verify environment variables: Check that the exclusion variables are set correctly
- Restart container: Library exclusions are applied during data fetching, so restart after configuration changes
- Check logs: Look for exclusion messages in the container logs:
docker-compose logs | grep -i "excluded\|skipping"
- Manual data update: Force a data refresh to apply exclusions immediately
- Try library IDs: If names don't work, try using library IDs instead
To get detailed library information for troubleshooting exclusions, check the logs during a manual data update. The fetchers will display library names and IDs as they process each one.
This application works well behind a reverse proxy like Traefik or Nginx Proxy Manager. Just expose the container port and configure your proxy accordingly.
- Media server tokens provide access to your media servers. Keep them secure.
- All data access is read-only, so there's no risk of modifying your media libraries.
- Consider using a dedicated API token for Glimpse rather than your main user token.
- Library exclusions help keep sensitive content private and separate from your main viewing interface.
This project is released under the MIT License. See the LICENSE
file for details.
This tool was developed with assistance from AI language models.