npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

unwatched-jellyfin

v1.1.0

Published

CLI tool to identify and delete old, unwatched TV series from Sonarr based on Jellyfin playback data

Readme

unwatched-jellyfin

A CLI tool to identify and optionally delete old, unwatched TV series from Sonarr based on Jellyfin playback data.

Features

  • Identifies series with 0% watched episodes older than a threshold (default: 365 days)
  • Calculates disk space that would be freed
  • Deletes episode files from Sonarr (not entire series)
  • Unmonitors series to prevent re-downloading
  • Dry-run mode for safe testing

Installation

bun install

Usage

Via npx (recommended):

# Dry run (default) - shows what would be deleted
npx unwatched-jellyfin --dry-run

# Execute deletions with custom age threshold
npx unwatched-jellyfin --days=180 --execute

# Show help
npx unwatched-jellyfin --help

Via bun run (for development):

bun run index.ts --help
bun run index.ts --days=365 --dry-run
bun run index.ts --execute

CLI Options

  • --sonarr-url <url> - Sonarr server URL (default: SONARR_URL env var)
  • --sonarr-api-key <key> - Sonarr API key (default: SONARR_API_KEY env var)
  • --jellyfin-url <url> - Jellyfin server URL (default: JELLYFIN_URL env var)
  • --jellyfin-username <user> - Jellyfin username (default: JELLYFIN_USERNAME env var)
  • --jellyfin-password <pass> - Jellyfin password (default: JELLYFIN_PASSWORD env var)
  • --days <number> - Age threshold in days (default: 365)
  • --dry-run, -d - Dry run mode (default)
  • --execute, -e - Execute deletions (not dry run)
  • --help, -h - Show help message

Environment Variables

All sensitive credentials can be set via environment variables (see .env.example for template):

  • SONARR_URL - Sonarr server URL
  • SONARR_API_KEY - Sonarr API key
  • JELLYFIN_URL - Jellyfin server URL
  • JELLYFIN_USERNAME - Jellyfin username
  • JELLYFIN_PASSWORD - Jellyfin password
  • AGE_THRESHOLD_DAYS - Age threshold in days (default: 365)
  • DRY_RUN - Set to "false" to execute deletions (default: "true")

How It Works

  1. Authenticates with Jellyfin to fetch all episodes and their watch status
  2. Groups episodes by series to identify fully unwatched series (0% watched)
  3. Filters series where the oldest episode is older than the threshold
  4. Cross-references with Sonarr to find matching series
  5. Calculates disk space that would be freed
  6. If not dry-run: deletes all episode files and unmonitors each series

Requirements

License

MIT