github ttlequals0/MinusPod v2.79.0
2.79.0

4 hours ago

This is MinusPod's first stable release.

Stable is the slower of the two channels. stable and stable-cpu only move
to a release that has run in production and held up. latest and cpu keep
moving with every release, several a day at times. If you have been pulling
latest, you can stay there; pull stable instead if you would rather take
updates in larger, less frequent steps.

These notes cover 2.72.0 through 2.79.0. CHANGELOG.md has the per-version
detail.

New features

  • Segment categories. Every detected segment now carries a category, and each
    category gets its own action: remove, beep, or keep. Four categories are
    always detected: sponsor, cross-promo, self-promo, and interaction. Three
    more, intro, outro, and recap, appear only on feeds that opt in with "Detect
    intro, outro, and housekeeping segments". Actions resolve per feed first,
    then the global default, then remove. Everything defaults to remove, so
    feeds cut exactly as they did before until you change something. Kept
    segments stay in the audio, get their own section on the episode page, and
    still teach the pattern learner. Set the
    global map at Settings > Global Defaults > Segment actions, and per-feed
    overrides on the feed settings page. "Re-render episodes with current segment
    actions" recuts a feed's already-processed episodes against the current map.
    See How It Works and
    Configuration (#565, #577).

  • Community pattern categories. Patterns show their category in the list and
    the API, and checkboxes in the community settings section choose which
    categories to accept. Unchecking one deactivates its synced patterns instead
    of deleting them, and re-checking brings them back on the next sync. Your own
    patterns are never touched. All seven are accepted by default (#565, #577).

  • Chapter boundary hints. Chapter generation now sees where ads and segments
    were found. An ad usually sits between two show segments, so a cut seam is a
    good candidate for a topic change, though the transcript still has to support
    one. Feeds that get chapters from the publisher or an embedded track are
    unaffected (#565, #577).

  • Podping listener, off by default. A background thread polls public Hive nodes
    every 3 seconds for publish notifications and refreshes a matching feed
    right away instead of waiting for the next RSS poll. No Hive account or keys
    needed. Enable it at Settings > Global Defaults. Whether it helps depends
    on your feeds' hosts. Hosts sending notifications today include Spreaker,
    Buzzsprout, RSS.com, PodServe, Transistor, RedCircle, Captivate, Podigee,
    Fireside, PRX Dovetail, and Blubrry. Many large hosts, including Acast,
    Megaphone, Libsyn, Simplecast, and Omny, do not. Scheduled polling still
    runs, so a missed notification costs nothing. Feeds show a "Last
    podping" line once one arrives, which is how you tell whether a host sends
    them. See
    Podcasting 2.0 (#574).

  • In-app update checks. Settings > System Status shows your version's release
    date, a channel picker, a daily auto-check toggle, and a changelog link. A
    banner appears when a newer release is out on your channel, and the daily
    check can fire an Update Available webhook or email once per version (#567,
    #568, #569).

  • Six ad-detection tunables at Settings > Ad Detection: a verification-pass
    miss hold floor and an optional autocut threshold, pattern-learning
    confidence floors for short and long ads, a differential correlation ceiling,
    and a differential hold minimum length. See
    Detection Tuning (#573).

  • Cue fusion on feeds with cue templates. A matched cue on either edge of an
    otherwise-uncorroborated differential candidate now corroborates it, so it
    cuts instead of holding, and a shared cue re-anchors the comparison timeline
    against fetch-to-fetch drift. See
    Audio Cue Detection (#573).

  • Pass-2 verification misses that overlap no pass-1 marker are no longer
    discarded without a trace. They hold for review as a "Verification catch"
    once past the hold floor, or cut automatically if you enable the autocut
    floor. Below both, the drop is at least logged with the sponsor, confidence,
    and the floor it missed (#573).

  • Held for Review and Detections Not Cut rows open in the waveform editor. The
    pencil button next to each row's play button gives you the same scrub-and-drag
    editor the Detected Ads list uses. Confirming with moved boundaries cuts only
    what is inside the pins (#563, #562).

  • Feed refresh interval is now a setting at Settings > Global Defaults, default
    15 minutes, range 5 to 1440 minutes. It replaces the old hardcoded 15-minute
    poll. A change takes effect after the current wait finishes (#574).

  • Expand all and collapse all on the Settings page, next to settings search
    (#575, #574).

  • The processing history table records which MinusPod version produced each
    run. Rows from before this release show a dash (#577).

  • A "Do not send temperature" toggle beside the stage temperature controls, for
    models that reject the parameter (#577).

  • Episode Processed webhooks and emails carry ads_held and ads_not_cut
    counts. The email adds the matching rows only when they are nonzero (#573).

  • Startup logs the MinusPod logo as an ASCII banner with the version and repo
    link under it, so the version is easy to spot when scrolling logs. The plain
    "MinusPod vX.Y.Z starting..." line is unchanged for log queries (#567, #572).

Fixes

  • The first episode processed after a container start silently skipped
    fingerprint and text-pattern detection, so known sponsors with existing
    patterns went uncut. Given how often deploys restart the container, this hit
    more episodes than it sounds like. It also explains why reprocessing the same
    episode minutes later worked fine. Detection dependencies are now built at
    the start of every run, before the stage gates (#572).

  • Chapter generation could return a single chapter for a whole episode. Two
    separate causes: models that reject the temperature parameter were retried
    with a default value that could never succeed, and Anthropic responses
    starting with a thinking block failed to parse because the reader asked the
    first block for text it did not have. Both are fixed, a rejection is now
    remembered for the rest of the run, and a topic-detection response that
    parses to zero boundaries is flagged as degraded instead of shipping as a
    finished episode (#577).

  • Sponsor labels no longer pick up LLM reasoning prose or a bare "... segment"
    in place of the advertiser name. Two heavily overlapping markers describing
    the same ad read now merge into one instead of showing as duplicates (#573).

  • Pattern learning did nothing when it ran before the detector had initialized,
    so detections from that run never became patterns. It now sets up the same
    dependencies the other learning paths do (#573).

  • SMTP send failures log the full traceback instead of only the message (#571,
    #573).

  • The startup banner no longer gets dropped by journald-backed log drivers,
    which treated its leading blank line as an empty record (#567, #573).

  • The org.opencontainers.image.version OCI label on both images reports the
    MinusPod version instead of inheriting 26.04 from the Ubuntu base (#576,
    #577).

  • react-router-dom was retired upstream. The app depends on react-router v8
    directly, which clears GHSA-qwww-vcr4-c8h2 with no audit exception (#578,
    #577).

  • Feed settings polish: the Detection and Chapters dropdowns size to their
    content instead of stretching across the panel, each segment-category row
    carries a one-line description of what it covers, and regenerating chapters
    now shows progress and a result rather than closing the menu and going quiet
    (#577).

  • The webhook test button sends one sample per subscribed event instead of
    always sending an Episode Processed sample, and the Feed Refresh Failed event
    is documented: when it fires, its payload variables, and an example (#577).

Upgrade notes

No action required, and no settings change. Two things happen on their own the
first time you start this version:

  • Rejecting a cross-fetch differential detection used to create a
    cross-episode false-positive entry, which could suppress legitimate matches
    across the whole feed. It now blocks only that episode region. A one-time
    startup backfill deactivates existing entries traceable to a differential
    rejection. Nothing is deleted, and entries whose origin is ambiguous are
    skipped rather than guessed at (#573).

  • The cross-fetch differential stage now measures correlation for every
    silence-delimited block instead of assuming 0.0 for unprobed gaps, and a
    candidate near the boundary gets one retry with a wider window. Stored
    differentials from before this change still qualify, so recuts of old
    episodes behave as they did (#573).

Don't miss a new MinusPod release

NewReleases is sending notifications on new releases.