Aperture

Aperture

Docker app from grtgbln's Repository

Overview

Aperture creates personalized recommendation libraries for your Emby and Jellyfin media server users using OpenAI embeddings and pgvector similarity search. Recommendations appear as virtual libraries in your media server's home screen, with support for both movies and TV series.

Aperture

Version Docker Image License: AGPL v3

Aperture — AI-powered media recommendations for Emby & Jellyfin.

Aperture creates personalized recommendation libraries for your media server users using OpenAI embeddings and pgvector similarity search. Recommendations appear as virtual libraries in your media server's home screen, with support for both movies and TV series.


Quick Start

1. Download the docker-compose file for your platform

Platform File Download
Unraid docker-compose.unraid.yml Download
QNAP docker-compose.qnap.yml Download
Synology docker-compose.synology.yml Download
Windows docker-compose.windows.yml Download ¹
Linux/Other docker-compose.prod.yml Download

¹ Windows Users: For Docker Desktop with Emby/Jellyfin running natively on Windows, see the complete setup guide.

2. Configure the file

Edit the docker-compose file and set:

  • APP_BASE_URL — Your server's IP address (e.g., http://192.168.1.100:3456)
  • SESSION_SECRET — A random string (32+ characters)
  • Volume paths — Adjust to match your media folder locations

3. Create required folders

# Example for Unraid - adjust paths for your platform
mkdir -p /mnt/user/Media/ApertureLibraries
mkdir -p /mnt/user/appdata/aperture/backups

4. Start Aperture

docker-compose -f docker-compose.[your-platform].yml up -d

5. Complete the Setup Wizard

Open http://YOUR_SERVER_IP:3456 and follow the 11-step guided setup:

  1. Restore (Optional) — Restore from an existing backup if migrating
  2. Media Server — Connect to your Emby/Jellyfin server
  3. Source Libraries — Select which libraries to analyze
  4. File Locations — Configure path mappings for symlinks/STRM
  5. AI Recommendations — Configure library naming and cover images
  6. Validate — Verify output configuration and paths
  7. Users — Select which users receive recommendations
  8. Top Picks (Optional) — Configure global trending libraries
  9. AI / LLM — Enter your OpenAI API key (or configure Ollama/other providers)
  10. Initial Jobs — Run first-time sync with real-time progress
  11. Complete — Review summary and next steps

6. Log in

Use your Emby/Jellyfin admin credentials to access Aperture.


Updating

docker-compose -f docker-compose.[your-platform].yml pull
docker-compose -f docker-compose.[your-platform].yml up -d

Features

AI Recommendations

  • Personalized Libraries — Creates dedicated "AI Picks" libraries for each user
  • OpenAI Embeddings — Semantic vectors for all your media
  • pgvector Similarity — Lightning-fast vector similarity search
  • Configurable Algorithm — Tune weights for similarity, novelty, rating, and diversity

Media Support

  • Movies — Full movie library sync with metadata, ratings, and watch history
  • TV Series — Complete series and episode tracking with per-show recommendations
  • Watch History — Automatic sync of viewing history including play counts and favorites

Rating System

  • 10-Heart Ratings — Rate content from 1-10 hearts (Trakt.tv compatible)
  • Rate from Any Poster — Click the heart icon on any poster
  • Trakt.tv Sync — Bidirectional sync of ratings with Trakt

Personalization

  • AI Taste Profiles — Natural language descriptions of user preferences
  • Match Scores — Personalized percentage scores showing recommendation fit
  • Recommendation Insights — Detailed breakdown of why each title was recommended

Top Picks (Global)

  • Popularity-Based Content — Trending content across all users
  • Multiple Output Modes — Libraries, Collections, and/or Playlists
  • Rank Badges — Gold, silver, bronze badges for top 3 on posters

Symlinks & Artwork

  • Full Artwork Preservation — Symlinks banner.jpg, clearlogo.png, landscape.jpg, and more
  • Smart Subtitle Handling — Subtitles are symlinked and renamed to match video files
  • Custom NFOs — Aperture generates NFOs with AI explanations while preserving original artwork

Backup & Restore

  • Automatic Daily Backups — Database backed up at 1 AM (configurable)
  • Restore During Setup — Restore from backup when setting up a new instance
  • Admin Panel Restore — Restore from the Admin → Settings → System tab
  • Configurable Retention — Set how many backups to keep

Admin Features

  • Setup Wizard — Guided first-time configuration
  • Job Management — Real-time progress, scheduling, and history
  • Configurable Schedules — All job schedules adjustable via Admin → Jobs
  • User Management — Per-user recommendation settings
  • Cost Estimator — Built-in OpenAI API cost estimation

Default Job Schedules

All schedules are configurable in Admin → Jobs.

Job Default Schedule
Database Backup Daily at 1 AM
Library Scan Daily at 2 AM
Embeddings Daily at 3 AM
AI Recommendations Weekly on Sunday at 4 AM
Top Picks Daily at 5 AM
Watch History Every 2 hours
Metadata Enrichment Every 6 hours

Documentation

Guide Description
Admin Guide Setup walkthrough, job management, algorithm tuning
User Guide Features for end users, ratings, channels
Configuration Volume setup, reverse proxy, Trakt integration
API Reference Complete API endpoint documentation
Architecture Technical overview, recommendation pipeline, database schema
Development Local dev setup, scripts, contribution guidelines

Tech Stack

  • Backend: Fastify, TypeScript, PostgreSQL, pgvector
  • Frontend: React, Vite, MUI, React Router
  • AI: OpenAI Embeddings & GPT models
  • Infrastructure: Docker, pnpm workspaces

License

GNU Affero General Public License v3.0

Install Aperture on Unraid in a few clicks.

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

Requirements


        Requires separate Jellyin/Emby media servers and pgvector database instances.
    

Related apps

Details

Repository
ghcr.io/dgruhin-hrizn/aperture:latest
Last Updated2026-07-17
First Seen2026-01-17

Runtime arguments

Web UI
http://[IP]:[PORT:3456]/
Network
bridge
Privileged
false
Extra Params
--user 099:100

Template configuration

Web UI PortPorttcp

Container Port: 3456

Target
3456
Default
3456
Value
3456
Database URLVariable

Database connection URL

Target
DATABASE_URL
Default
postgresql://aperture:password@IP_ADDRESS:5432/aperture
Value
postgresql://aperture:password@IP_ADDRESS:5432/aperture
Base URLVariable

Base URL for accessing the application

Target
APP_BASE_URL
Default
http://IP_ADDRESS:3456
Value
http://IP_ADDRESS:3456
Session SecretVariable

Secret key, at least 32 characters

Target
SESSION_SECRET
Aperture Libraries PathPath

Path where Aperture libraries will be stored. Should be inside your existing media server's library path.

Target
/aperture-libraries
Media Libraries PathPathro

Path to the root of your media library.

Target
/media
Backups PathPath

Path where backups will be stored

Target
/backups
Default
/mnt/user/appdata/aperture/backups
Value
/mnt/user/appdata/aperture/backups
Run Migrations on StartVariable

Whether to run database migrations on container start

Target
RUN_MIGRATIONS_ON_START
Default
true|false
Node EnvironmentVariable

Set the Node environment. Not recommended to change.

Target
NODE_ENV
Default
production
Value
production
Internal PortVariable

Internal port the application listens on. Not recommended to change.

Target
PORT
Default
3456
Value
3456