Emby Wrapped: A Spotify Wrapped-Style Year-in-Review for Your Emby Server (2026)

Emby Wrapped: A Spotify Wrapped-Style Year-in-Review for Your Emby Server (2026)

Emby Wrapped: A Spotify Wrapped-Style Year-in-Review for Your Emby Server (2026)

Every December, Spotify users share their Wrapped stats on social media. Total minutes listened, top artists, listening personality. It is fun, shareable, and makes you reflect on the year.

Now your Emby media server gets the same treatment. Emby Wrapped is a free, open-source web application that generates a beautiful, animated year-in-review experience from your Emby playback data. Total watch time, top shows, genre breakdowns, binge sessions, viewing personality types, and downloadable share cards.

It looks stunning. It runs in Docker. And it takes about 5 minutes to set up.


What Is Emby Wrapped?

Emby Wrapped is a self-hosted web app that connects to your Emby server API and generates personalized viewing statistics presented as an animated, swipeable card experience. Think Spotify Wrapped, but for your movies, TV shows, music, and live TV.

The project is an enhanced fork maintained by CtznSniiips, building on earlier work by davidtorcivia and tonghongte. The 2026 version adds music statistics, Tracearr integration, Seerr request stats, Emby authentication, and shareable image cards.


Features

Core Statistics

  • Total Watch Time - days and hours spent watching across the year
  • Top Shows and Movies - most-watched content with poster artwork
  • Genre Breakdown - discover your viewing preferences visually
  • Viewing Patterns - peak hours and favorite days of the week
  • Viewing Personality - a fun personality type based on your habits (similar to Spotify archetypes)
  • Binge Sessions - your longest viewing marathons identified
  • Monthly Journey - track how your viewing changed across the year
  • Device Breakdown - see which devices you watched on most
  • Live TV - total Live TV time and your top 5 channels

Enhanced Music Statistics

This fork adds detailed music tracking that the original lacked:

  • Top artists with full artwork
  • Top tracks with album art
  • Listening time breakdown
  • High-quality artist images fetched automatically

Share Cards

Every stat screen can be downloaded as a shareable image card. Post your Emby Wrapped to Discord, Reddit, or social media the same way people share Spotify Wrapped.

Integrations

IntegrationWhat it adds
TracearrUse Tracearr playback history instead of the Emby Playback Reporting plugin
Seerr/Overseerr/JellyseerrShows total media requests broken down by movie, series, and user
TMDBEnhanced poster images in higher resolution

Security and Privacy

  • Emby authentication required - users must log in with their Emby credentials to see stats
  • API keys stored server-side only - never exposed to the browser
  • All requests proxied through the server
  • No user data stored - stats are fetched fresh on each visit
  • CORS handled server-side via built-in image proxy

How It Works

Emby Wrapped reads playback history from either the Emby Playback Reporting Plugin or Tracearr. It processes this data into statistics and presents them as an animated card-by-card experience in the browser.

The flow:

  1. User opens Emby Wrapped in their browser
  2. User authenticates with their Emby username and password
  3. User selects a time period (year or month)
  4. The app fetches playback data from the Emby API (or Tracearr)
  5. Statistics are calculated and displayed as animated cards
  6. User swipes through their personalized Wrapped experience
  7. Individual cards can be downloaded as images for sharing

Requirements

  • Emby Server 4.7+ with an API key
  • Playback Reporting Plugin installed on Emby (unless using Tracearr)
  • Docker (recommended) or Node.js 18+

Optional

  • Tracearr - alternative playback history source
  • TMDB API key - for enhanced poster images (free at themoviedb.org)
  • Seerr/Overseerr/Jellyseerr - for request statistics

Docker Setup (5 Minutes)

Emby Wrapped provides a pre-built Docker image on GitHub Container Registry.

services:
  emby-wrapped:
    image: ghcr.io/ctznsniiips/emby-wrapped:latest
    container_name: emby-wrapped
    ports:
      - "3003:3003"
    environment:
      - EMBY_URL=http://your-emby-server:8096
      - EMBY_API_KEY=your-api-key-here
      - TMDB_API_KEY=           # Optional: enhanced poster images
      - SEERR_URL=              # Optional: request stats
      - SEERR_API_KEY=          # Optional: Seerr API key
      - TRACEARR_URL=           # Optional: use Tracearr instead of Playback Reporting
      - TRACEARR_API_KEY=       # Optional: Tracearr public API key (trr_pub_*)
      - TRACEARR_USERNAME_ALIASES=  # Optional: oldname1:newname1,oldname2:newname2
      - PUBLIC_URL=             # Optional: for share links
      - CACHE_TTL=86400         # Optional: cache duration in seconds
      - FILTER_USER_ID=         # Optional: filter by user library
    volumes:
      - ./music:/app/static/music:ro  # Optional: custom background music
    restart: unless-stopped

Get your Emby API key

  1. Open Emby Dashboard
  2. Navigate to API Keys
  3. Create a new key named "Emby Wrapped"
  4. Copy the key into your docker-compose.yml

Deploy

mkdir emby-wrapped && cd emby-wrapped
# Create docker-compose.yml with the content above
docker compose up -d

Access Emby Wrapped at http://your-server:3003.


Configuration Reference

VariableRequiredDescription
EMBY_URLYesFull URL to your Emby server
EMBY_API_KEYYesAPI key from Emby Dashboard
TMDB_API_KEYNoTMDB API key for higher-resolution posters
SEERR_URLNoSeerr/Overseerr/Jellyseerr URL for request stats
SEERR_API_KEYNoSeerr API key
TRACEARR_URLNoTracearr URL (replaces Playback Reporting plugin)
TRACEARR_API_KEYNoTracearr public API key (format: trr_pub_*)
TRACEARR_USERNAME_ALIASESNoUsername mapping for Tracearr (oldname:newname,old2:new2)
PUBLIC_URLNoPublic URL for share links (defaults to request origin)
FILTER_USER_IDNoEmby User ID for library filtering (hide NSFW content)
CACHE_TTLNoCache duration in seconds (default: 86400 = 24 hours)
PORTNoServer port (default: 3003)
ANALYTICS_SCRIPTNoAnalytics script tag to inject (Umami, Plausible)

Tracearr Integration

If you run Tracearr for playback tracking, Emby Wrapped can pull history from it instead of the Emby Playback Reporting plugin. This is useful if:

  • You already use Tracearr and do not want to install another Emby plugin
  • Tracearr has longer historical data than the Playback Reporting plugin
  • You want a single source of truth for playback history

Configure both TRACEARR_URL and TRACEARR_API_KEY. If both Tracearr and the Playback Reporting plugin are available, Tracearr data takes priority.

If usernames changed over time (e.g., a user renamed their Emby account), use TRACEARR_USERNAME_ALIASES to map old Tracearr usernames to current Emby usernames:

TRACEARR_USERNAME_ALIASES=oldusername:newusername,john_old:john

Seerr Integration

Connect Seerr (or Overseerr/Jellyseerr) to show request statistics in the Wrapped experience:

  • Total number of media requests made during the period
  • Breakdown by movies vs TV series
  • Per-user request counts

This adds a fun "you requested X movies this year" card to the experience.


Custom Background Music

Emby Wrapped supports background music during the animated presentation. To add your own tracks:

JellyWatchTry JellyWatch — Your Jellyfin companion, everywhere.
  1. Create a music/ directory next to your docker-compose.yml
  2. Add MP3 files to the directory
  3. Mount it as shown in the Docker Compose example: ./music:/app/static/music:ro
  4. Music plays automatically during the Wrapped experience

URL Parameters for Pre-Selected Time Periods

You can share direct links to specific time periods:

  • http://yourserver:3003?2025 - pre-selects the 2025 yearly review
  • http://yourserver:3003?06-2025 - pre-selects June 2025 monthly review

This is useful for sending links to your users at the end of the year.


Library Filtering

If your Emby server has libraries you do not want included in Wrapped statistics (adult content, test libraries), use the FILTER_USER_ID environment variable. Set it to the Emby User ID whose library access should define what content appears in stats.

For example, if you have a "Family" user that only sees clean libraries, use that user ID as the filter. Wrapped will only show statistics for content visible to that user.


Tech Stack

  • Framework: SvelteKit
  • Styling: Tailwind CSS
  • Animations: CSS animations + Svelte transitions
  • Image Capture: html2canvas (for share cards)
  • Fonts: Space Grotesk, JetBrains Mono
  • Container: Node.js 18+ in Docker

Updating

docker compose pull
docker compose up -d

The pre-built image on GHCR is updated with each release.


Troubleshooting

ProblemCauseFix
"No users found"Wrong EMBY_URL or API keyVerify URL is reachable and API key has permissions
Stats seem incompletePlayback Reporting plugin not installedInstall the plugin from Emby Catalog and wait for data collection
Images not loadingEmby server not reachable from containerCheck Docker networking and firewall rules
No music statsMusic playback not trackedEnsure Playback Reporting tracks music or use Tracearr
Share cards blankhtml2canvas CORS issueThe built-in image proxy should handle this; check server logs

Emby Wrapped vs Jellystat vs JellyWatch Statistics

FeatureEmby WrappedJellystatJellyWatch/EmbyWatch
PlatformEmbyJellyfinBoth
PurposeAnnual review experienceOngoing analytics dashboardReal-time monitoring + stats
PresentationAnimated cards (Spotify-style)Web dashboard with chartsNative Android app
ShareableYes (image cards)NoYes (share feature)
Real-timeNo (historical)YesYes
Self-hostedYesYesN/A (mobile app)
Data sourcePlayback Reporting / TracearrJellyfin APIEmby/Jellyfin API

Emby Wrapped is not a replacement for ongoing monitoring. It is a fun, annual (or monthly) experience that celebrates your viewing habits. Use it alongside EmbyWatch for day-to-day server management.


Who Is This For?

  • Emby server admins who want to give their users a fun end-of-year experience
  • Families who want to see their collective viewing habits
  • Self-hosting enthusiasts who enjoy data visualization
  • Anyone who loves Spotify Wrapped and wants the same thing for their media server

FAQ

Does Emby Wrapped work with Jellyfin? No. This project is Emby-specific. For Jellyfin, look at Jellystat or the Playback Reporting plugin dashboard.

Does it store my viewing data? No. Statistics are fetched fresh from your Emby server (or Tracearr) on each visit. Nothing is persisted by Emby Wrapped itself.

Can my users see each other stats? No. Each user authenticates with their own Emby credentials and only sees their own statistics.

How far back does the data go? As far back as the Playback Reporting plugin (or Tracearr) has been collecting data. The plugin only tracks plays after installation.

Can I run this once a year or keep it running? Either way. You can spin it up in December for the annual review and shut it down after, or keep it running year-round for monthly reviews.

Is there a mobile app? No. Emby Wrapped is a web application accessed via browser. It works well on mobile browsers.

Does it support multiple Emby servers? One instance of Emby Wrapped connects to one Emby server. Run multiple containers for multiple servers.


Contributing

Emby Wrapped is open source under the MIT license. Contributions are welcome via pull requests on the beta branch.



Love your Emby stats? Monitor your server in real time too. Download EmbyWatch on Google Play - real-time session monitoring, transcoding diagnostics, and push notifications for your Emby server.

Also running Jellyfin? Download JellyWatch on Google Play - the same monitoring experience built for Jellyfin.

Comments

No comments yet. Be the first to share your thoughts.

Leave a comment

Never displayed publicly.
0 / 2000 · Supports limited Markdown: **bold**, *italic*, `code`, [link](url), lists, > quote.