

Clean art.
Textless art from TMDB, Apple TV or fanart.tv, with the title logo in one spot at one size.
TMDB_API_KEYAPPLE_ART=trueFANART_API_KEYStudio posters come in every font, tagline and layout. Posteryard swaps them for textless art with the title in the same spot on every poster, then renders, uploads and refreshes them on its own in Plex or Jellyfin as your library grows.


Textless art from TMDB, Apple TV or fanart.tv, with the title logo in one spot at one size.
TMDB_API_KEYAPPLE_ART=trueFANART_API_KEY

The mark of the service a show streams on, looked up on TMDB for the countries you list.
STREAMING_REGIONS

Resolution, HDR and audio badges from each file, starting at the level you set.
QUALITY_MIN_VIDEOQUALITY_MIN_HDRQUALITY_MIN_AUDIO

Just added, New episode, New season, or New season Oct 21 before a premiere. With Maintainerr, a red label counts down to its delete date: Leaving in 5 days, then tomorrow, then today.
STATUS_LABELSMAINTAINERR_URL

Season numbers, channel tiles for service collections, and episode thumbnails with their title.
SERVICE_COLLECTIONSCOLLECTION_POSTERSEPISODE_THUMBNAILSYou need Docker on an x86-64 or ARM64 host, a free TMDB API key and your Plex token. For Jellyfin, see Jellyfin.
services:
posteryard:
image: ghcr.io/sandobserver/posteryard:latest
container_name: posteryard
restart: unless-stopped
init: true
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
environment:
# TMDB API Key or API Read Access Token
- TMDB_API_KEY=your-tmdb-api-key
# Plex's network address. Not localhost.
- PLEX_URL=http://192.168.1.10:32400
- PLEX_TOKEN=your-plex-token
# Any long random text: openssl rand -hex 16
- WEBHOOK_SECRET=any-long-random-text
# The daily pass runs at DAILY_AT in this time zone
- TZ=America/New_York
- DRY_RUN=true
volumes:
- ./data:/data
ports:
- "8000:8000"Plex in Docker on the same network? Use its container name, such as http://plex:32400.
mkdir -p data && sudo chown 1000:1000 data
docker compose up -dPosteryard runs as user 1000 and writes only to ./data and /tmp.
With DRY_RUN=true, Plex is not touched: images go to ./data/previews, such as 5646-poster.jpg. docker logs -f posteryard shows progress through the first full run.
When you like them, set DRY_RUN=false and run docker compose up -d again. Images are uploaded and locked, so a Plex refresh keeps them. ONLY_RATING_KEYS limits a first run to a few titles.
After that:
http://SERVER-IP:8000/webhook/YOUR-WEBHOOK-SECRET under Settings > Webhooks so new titles get posters right away. Without it, they follow within 15 minutes.26 optional settings for badges, status labels, collections, Jellyfin, Maintainerr, alerts and the schedule. Commands, Plex labels and monitoring are in the full documentation.
Replace PLEX_URL and PLEX_TOKEN with these two lines.
- JELLYFIN_URL=http://192.168.1.10:8096
- JELLYFIN_API_KEY=your-jellyfin-api-keyUse the two parts of your Discord webhook URL. Any Apprise address works, such as ntfys:// or mailtos://.
- NOTIFY_URLS=discord://WEBHOOK_ID/WEBHOOK_TOKENTitles Maintainerr will delete get LEAVING IN 5 DAYS, then TOMORROW, then TODAY.
- MAINTAINERR_URL=http://192.168.1.10:6246The default is US. Put your country first and keep US as a fallback. This example is the UK.
- STREAMING_REGIONS=GB,USBy default only 4K, HDR10 or better, and Dolby Atmos get a badge.
- QUALITY_MIN_VIDEO=1080
- QUALITY_MIN_AUDIO=5.1Titles Apple TV does not have keep TMDB art.
- APPLE_ART=trueposteryard find NAME lists rating keys. Remove ONLY_RATING_KEYS when you are happy.
- DRY_RUN=false
- ONLY_RATING_KEYS=5646,8730Adds EPISODE N and the title to each episode still.
- EPISODE_THUMBNAILS=titled