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_heldandads_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 thetemperatureparameter 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.versionOCI label on both images reports the
MinusPod version instead of inheriting26.04from 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).