A Plex year in review for any server. Turn your server's playback stats into an Instagram-ready recap: five slides, a single-page infographic, or a 30-second animated video with sound, in seven designed styles. It all runs on your own machine from a backup of your Plex database. There's no hosted service, Plex token or account involved.
| Output | Files | Best for |
|---|---|---|
| Five slides | slide-1.png … slide-5.png |
An Instagram carousel |
| Infographic | infographic.png |
One feed post with everything on it |
| Video | rewind.mp4 (about 30 s, with sound) |
A video post |
Everything is 1080 × 1350 (4:5), Instagram's portrait feed size.
The slides cover the year in order: the cover with how far into the year the stats run, the numbers (plays, hours, viewers, data delivered, the busiest month), what everyone watched (top shows and movies), the library (what's on the server and how much of it is new this year), and a closing slide that can thank people or ask for donations.
| The video | The infographic |
|---|---|
![]() |
![]() |
You need Python 3.10+. For video, also install ffmpeg.
git clone https://github.com/antonflor/rewind-studio.git
cd rewind-studio
python -m pip install -r requirements.txt
python -m playwright install chromium
python rewind.py render --data examples/odyssey-2026.json --name "The Vault" --format all --out outputpython rewind.py styles lists the designs. Add --style to pick one; this run used --style ticket.
That renders the bundled example stats under the name "The Vault": five slides, the infographic and the video, in output/. Change --name to your server's name. Any name works, from "Jones" to "Movie Night at the Garcia House"; long names shrink to fit.
Then make one from your own server.
Pick one with --style. Every style draws the same numbers. These are the seven covers, left to right: editorial, marquee, ticket, broadsheet, terminal, swiss, vhs.
Open a style to see all five slides and the infographic.
editorial: warm ink on near-black, Plex gold, condensed numerals, mono labels. Quiet and data-first. The default.
broadsheet: a newspaper front page with your server's name as the masthead, serif headlines and column rules.
terminal: an amber-phosphor console with shell prompts, pixel numerals and block bars. In video, lines print like terminal output.
Each style is a single stylesheet over shared markup, so adding your own doesn't touch any Python. See studio/styles/README.md.
-
Get a standalone backup of your Plex library database (
com.plexapp.plugins.library.db, usually with a date suffix). Never point Rewind Studio at the live database while Plex is writing to it. The setup guide lists where backups live on Windows, macOS, Linux, Docker and NAS installs. -
Extract the stats:
python rewind.py extract --db "/full/path/to/your/plex-backup.db" --year 2026 --out stats.json -
Optional: add
"library_size_label": "~10 TiB"tostats.json. Plex's database doesn't know how big your library is on disk. -
Render:
python rewind.py render --data stats.json --name "Your Server" --style marquee --cta thanks --format all --out output
stats.json holds aggregated counts and top titles only, with no account names or per-person history. It still describes your library, so look it over before sharing it.
| Option | What it does |
|---|---|
--name "Your Server" |
Your server's name, shown on every slide (default: My Media Server) |
--style NAME |
editorial (default), marquee, ticket, broadsheet, terminal, swiss, vhs |
--format |
slides (default), infographic, both, video, all |
--cta |
Closing slide: none (default), thanks, or donation |
--cta-text "…" |
Write the closing message yourself |
--cta-methods "Ko-fi / Venmo" |
Donation options to list (default: PayPal / Zelle / DM) |
--theme NAME |
Recolor and relabel a style with a template from templates/ (aurora, forest, or your own) |
--no-sound |
Video without the sound bed |
Templates are small JSON files with five colors and optional headline text. python rewind.py templates lists them, and templates/README.md describes the format.
Every number on a card comes from your stats or from plain arithmetic on them, like plays per day, the top shows' share of all plays, or how much of the library was added this year. Nothing is estimated. When your stats don't include something (no busiest month, no music library, fewer than three top titles), that part is left out rather than filled in. A "play" is a playback event, not necessarily a finished watch, and the cards say so.
rewind.py extract reads a read-only, immutable copy of your database backup. rewind.py render loads the shared markup with a style's stylesheet in headless Chromium (through Playwright) and screenshots each card. Fonts are bundled (SIL Open Font License), so renders look identical on every machine and never fetch anything from the network. For video, each card's motion is stepped frame by frame and encoded with ffmpeg; the sound is synthesized with numpy, so there are no audio files to license.
Already have Chrome or Chromium installed? Set REWIND_CHROMIUM to its path and skip playwright install.
rewind.py CLI: extract, render, styles, templates
requirements.txt Playwright + numpy
examples/odyssey-2026.json Sample aggregated stats
studio/model.py Stats -> the numbers and sentences on the cards
studio/base.html Shared markup for all six cards
studio/styles/<name>/ One stylesheet + metadata per style
studio/runtime/ Data binding, shrink-to-fit and motion
studio/engine.py Chromium rendering and video export
studio/sound.py Synthesized sound bed
studio/fonts/ Bundled open-license fonts
templates/ Color and label templates
docs/ Setup guide, troubleshooting, images
docs/make_images.py Regenerates every README image from the example stats
- Setup guide: Windows, macOS, Linux, Docker, NAS and seedbox
- Troubleshooting
- Make a style
Rewind Studio is an early command-line tool and hasn't been tested against every Plex version yet. Odyssey, the server the example stats come from, is just the sample; use any name.
Not affiliated with Plex.











