• v1.8.0 770b27905c

    v1.8.0
    All checks were successful
    CI / gate (push) Successful in 57s
    CI / lint (push) Successful in 56s
    CI / image (push) Successful in 1m6s
    Stable

    joeyr released this 2026-10-22 19:15:49 -05:00 | 0 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Added

    • A web page for a dry run and for the recipients list, switched on by
      WEB_UI_PORT, the port to serve it on inside the container. It has no
      login: publish it on a LAN port only, never through a public proxy. A form
      posted from another site is refused, so a web page open on the LAN can't
      use it.
    • Dry run: builds the email the next run would send, as of now, and shows
      it on the page with its subject. Nothing is emailed and nothing is
      recorded: not the announced items, not the last newsletter's date. Since
      1.5.0 the whole library counts as announced once deployed, so a quiet week
      previews as "nothing new". Tick "Include items already sent" to see
      everything from the observed period instead.
    • Recipients: add, pause, switch on and remove addresses in
      config.yml. The page edits the file's text, so every comment and the line
      endings stay as they were. A paused address is its line commented out
      (# - "…"), the way the file already pauses one by hand. Before an edit
      is saved, the file has to pass the checks it gets at startup, and the last
      address that is on can't be paused or removed, since config.yml doesn't
      load without one.

    Changed

    • The recipients are read from config.yml when the email goes out, not
      only at startup, so a change made on the page, or by hand, applies to the
      next email without a restart. If the file can't be read then, the list
      from startup is used and a warning is logged.
    Downloads
  • v1.7.0 60935f7dc6

    v1.7.0
    All checks were successful
    CI / gate (push) Successful in 55s
    CI / lint (push) Successful in 54s
    CI / image (push) Successful in 51s
    Stable

    joeyr released this 2026-10-06 20:15:47 -05:00 | 2 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Changed

    • Every new item is looked up on TMDB again. Since 1.0.4 only the items
      the email shows were looked up, chosen by a second pass over the items
      (DisplayedItemIDs) that repeated the email build's filtering and sorting.
      It was written for a week of 500 re-created films. Since 1.5.0 those no
      longer count as new, so the pass only saves a quick lookup per item past
      max_displayed_items in a genuinely big week. Removing it takes seven of
      the fork's edits out of upstream files.
    • The HTML and plain-text parts are built from one pass over the items
      (template.BuildNewMediaEmail), instead of one each.
    • The fork's own strings are English only. The inbox preview line ("3 new
      movies and 5 new shows") was translated into all ten languages. Other
      languages now fall back to the English line, whole: its "and" is a fork
      string too, so it is never half translated.
    • Files check out with LF line endings on every machine
      (.gitattributes, as in mcp-gateway). With core.autocrlf, a Windows
      checkout had CRLF everywhere, so gofmt flagged every file and the
      plain-text template had to be stripped of \r when it was read.
    • CI no longer runs go vet on its own. The lint job already runs govet,
      with every analyzer on.

    Fixed

    • Each ignored_items match was logged twice, once for each part of the
      email.
    Downloads
  • v1.6.0 ab90b47702

    v1.6.0
    All checks were successful
    CI / gate (push) Successful in 1m1s
    CI / lint (push) Successful in 55s
    CI / image (push) Successful in 53s
    Stable

    joeyr released this 2026-10-05 23:59:15 -05:00 | 4 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Added

    • An inbox preview line. The classic theme always had a hidden preheader
      but left it empty, so inbox lists showed the email's first words ("New on
      the server …") after the subject. It now says what's new, such as "3 new
      movies and 5 new shows", counting every new item, including those beyond
      max_displayed_items. The strings are in all ten languages, in the fork's
      own i18n/fork.<lang>.toml beside upstream's files.

    Changed

    • The email is about a quarter of its old size. About three quarters of
      the rendered HTML was the theme's indentation. Each run of whitespace now
      collapses to one newline or space after rendering (<pre> excepted), which
      mail clients render the same. An email of 6 movies and 6 shows went from
      88 KB to about 22 KB. Gmail clips an email whose HTML passes ~102 KB, so
      there is now room for summaries (display_overview_max_items: 0) and a
      higher max_displayed_items: 6 per section with summaries measured 28 KB,
      20 per section 76 KB.
    Downloads
  • v1.5.3 32058afed6

    v1.5.3
    All checks were successful
    CI / gate (push) Successful in 1m1s
    CI / lint (push) Successful in 56s
    CI / image (push) Successful in 51s
    Stable

    joeyr released this 2026-10-05 22:53:39 -05:00 | 6 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Fixed

    • The integration test runs again. Its recorded Jellyfin traffic
      predated the fork's own requests (the movie type filter in 1.0.3, the TV
      library lookup in 1.4.1), so replay missed and the run retried until the
      test timed out. The Jellyfin and TMDB traffic is re-recorded against
      upstream's test Jellyfin (now 12.2), the test's fixed clock and date
      assertions follow, and the whole suite passes with the integration tag.
      No change to the newsletter itself.
    Downloads
  • v1.5.2 2443a362e4

    v1.5.2
    All checks were successful
    CI / gate (push) Successful in 1m0s
    CI / lint (push) Successful in 54s
    CI / image (push) Successful in 51s
    Stable

    joeyr released this 2026-10-05 22:40:28 -05:00 | 8 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Fixed

    • "Added on" could show tomorrow's date. Jellyfin's dates are UTC and
      were printed as they came, so anything added in the evening in the
      Americas showed the next day. They are now in the container's time zone
      (TZ).
    • Spam filters counted the unsubscribe header against the email.
      SpamAssassin scores a List-Unsubscribe without a List-Id as an
      incomplete set (+1.0). The email now has both, the List-Id named after
      the sender's domain. On a local SpamAssassin run the email scores 0
      (before 1.2.0 it scored 3.2: no Date, HTML only, Message-ID added by
      a relay).
    Downloads
  • v1.5.1 dfce205a2c

    v1.5.1
    All checks were successful
    CI / gate (push) Successful in 1m0s
    CI / lint (push) Successful in 58s
    CI / image (push) Successful in 57s
    Stable

    joeyr released this 2026-10-05 21:36:47 -05:00 | 10 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Fixed

    • "recieving" in every email's footer is now "receiving". The typo is
      in upstream's English text.
    Downloads
  • v1.5.0 96d45c9c92

    v1.5.0
    All checks were successful
    CI / gate (push) Successful in 1m2s
    CI / lint (push) Successful in 58s
    CI / image (push) Successful in 50s
    Stable

    joeyr released this 2026-10-05 21:06:34 -05:00 | 12 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Added

    • The newsletter remembers what it has announced, in
      ANNOUNCED_ITEMS.json next to config.yml. "New" used to mean only
      "created in Jellyfin during the period", and Jellyfin re-creates an item
      whenever Radarr or Sonarr renames or upgrades it, so old films came back
      as new by the hundred. Now a movie is announced once per film (by TMDB
      ID, so a 4K copy of an announced film isn't new either), and an episode
      once per series, season and episode number, so a new season or episode
      still is. The extra day the period reaches back no longer announces
      anything twice.
    • On the first start without that file, the whole current library is
      recorded as already announced
      , so the first newsletter has only what
      arrives after the upgrade. The log says how many movies and episodes it
      recorded. Delete the file to start over the same way. A dry run reads the
      file but never writes it.
    Downloads
  • v1.4.1 407083fc51

    v1.4.1
    All checks were successful
    CI / gate (push) Successful in 1m1s
    CI / lint (push) Successful in 57s
    CI / image (push) Successful in 51s
    Stable

    joeyr released this 2026-10-05 20:55:31 -05:00 | 14 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Fixed

    • New episodes of some shows could be left out. TV was fetched with a
      recursive query by the watched folder, and Jellyfin's answer to that
      omits items whose ancestor index is stale, even though the same query by
      library returns them. On one server it missed 13 of 52 series and 956
      episodes in a folder, and logged 90 "series doesn't exist" warnings per
      run. TV is now fetched through the library that lists the folder, keeping
      only that folder's shows; a library can span several folders. If no
      library lists the folder, or Jellyfin won't list libraries for the key,
      it falls back to the old query.
    Downloads
  • v1.4.0 700b26ca82

    v1.4.0
    All checks were successful
    CI / gate (push) Successful in 1m1s
    CI / lint (push) Successful in 56s
    CI / image (push) Successful in 49s
    Stable

    joeyr released this 2026-10-05 20:47:12 -05:00 | 16 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Added

    • A failed run is retried, after 5, 10 and 15 minutes. If it still
      fails, the error is logged and a one-line notice goes to the new optional
      email.failure_notice_recipient. A run that reached some recipients but
      not others isn't retried, since that would send the email to the first
      ones twice; the notice names who didn't get it. A dry run gets one
      attempt and no notice.

    Fixed

    • One error stopped the whole program. Any failure during a run, such
      as Jellyfin restarting or the mail server refusing a connection, called
      Fatal, which exited the process, scheduler included. The container
      restarted and waited for the next week, so that week's email was lost.
    • A request that never answered stalled the program for good. Jellyfin
      and TMDB requests now time out after a minute, and the SMTP connection
      after 30 seconds to connect and 10 minutes for the whole session.
    • A watched folder that failed to load was skipped silently, so the
      email went out without its movies or shows. That now fails the run (and
      so retries). A folder name Jellyfin doesn't have is still just a warning.
    • A recipient that failed was only logged. Sending now reports which
      recipients weren't reached.
    Downloads
  • v1.3.0 1ed1b6bd80

    v1.3.0
    All checks were successful
    CI / lint (push) Successful in 58s
    CI / gate (push) Successful in 59s
    CI / image (push) Successful in 51s
    Stable

    joeyr released this 2026-10-05 20:36:23 -05:00 | 18 commits to main since this release

    Based on upstream v2.0.0 (900faea).

    Changed

    • log.format: json now writes the shape Portainer's log viewer reads.
      The keys are time (local, YYYY-MM-DD HH:mm:ss), level, caller and
      message, which Portainer colours, and an error's stack trace is a
      stack_trace array of up to 12 {func, source, line} frames, which it
      prints as an indented block. Before, the time was an ISO timestamp under
      ts, the message was msg, and the stack was one long string. Levels
      above error are shown as error. The console format is unchanged.
    Downloads