This plugin populates a list of recently added/deleted/updated media, sends out the newsletter to configured clients(email, discord webhook, telegram & matrix).
C#
125
380 commits
updated Sep 28, 2026

This repository is a maintained fork of the Jellyfin Newsletter Plugin, originally created by Cloud9Developer. As the original repository is no longer actively maintained, this introduces several improvements, new features, and bug fixes, including:
This plugin uses event-driven notifications with scheduled processing. When library changes occur (additions or deletions), they are detected in real-time and stored in the database. A hidden background task processes these events every 30 seconds, and the main Newsletter task generates and sends newsletters containing all accumulated events.
Additionally, the plugin integrates with Radarr and Sonarr to include upcoming media in your newsletters, giving users a preview of what's coming soon to your server.
Before a newsletter goes out you can review the queue on the Preview tab and drop anything you do not want to announce, and pin hand-picked titles to the top of the issue from the Featured tab.
To ensure proper images are being pulled from Jellyfin's database, ensure you follow the standard Organization Scheme for naming and organizing your files. https://jellyfin.org/docs/general/server/media/books
If this format isn't followed properly, Jellyfin may have issue correctly saving the item's data in the proper database (the database that this plugin uses).
Shows
├── Series (2010)
│ ├── Season 00
│ │ ├── Some Special.mkv
│ │ ├── Episode S00E01.mkv
│ │ └── Episode S00E02.mkv
│ ├── Season 01
│ │ ├── Episode S01E01-E02.mkv
│ │ ├── Episode S01E03.mkv
│ │ └── Episode S01E04.mkv
│ └── Season 02
│ ├── Episode S02E01.mkv
│ ├── Episode S02E02.mkv
│ ├── Episode S02E03 Part 1.mkv
│ └── Episode S02E03 Part 2.mkv
└── Series (2018)
├── Episode S01E01.mkv
├── Episode S01E02.mkv
├── Episode S02E01-E02.mkv
└── Episode S02E03.mkv
Movies
├── Film (1990).mp4
├── Film (1994).mp4
├── Film (2008)
│ └── Film.mkv
└── Film (2010)
├── Film-cd1.avi
└── Film-cd2.avi
This plugin uses event-driven notifications with scheduled processing. When library changes occur:
Testing and Frequency can be managed through your Dashboard > Scheduled Tasks
Requires Jellyfin 12.0 or newer. From version 2.0.0.0 the plugin is built against .NET 10 to match Jellyfin 12. On Jellyfin 10.11 or older the catalog will keep offering 1.9.0.0, which is the last release for those servers.
Manifest is up and running! You can now import the manifest in Jellyfin and this plugin will appear in the Catalog!
You can configure multiple Radarr and Sonarr instances. Each instance has its own URL, API key, and instance name. The plugin uses these to fetch upcoming media via the Radarr/Sonarr calendar APIs.
http://localhost:7878 for Radarr, http://localhost:8989 for Sonarr).The "Preview" tab shows everything currently queued for the next newsletter, so you can review and curate it before it is sent.
The "Featured" tab lets you pin hand-picked titles to the top of the next newsletter.
{FeaturedEmoji} placeholder.You can configure Multiple Email Clients. Each client instance has its own SMTP settings, recipients, library selection, event triggers, template settings, and an enable/disable toggle.
Jellyfin Newsletter{NewsletterTitle} tag in the Body HTMLYou can select between different email templates:
<template> tags with IDs to define all event-type headers in a single file:
<template id="header-featured"> - Header for the Featured section<template id="header-add"> - Header for newly added items<template id="header-update"> - Header for updated items<template id="header-delete"> - Header for deleted items<template id="header-upcoming"> - Header for upcoming items{LibraryName} - replaced with the library name (e.g., "Movies", "TV Shows"){FeaturedEmoji} - replaced with the emoji configured on the Featured tab (only used in header-featured)header-featured template, the Featured section is skipped for that client and a warning is logged.You can now configure Multiple Discord Clients. Each client instance can have its own Webhook URL(s), library selection, event triggers, and an enable/disable toggle.
, to send the same notification to multiple channels.,, for example: @everyone, @here, <@&ROLE_ID>, <@USER_ID>.You can now configure Multiple Telegram Clients. Each client instance can have its own Bot Token/Chat IDs, library selection, event configurations, and an enable/disable toggle.
,.You can configure Multiple Matrix Clients. Each client instance can have its own Homeserver URL, Access Token, Room ID(s), library selection, event configurations, and an enable/disable toggle.
https://matrix.org or your self-hosted instance URL).!roomid:matrix.org). You can find this in your Matrix client's room settings. Supports multiple Room IDs: You can enter multiple Room IDs separated by commas ,.Jellyfin Newsletter{NewsletterTitle} tag in the Body HTML<template> tags with IDs to define all event-type headers in a single file:
<template id="header-featured"> - Header for the Featured section<template id="header-add"> - Header for newly added items<template id="header-update"> - Header for updated items<template id="header-delete"> - Header for deleted items<template id="header-upcoming"> - Header for upcoming items{LibraryName} - replaced with the library name (e.g., "Movies", "TV Shows"){FeaturedEmoji} - replaced with the emoji configured on the Featured tab (only used in header-featured)header-featured template, the Featured section is skipped for that client and a warning is logged.Please leave a ticket in the Issues on this GitHub page and I will get to it as soon as I can. Please be patient with me, since I did this on the side of my normal job. But I will try to fix any issues that come up to the best of my ability and as fast as I can!
Some of these may not interest that average user (if anyone), but I figured I would have any element in the Newsletters.db be available for use! <br>
NOTE: Examples of most tags can be found in the default Templates under Templates/ (template_body.html, template_entry.html, template_header.html)
- {EntryData} - Needs to be inside of the 'Body' html
- {Date} - Auto-generated date (yyyy-MM-dd format)
- {d} - Day of the month (e.g. 9, 23)
- {dd} - Zero-padded day of the month (e.g. 09, 23)
- {day} - Full day name (e.g. Wednesday)
- {dy} - Short day name (e.g. Wed)
- {m} - Month of the year (e.g. 4, 11)
- {mm} - Zero-padded month (e.g. 04, 11)
- {month} - Full month name (e.g. April)
- {mon} - Short month name (e.g. Apr)
- {yy} - Two-digit year (e.g. 26)
- {yyyy} - Four-digit year (e.g. 2026)
- {prevDate} - Date of previous newsletter (legacy yyyy-MM-dd format)
- {prevd} - Day of the month of previous newsletter (e.g. 9, 23)
- {prevdd} - Zero-padded day of the month of previous newsletter (e.g. 09, 23)
- {prevday} - Full day name of previous newsletter (e.g. Wednesday)
- {prevdy} - Short day name of previous newsletter (e.g. Wed)
- {prevm} - Month of the year of previous newsletter (e.g. 4, 11)
- {prevmm} - Zero-padded month of previous newsletter (e.g. 04, 11)
- {prevmonth} - Full month name of previous newsletter (e.g. April)
- {prevmon} - Short month name of previous newsletter (e.g. Apr)
- {prevyy} - Two-digit year of previous newsletter (e.g. 26)
- {prevyyyy} - Four-digit year of previous newsletter (e.g. 2026)
Counts cover only the libraries selected on the configuration that is sending the newsletter, so two configurations pointed at different libraries will legitimately show different numbers.
Current library size:
- {MovieCount} - Number of movies (e.g. 14)
- {SeriesCount} - Number of series (e.g. 7)
- {EpisodeCount} - Number of episodes (e.g. 213)
- {ItemCount} - Movies plus episodes (series are containers, so they are not counted here)
Library size when the previous newsletter was sent:
- {prevMovieCount} - Number of movies at the previous newsletter
- {prevSeriesCount} - Number of series at the previous newsletter
- {prevEpisodeCount} - Number of episodes at the previous newsletter
- {prevItemCount} - Movies plus episodes at the previous newsletter
Change since the previous newsletter. These always render with a sign - +2 when items were
added, -3 when items were deleted, 0 when nothing changed:
- {newMovieCount} - Change in movie count (e.g. +2)
- {newSeriesCount} - Change in series count (e.g. +1)
- {newEpisodeCount} - Change in episode count (e.g. -3)
- {newItemCount} - Change in movies plus episodes
Do not put your own + in front of these tags. The sign is already included, so a hardcoded
plus would read as +-3 once media is deleted. Example usage:
Now with {MovieCount} movies and {SeriesCount} shows! ({newMovieCount} since last newsletter!)
On the very first newsletter there is nothing to compare against, so the {prev*} tags equal the
current counts and every {new*} tag reads 0. The comparison becomes meaningful from the second
newsletter onwards.
- {ServerURL} - The configured server URL for Jellyfin
- {NewsletterTitle} - The configured per-client newsletter title - used in the Body template header
- {SeasonEpsInfo} - This tag is the Plugin-generated Season/Episode data
- {Title} - Title of Movie/Series
- {SeriesOverview} - Movie/Series overview
- {ImageURL} - Poster image for the Movie/Series
- {ItemURL} - Direct link to the item in Jellyfin's web interface
- {Type} - Item type (Movie or Series)
- {PremiereYear} - Year Movie/Series was Premiered, in case of upcoming media this is use as the date of release
- {RunTime} - Movie/Episode Duration (for Series, gives first found duration. Will fix for only single episode or average in future update)
- {OfficialRating} - TV-PG, TV-13, TV-14, etc.
- {CommunityRating} - Numerical rating stored in Jellyfin's metadata
- {LibraryName} - The library name (e.g., "Movies", "TV Shows") - used in the Header template
- {FeaturedEmoji} - The configured Featured emoji - used in the 'header-featured' Header template
These tags are available but not recommended to use. Untested behavior using these.
- {Filename} - File path of the Movie/Episode (NOT RECOMMENDED TO USE)
- {Season} - Season number of Episode (NOT RECOMMENDED TO USE)
- {Episode} - Episode number (NOT RECOMMENDED TO USE)
- {ItemID} - Jellyfin's assigned ItemID (NOT RECOMMENDED TO USE)
- {PosterPath} - Jellyfin's assigned Poster Path (NOT RECOMMENDED TO USE)
- {EventBadge} - Visual badge indicating the event type (NEW, UPDATED, REMOVED) (NOT RECOMMENDED TO USE)
See 'issues' tab in GitHub with the label 'bug'
The following features are planned for future releases:
Support for delete events for series/season
Support for update events to update the database
Support for music/audio items
Multiple webhook/telegram ID/email/matrix room ID support with configurable parameters
Upcoming series/episodes section for newsletter
If you would like to collaborate/contribute, feel free! Please see our Contributing Guidelines for details on how to set up the project locally, build it, and submit your Pull Requests.
52 followers · starred Sep 2026
C#
70.1%
HTML
29.0%
This plugin populates a list of recently added/deleted/updated media, sends out the newsletter to configured clients(email, discord webhook, telegram & matrix).
C#
125
380 commits
updated Sep 28, 2026

This repository is a maintained fork of the Jellyfin Newsletter Plugin, originally created by Cloud9Developer. As the original repository is no longer actively maintained, this introduces several improvements, new features, and bug fixes, including:
This plugin uses event-driven notifications with scheduled processing. When library changes occur (additions or deletions), they are detected in real-time and stored in the database. A hidden background task processes these events every 30 seconds, and the main Newsletter task generates and sends newsletters containing all accumulated events.
Additionally, the plugin integrates with Radarr and Sonarr to include upcoming media in your newsletters, giving users a preview of what's coming soon to your server.
Before a newsletter goes out you can review the queue on the Preview tab and drop anything you do not want to announce, and pin hand-picked titles to the top of the issue from the Featured tab.
To ensure proper images are being pulled from Jellyfin's database, ensure you follow the standard Organization Scheme for naming and organizing your files. https://jellyfin.org/docs/general/server/media/books
If this format isn't followed properly, Jellyfin may have issue correctly saving the item's data in the proper database (the database that this plugin uses).
Shows
├── Series (2010)
│ ├── Season 00
│ │ ├── Some Special.mkv
│ │ ├── Episode S00E01.mkv
│ │ └── Episode S00E02.mkv
│ ├── Season 01
│ │ ├── Episode S01E01-E02.mkv
│ │ ├── Episode S01E03.mkv
│ │ └── Episode S01E04.mkv
│ └── Season 02
│ ├── Episode S02E01.mkv
│ ├── Episode S02E02.mkv
│ ├── Episode S02E03 Part 1.mkv
│ └── Episode S02E03 Part 2.mkv
└── Series (2018)
├── Episode S01E01.mkv
├── Episode S01E02.mkv
├── Episode S02E01-E02.mkv
└── Episode S02E03.mkv
Movies
├── Film (1990).mp4
├── Film (1994).mp4
├── Film (2008)
│ └── Film.mkv
└── Film (2010)
├── Film-cd1.avi
└── Film-cd2.avi
This plugin uses event-driven notifications with scheduled processing. When library changes occur:
Testing and Frequency can be managed through your Dashboard > Scheduled Tasks
Requires Jellyfin 12.0 or newer. From version 2.0.0.0 the plugin is built against .NET 10 to match Jellyfin 12. On Jellyfin 10.11 or older the catalog will keep offering 1.9.0.0, which is the last release for those servers.
Manifest is up and running! You can now import the manifest in Jellyfin and this plugin will appear in the Catalog!
You can configure multiple Radarr and Sonarr instances. Each instance has its own URL, API key, and instance name. The plugin uses these to fetch upcoming media via the Radarr/Sonarr calendar APIs.
http://localhost:7878 for Radarr, http://localhost:8989 for Sonarr).The "Preview" tab shows everything currently queued for the next newsletter, so you can review and curate it before it is sent.
The "Featured" tab lets you pin hand-picked titles to the top of the next newsletter.
{FeaturedEmoji} placeholder.You can configure Multiple Email Clients. Each client instance has its own SMTP settings, recipients, library selection, event triggers, template settings, and an enable/disable toggle.
Jellyfin Newsletter{NewsletterTitle} tag in the Body HTMLYou can select between different email templates:
<template> tags with IDs to define all event-type headers in a single file:
<template id="header-featured"> - Header for the Featured section<template id="header-add"> - Header for newly added items<template id="header-update"> - Header for updated items<template id="header-delete"> - Header for deleted items<template id="header-upcoming"> - Header for upcoming items{LibraryName} - replaced with the library name (e.g., "Movies", "TV Shows"){FeaturedEmoji} - replaced with the emoji configured on the Featured tab (only used in header-featured)header-featured template, the Featured section is skipped for that client and a warning is logged.You can now configure Multiple Discord Clients. Each client instance can have its own Webhook URL(s), library selection, event triggers, and an enable/disable toggle.
, to send the same notification to multiple channels.,, for example: @everyone, @here, <@&ROLE_ID>, <@USER_ID>.You can now configure Multiple Telegram Clients. Each client instance can have its own Bot Token/Chat IDs, library selection, event configurations, and an enable/disable toggle.
,.You can configure Multiple Matrix Clients. Each client instance can have its own Homeserver URL, Access Token, Room ID(s), library selection, event configurations, and an enable/disable toggle.
https://matrix.org or your self-hosted instance URL).!roomid:matrix.org). You can find this in your Matrix client's room settings. Supports multiple Room IDs: You can enter multiple Room IDs separated by commas ,.Jellyfin Newsletter{NewsletterTitle} tag in the Body HTML<template> tags with IDs to define all event-type headers in a single file:
<template id="header-featured"> - Header for the Featured section<template id="header-add"> - Header for newly added items<template id="header-update"> - Header for updated items<template id="header-delete"> - Header for deleted items<template id="header-upcoming"> - Header for upcoming items{LibraryName} - replaced with the library name (e.g., "Movies", "TV Shows"){FeaturedEmoji} - replaced with the emoji configured on the Featured tab (only used in header-featured)header-featured template, the Featured section is skipped for that client and a warning is logged.Please leave a ticket in the Issues on this GitHub page and I will get to it as soon as I can. Please be patient with me, since I did this on the side of my normal job. But I will try to fix any issues that come up to the best of my ability and as fast as I can!
Some of these may not interest that average user (if anyone), but I figured I would have any element in the Newsletters.db be available for use! <br>
NOTE: Examples of most tags can be found in the default Templates under Templates/ (template_body.html, template_entry.html, template_header.html)
- {EntryData} - Needs to be inside of the 'Body' html
- {Date} - Auto-generated date (yyyy-MM-dd format)
- {d} - Day of the month (e.g. 9, 23)
- {dd} - Zero-padded day of the month (e.g. 09, 23)
- {day} - Full day name (e.g. Wednesday)
- {dy} - Short day name (e.g. Wed)
- {m} - Month of the year (e.g. 4, 11)
- {mm} - Zero-padded month (e.g. 04, 11)
- {month} - Full month name (e.g. April)
- {mon} - Short month name (e.g. Apr)
- {yy} - Two-digit year (e.g. 26)
- {yyyy} - Four-digit year (e.g. 2026)
- {prevDate} - Date of previous newsletter (legacy yyyy-MM-dd format)
- {prevd} - Day of the month of previous newsletter (e.g. 9, 23)
- {prevdd} - Zero-padded day of the month of previous newsletter (e.g. 09, 23)
- {prevday} - Full day name of previous newsletter (e.g. Wednesday)
- {prevdy} - Short day name of previous newsletter (e.g. Wed)
- {prevm} - Month of the year of previous newsletter (e.g. 4, 11)
- {prevmm} - Zero-padded month of previous newsletter (e.g. 04, 11)
- {prevmonth} - Full month name of previous newsletter (e.g. April)
- {prevmon} - Short month name of previous newsletter (e.g. Apr)
- {prevyy} - Two-digit year of previous newsletter (e.g. 26)
- {prevyyyy} - Four-digit year of previous newsletter (e.g. 2026)
Counts cover only the libraries selected on the configuration that is sending the newsletter, so two configurations pointed at different libraries will legitimately show different numbers.
Current library size:
- {MovieCount} - Number of movies (e.g. 14)
- {SeriesCount} - Number of series (e.g. 7)
- {EpisodeCount} - Number of episodes (e.g. 213)
- {ItemCount} - Movies plus episodes (series are containers, so they are not counted here)
Library size when the previous newsletter was sent:
- {prevMovieCount} - Number of movies at the previous newsletter
- {prevSeriesCount} - Number of series at the previous newsletter
- {prevEpisodeCount} - Number of episodes at the previous newsletter
- {prevItemCount} - Movies plus episodes at the previous newsletter
Change since the previous newsletter. These always render with a sign - +2 when items were
added, -3 when items were deleted, 0 when nothing changed:
- {newMovieCount} - Change in movie count (e.g. +2)
- {newSeriesCount} - Change in series count (e.g. +1)
- {newEpisodeCount} - Change in episode count (e.g. -3)
- {newItemCount} - Change in movies plus episodes
Do not put your own + in front of these tags. The sign is already included, so a hardcoded
plus would read as +-3 once media is deleted. Example usage:
Now with {MovieCount} movies and {SeriesCount} shows! ({newMovieCount} since last newsletter!)
On the very first newsletter there is nothing to compare against, so the {prev*} tags equal the
current counts and every {new*} tag reads 0. The comparison becomes meaningful from the second
newsletter onwards.
- {ServerURL} - The configured server URL for Jellyfin
- {NewsletterTitle} - The configured per-client newsletter title - used in the Body template header
- {SeasonEpsInfo} - This tag is the Plugin-generated Season/Episode data
- {Title} - Title of Movie/Series
- {SeriesOverview} - Movie/Series overview
- {ImageURL} - Poster image for the Movie/Series
- {ItemURL} - Direct link to the item in Jellyfin's web interface
- {Type} - Item type (Movie or Series)
- {PremiereYear} - Year Movie/Series was Premiered, in case of upcoming media this is use as the date of release
- {RunTime} - Movie/Episode Duration (for Series, gives first found duration. Will fix for only single episode or average in future update)
- {OfficialRating} - TV-PG, TV-13, TV-14, etc.
- {CommunityRating} - Numerical rating stored in Jellyfin's metadata
- {LibraryName} - The library name (e.g., "Movies", "TV Shows") - used in the Header template
- {FeaturedEmoji} - The configured Featured emoji - used in the 'header-featured' Header template
These tags are available but not recommended to use. Untested behavior using these.
- {Filename} - File path of the Movie/Episode (NOT RECOMMENDED TO USE)
- {Season} - Season number of Episode (NOT RECOMMENDED TO USE)
- {Episode} - Episode number (NOT RECOMMENDED TO USE)
- {ItemID} - Jellyfin's assigned ItemID (NOT RECOMMENDED TO USE)
- {PosterPath} - Jellyfin's assigned Poster Path (NOT RECOMMENDED TO USE)
- {EventBadge} - Visual badge indicating the event type (NEW, UPDATED, REMOVED) (NOT RECOMMENDED TO USE)
See 'issues' tab in GitHub with the label 'bug'
The following features are planned for future releases:
Support for delete events for series/season
Support for update events to update the database
Support for music/audio items
Multiple webhook/telegram ID/email/matrix room ID support with configurable parameters
Upcoming series/episodes section for newsletter
If you would like to collaborate/contribute, feel free! Please see our Contributing Guidelines for details on how to set up the project locally, build it, and submit your Pull Requests.
52 followers · starred Sep 2026
C#
70.1%
HTML
29.0%