![]()
Also by me: MediaWall · JellyTag-Plus · TaskGrid
Pixelfin is a Jellyfin artwork inspector. It helps you see which images are missing, which images are low or high resolution, and which artwork needs a human judgment call instead of whatever Jellyfin grabbed automatically.
It also gives you a practical way to back up Jellyfin artwork to ZIP files and restore those images later, including dry runs and side-by-side comparisons before you write anything back to Jellyfin.
I’m a bit obsessive about Jellyfin.
One thing I’m especially obsessive about is artwork. Posters, backdrops, logos, thumbnails, ClearArt, all of it. To me, a big part of what makes a media library feel “premium” is the artwork. Consistent, high-quality images can make a collection of files feel curated, browsable, and actually enjoyable to explore. Not boasting, but I’ve gotten a lot of great feedback about, and donations for, my Jellyfin server, and I think I owe a lot of that to curating my images well.
And that last bit is thanks to Pixelfin.
Pixelfin is an app that helps you audit and review the artwork in your Jellyfin libraries. It can generate galleries of your media so you can quickly see what artwork each media item has, what it’s missing, and what might need improvement. It checks image types like Primary, Backdrop, Logo, ClearArt, Banner, Thumb, and more, and can flag images that fall below your minimum resolution threshold or exceed your maximum resolution threshold.
The main point is pretty simple: I wanted a faster way to look at my library’s artwork and make judgment calls.
Things like:
Pixelfin gives you a summary table, and you can click a title to jump directly to that item’s gallery section. From there, you can click the gallery title to open the item in Jellyfin and make your changes.
It can also generate HTML galleries that embed your images, export a library’s artwork to ZIP files, and restore artwork back to Jellyfin from ZIP, complete with dry-run and a side-by-side comparison.
You might be thinking, why not just save images alongside the media files? That’s totally valid, but personally I don’t do that. I like having Jellyfin store images on my NVMe SSD for faster access, and the ZIP backup and restore workflow is also useful if you’re migrating servers or rebuilding things later.
The backup and restore features are nice, but the main reason Pixelfin exists is still the artwork review process. I wanted a clear, visual way to scan through a library and spot what needs attention.
Disclaimer: Pixelfin is vibecoded with Codex. I use it, it works well for me, and other people have found it useful too. That said, it’s still a local tool built by someone solving a very specific Jellyfin artwork problem, not a hardened production app.
Security Note: Pixelfin is not built with security in mind. Run it locally only, or on a trusted private network. Don’t expose it to the internet.
Pixelfin v0.35.8 was mainly a Flask app around Python scripts that generated static HTML reports.
Pixelfin v1.0.0 turns Pixelfin into a proper local, server-backed web app. It keeps the core Jellyfin and Python logic, but adds cached scan state, dynamic library views, settings, restore review screens, and per-item updates.
You can now scan, filter, inspect, export, restore, and adjust rules from one interactive UI, while still keeping the classic HTML and ZIP exports when you want portable files.
Breaking or migration notes:
http://localhost:1280./classic.data/fresh.db.data/history.json, old generated HTML files, and old ZIP exports are not deleted.output/<Library>/ stay where they are. Pixelfin can still list and download generated files from output/, but the new app uses its own settings and scan cache.![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Pixelfin can show a summary table and visual gallery for each media item. It can flag missing images and images below your minimum resolution rules.
Supported image types include:
You can use the Full layout when you want the classic big visual review, or Compact layout when you want to scan quickly.
Based on the current code, Pixelfin supports these Jellyfin library types:
Live TV and Playlists are intentionally hidden because Pixelfin can’t work with those images correctly yet.
Pixelfin uses cached scan state so it doesn’t have to request every image from Jellyfin constantly. That keeps the app faster and helps avoid hammering Jellyfin while real clients are using it.
Because of that, changes made in Jellyfin don’t appear instantly. After changing artwork in Jellyfin, use one of these:
Update on a single media item.Refresh while viewing a library.Scan from a library card.Scan All Libraries from the main screen.You can choose which image types matter for each library and set minimum resolution thresholds. There are global defaults, and you can override rules per library.
Season Posters are treated as a special image type. Pixelfin checks each season poster, and season posters inherited from the series primary image are counted as missing.
Pixelfin can also opt into extra checks:
\, show keyboard shortcuts.t, scroll to top.a, open All Tasks.9, toggle Full or Compact layout.0, cycle themes.c, hide or show complete items when a library listing is open.s, toggle sorting by title or date added when a listing is open.Esc, close popups and lightboxes.Left / Right, move between images in lightbox.Up / Down, move between media items in lightbox.If you use JellyTag-Plus, Pixelfin can request original images with jellytag=off. This applies to the main app display, scans, exports, and restore comparison previews.
Pixelfin can still generate classic-style HTML galleries. This is useful when you want a portable report outside the live app.
The generated HTML includes:
Pixelfin can export selected artwork to ZIP. When you download a ZIP, Pixelfin also saves it internally under output/<Library>/.
ZIP exports are useful if you want to:
Some users save artwork alongside media files, and that’s totally valid. I personally don’t, because I like having Jellyfin store images on my NVMe SSD for faster access. ZIP backup and restore gives me a separate way to preserve artwork without changing how my media folders are organized.
Pixelfin can restore artwork from a Pixelfin ZIP or an external ZIP.
The restore process includes:
Dry run means Pixelfin reviews what it would do without uploading anything to Jellyfin.
Requirements:
Pixelfin supports Jellyfin v12 authentication. If server tests or scans still fail with authentication errors, generate a new Jellyfin API key and save the server again in Pixelfin.
Install dependencies:
pip install -r requirements.txt
Run Pixelfin:
python app.py
Open:
http://localhost:1280
If that doesn’t work, try:
http://<local-ip>:1280
Use this when you want Docker to build the image locally from this repository.
docker compose -f docker-compose-build.yml up -d --build
Then open:
http://localhost:1280
The compose file uses relative folders:
./data:/app/data./output:/app/output./assets:/app/assetsdata/ stores Pixelfin settings and scan state. output/ stores generated HTML and ZIP files.
Use this when you want the published Docker image from GitHub Container Registry.
docker compose up -d
The default image is:
ghcr.io/nothing2obvi/pixelfin:latest
The current release image is:
ghcr.io/nothing2obvi/pixelfin:v1.0.9
Open:
http://localhost:1280
The current Docker release publishes multi-architecture images for:
linux/amd64linux/arm64Tags:
ghcr.io/nothing2obvi/pixelfin:v1.0.9ghcr.io/nothing2obvi/pixelfin:latest/classic for now.output/ can grow if you generate a lot of exports. The Auto settings can limit how many ZIPs are kept per library.Pixelfin is a practical little tool that grew out of me wanting my Jellyfin artwork to look better. If you see a bug, have a better way to structure something, or want to improve the UI, pull requests and issues are welcome.
Some ideas:
MIT, feel free to use, modify, and share.
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind are welcome.
84 commits
3 commits
Python
53.1%
HTML
46.8%
![]()
Also by me: MediaWall · JellyTag-Plus · TaskGrid
Pixelfin is a Jellyfin artwork inspector. It helps you see which images are missing, which images are low or high resolution, and which artwork needs a human judgment call instead of whatever Jellyfin grabbed automatically.
It also gives you a practical way to back up Jellyfin artwork to ZIP files and restore those images later, including dry runs and side-by-side comparisons before you write anything back to Jellyfin.
I’m a bit obsessive about Jellyfin.
One thing I’m especially obsessive about is artwork. Posters, backdrops, logos, thumbnails, ClearArt, all of it. To me, a big part of what makes a media library feel “premium” is the artwork. Consistent, high-quality images can make a collection of files feel curated, browsable, and actually enjoyable to explore. Not boasting, but I’ve gotten a lot of great feedback about, and donations for, my Jellyfin server, and I think I owe a lot of that to curating my images well.
And that last bit is thanks to Pixelfin.
Pixelfin is an app that helps you audit and review the artwork in your Jellyfin libraries. It can generate galleries of your media so you can quickly see what artwork each media item has, what it’s missing, and what might need improvement. It checks image types like Primary, Backdrop, Logo, ClearArt, Banner, Thumb, and more, and can flag images that fall below your minimum resolution threshold or exceed your maximum resolution threshold.
The main point is pretty simple: I wanted a faster way to look at my library’s artwork and make judgment calls.
Things like:
Pixelfin gives you a summary table, and you can click a title to jump directly to that item’s gallery section. From there, you can click the gallery title to open the item in Jellyfin and make your changes.
It can also generate HTML galleries that embed your images, export a library’s artwork to ZIP files, and restore artwork back to Jellyfin from ZIP, complete with dry-run and a side-by-side comparison.
You might be thinking, why not just save images alongside the media files? That’s totally valid, but personally I don’t do that. I like having Jellyfin store images on my NVMe SSD for faster access, and the ZIP backup and restore workflow is also useful if you’re migrating servers or rebuilding things later.
The backup and restore features are nice, but the main reason Pixelfin exists is still the artwork review process. I wanted a clear, visual way to scan through a library and spot what needs attention.
Disclaimer: Pixelfin is vibecoded with Codex. I use it, it works well for me, and other people have found it useful too. That said, it’s still a local tool built by someone solving a very specific Jellyfin artwork problem, not a hardened production app.
Security Note: Pixelfin is not built with security in mind. Run it locally only, or on a trusted private network. Don’t expose it to the internet.
Pixelfin v0.35.8 was mainly a Flask app around Python scripts that generated static HTML reports.
Pixelfin v1.0.0 turns Pixelfin into a proper local, server-backed web app. It keeps the core Jellyfin and Python logic, but adds cached scan state, dynamic library views, settings, restore review screens, and per-item updates.
You can now scan, filter, inspect, export, restore, and adjust rules from one interactive UI, while still keeping the classic HTML and ZIP exports when you want portable files.
Breaking or migration notes:
http://localhost:1280./classic.data/fresh.db.data/history.json, old generated HTML files, and old ZIP exports are not deleted.output/<Library>/ stay where they are. Pixelfin can still list and download generated files from output/, but the new app uses its own settings and scan cache.![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Pixelfin can show a summary table and visual gallery for each media item. It can flag missing images and images below your minimum resolution rules.
Supported image types include:
You can use the Full layout when you want the classic big visual review, or Compact layout when you want to scan quickly.
Based on the current code, Pixelfin supports these Jellyfin library types:
Live TV and Playlists are intentionally hidden because Pixelfin can’t work with those images correctly yet.
Pixelfin uses cached scan state so it doesn’t have to request every image from Jellyfin constantly. That keeps the app faster and helps avoid hammering Jellyfin while real clients are using it.
Because of that, changes made in Jellyfin don’t appear instantly. After changing artwork in Jellyfin, use one of these:
Update on a single media item.Refresh while viewing a library.Scan from a library card.Scan All Libraries from the main screen.You can choose which image types matter for each library and set minimum resolution thresholds. There are global defaults, and you can override rules per library.
Season Posters are treated as a special image type. Pixelfin checks each season poster, and season posters inherited from the series primary image are counted as missing.
Pixelfin can also opt into extra checks:
\, show keyboard shortcuts.t, scroll to top.a, open All Tasks.9, toggle Full or Compact layout.0, cycle themes.c, hide or show complete items when a library listing is open.s, toggle sorting by title or date added when a listing is open.Esc, close popups and lightboxes.Left / Right, move between images in lightbox.Up / Down, move between media items in lightbox.If you use JellyTag-Plus, Pixelfin can request original images with jellytag=off. This applies to the main app display, scans, exports, and restore comparison previews.
Pixelfin can still generate classic-style HTML galleries. This is useful when you want a portable report outside the live app.
The generated HTML includes:
Pixelfin can export selected artwork to ZIP. When you download a ZIP, Pixelfin also saves it internally under output/<Library>/.
ZIP exports are useful if you want to:
Some users save artwork alongside media files, and that’s totally valid. I personally don’t, because I like having Jellyfin store images on my NVMe SSD for faster access. ZIP backup and restore gives me a separate way to preserve artwork without changing how my media folders are organized.
Pixelfin can restore artwork from a Pixelfin ZIP or an external ZIP.
The restore process includes:
Dry run means Pixelfin reviews what it would do without uploading anything to Jellyfin.
Requirements:
Pixelfin supports Jellyfin v12 authentication. If server tests or scans still fail with authentication errors, generate a new Jellyfin API key and save the server again in Pixelfin.
Install dependencies:
pip install -r requirements.txt
Run Pixelfin:
python app.py
Open:
http://localhost:1280
If that doesn’t work, try:
http://<local-ip>:1280
Use this when you want Docker to build the image locally from this repository.
docker compose -f docker-compose-build.yml up -d --build
Then open:
http://localhost:1280
The compose file uses relative folders:
./data:/app/data./output:/app/output./assets:/app/assetsdata/ stores Pixelfin settings and scan state. output/ stores generated HTML and ZIP files.
Use this when you want the published Docker image from GitHub Container Registry.
docker compose up -d
The default image is:
ghcr.io/nothing2obvi/pixelfin:latest
The current release image is:
ghcr.io/nothing2obvi/pixelfin:v1.0.9
Open:
http://localhost:1280
The current Docker release publishes multi-architecture images for:
linux/amd64linux/arm64Tags:
ghcr.io/nothing2obvi/pixelfin:v1.0.9ghcr.io/nothing2obvi/pixelfin:latest/classic for now.output/ can grow if you generate a lot of exports. The Auto settings can limit how many ZIPs are kept per library.Pixelfin is a practical little tool that grew out of me wanting my Jellyfin artwork to look better. If you see a bug, have a better way to structure something, or want to improve the UI, pull requests and issues are welcome.
Some ideas:
MIT, feel free to use, modify, and share.
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind are welcome.
84 commits
3 commits
Python
53.1%
HTML
46.8%