Release Notes
unreleased
This update rebuilds the Mesio HLS recording engine for robustness and unifies how Mesio downloads HLS and FLV streams. Encrypted HLS streams are handled more reliably, memory use stays bounded on busy or encrypted streams, and segment de-duplication now survives playlist refreshes that rotate auth tokens such as Twitch signed URLs. A few Mesio engine settings that no longer affected recording were removed, and existing configurations are migrated automatically.
FLV and HLS media processing also uses less CPU, memory, and disk I/O. Media analysis is reused instead of repeated, queues are bounded by bytes for large HLS segments, and FLV metadata is patched in place without shifting the completed file. Modern enhanced-RTMP keyframes and several truncated or malformed-input cases are handled more reliably as well.
Douyu extraction also gets a smaller but useful cleanup: audio-only streams can now be selected directly from the quality picker, H.265 streams are identified from Douyu's own CDN metadata, and more "room unavailable" responses are handled as offline states instead of noisy extraction failures.
The dashboard's theme system was rebuilt as well. Dark mode and custom themes now apply before the first frame on both the web and desktop apps — the desktop app no longer flashes white on launch in dark mode — and switching between light and dark is smoother and more predictable.
Platforms
New platform: SOOP
You can add SOOP rooms (formerly AfreecaTV,
play.sooplive.co.kr/play.sooplive.com) with native multi-quality HLS recording. Password-protected rooms and login-required broadcasts are supported via platform settings or cookies. When you configure a SOOP account, the app validates and renews session cookies automatically so later checks reuse the login. Live chat plus gifts can be recorded when danmaku is enabled.New platform: Bigo Live
You can add Bigo Live rooms (
bigo.tv) as streamers with native HLS recording. Password-protected rooms are supported via platform settings or a?pwd=URL parameter, and live chat plus gifts can be recorded when danmaku is enabled. Website-style integrity token minting is on by default for better API parity. The public stream is a single mid-quality portrait feed (typically around 480p–540p); higher browser-only qualities are not available on this path.
Desktop app
No more white flash when launching in dark mode
The main window previously appeared before the saved theme was applied, so dark-mode users saw a white frame on every launch. The theme is now applied before the window is shown, and the loading splash screen follows your chosen theme instead of only the operating system setting — so a light-OS user who prefers a dark app gets a dark splash and a dark first frame.
Windows GPU checks no longer flash console windows
On Windows systems with NVIDIA GPUs, the desktop app could briefly flash black console windows at startup and every time the background GPU health check ran. GPU checks now run without opening console windows, and startup no longer performs an extra back-to-back check.
Theme and appearance
Custom themes apply at first paint
A saved theme preset, imported theme, or color override is now restored before the page first renders, on both web and desktop — no more brief flash of the default palette on load. After updating the app, your saved theme keeps applying immediately unless the app's theme data itself changed in the update.
Smoother, more reliable dark/light switching
The circular reveal animation no longer occasionally flips the whole screen to the new theme before the animation starts. The header toggle now switches based on the appearance you currently see, so the first click always has an effect when the mode is set to System. Selecting a mode that looks identical to the current one (for example switching from Dark to System while the OS is dark) saves the preference without playing a pointless animation.
Theme settings stay in sync across browser tabs
Changing the preset, colors, or radius in one tab now updates every other open tab, matching how the light/dark mode already behaved.
Delete confirmation buttons show the right text color
A missing style definition left the text on some destructive confirmation buttons (template, notification channel, and workflow deletion) rendering in the wrong color. They now use the theme's destructive foreground color.
HLS recording engine
Rebuilt HLS engine for more predictable recording
The Mesio HLS engine was rebuilt around a single control loop that owns all download state — which segments to fetch, retry deadlines, and completion tracking — instead of spreading it across several cooperating tasks. Recording behavior is now deterministic under load: in-flight downloads, decryption work, and output buffers are each bounded by explicit memory budgets, so a fast or encrypted stream can no longer grow memory without limit.
More reliable encrypted (AES-128 / fMP4) HLS
Decryption now runs off the main scheduling loop and is memory-gated, so a burst of encrypted segments stays responsive instead of piling up. For fragmented-MP4 streams, the engine guarantees the init segment is written before the media that depends on it, avoiding codec-mismatch corruption, and a terminally failed init is surfaced as a visible gap instead of stalling the recording.
Segment de-duplication survives rotating auth tokens
Segments are no longer re-downloaded when a playlist refresh rotates query parameters such as signatures or tokens. For sources with known token schemes (for example Twitch signed URLs), the engine can strip the rotating parameters so the same segment is recognized across refreshes, and a signed URL that expires mid-download is retried transparently against a newer one.
Skipped segments and gaps are explicit
When the live window slides and segments drop out before they can be fetched, the engine emits a clear gap signal instead of silently stalling, so missing data is observable rather than appearing as a frozen recording.
FLV and HLS media processing
Lower processing overhead with bounded memory use
FLV codec and keyframe classification and HLS transport-stream analysis are now computed once and reused throughout the repair pipeline. Resolution detection reads only a bounded amount of stream data, processing work is batched, and HLS queues are limited by byte budgets rather than segment counts. Byte accounting remains attached while a batch is being processed, so batching cannot temporarily bypass that limit. If fragmented-MP4 media exhausts its pre-init safety buffer before a delayed init segment arrives, the repair pipeline rotates the output before writing that init. This reduces repeated parsing and prevents a handful of unusually large segments from causing disproportionate memory growth or invalid file ordering.
FLV metadata is updated in place
The writer now reserves baseline metadata space when recording starts, including for audio-only streams and recordings without a keyframe index. When keyframe indexing is enabled, the larger index reservation is patched before the writer closes. The repair step no longer shifts or rewrites the rest of a completed FLV file, reducing disk I/O and avoiding a costly end-of-recording pause on large files. The legacy low-latency CLI option remains accepted for compatibility, but metadata updates always use the in-place path.
More resilient FLV repair
Enhanced-RTMP video keyframes are recognized correctly, complete tags at end-of-file are no longer skipped, empty media payloads are handled safely, and GOP buffering has a hard limit. These changes improve splitting and metadata generation for newer codecs while keeping damaged or unusual streams from growing repair buffers without bound.
Mesio downloader
Unified HLS and FLV download sessions
Mesio's HLS and FLV downloaders now share a single session model, so progress reporting, retry handling, and cancellation behave consistently across both protocols.
Simplified Mesio engine settings
Several Mesio HLS settings that no longer affected recording were removed from the engine settings form, including the Performance tab (the batch-scheduler and zero-copy toggles) along with the streaming-threshold and raw-segment-cache fields. Stored configurations are cleaned up automatically by a database migration — no action is required, and the remaining timeout, retry, decryption-key, and gap-skip settings continue to work as before.
Douyu streams
Audio-only is part of the quality picker
Douyu's quality setting now includes an Audio only option alongside the usual quality presets. You can still type a custom Douyu rate when needed, but common choices such as original quality, HD, low quality, and AAC audio are available from the same control.
H.265 detection follows Douyu CDN metadata
Douyu stream entries now use the
isH265value returned by Douyu's CDN list to mark HEVC streams. When a selected CDN supports H.265, the extractor uses Douyu's dedicatedplayer_1URL and falls back to the standard stream URL if it is unavailable. There is no separate frontend switch to manage, and audio-only requests continue to use the AAC stream response.More unavailable-room responses are treated cleanly
Douyu error codes
-3,-4, and-5are now handled as unavailable or offline stream states. This reduces false hard failures when a room closes, the streamer goes offline during extraction, or Douyu returns a temporary unavailable response.
Pipeline uploads
Session-start date anchors for upload destinations
Rclone pipeline steps now include a
time_anchorsetting. Keep the defaultjob_createdbehavior, or choosesession_startso date placeholders such as%Y/%m/%duse the live session's start time and a stream crossing midnight stays in one dated remote folder. Copy/move steps can also opt intojob_createdorsession_startanchoring while preserving their existing execution-time behavior by default.Upload destination dates use server local time
Time placeholders in upload destination paths now render in the server's local time zone when an explicit reference timestamp is used. They previously rendered in UTC, which could put uploads in a different dated directory than local recording filenames on non-UTC deployments. The time zone offset is taken from the moment being rendered, so recordings around daylight-saving transitions keep the date their filenames carry, and retried uploads land in the same dated folder as the original run.
Pipeline step forms
Placeholder names show up in help texts again
Some pipeline step forms rendered placeholder help text with the names missing — for example the danmaku conversion step showed "Use and placeholders." instead of naming
{input}and{output}. The rclone and copy/move destination fields now also document the supported placeholders directly in the form.Clearer error for invalid copy/move step configuration
A copy/move step whose saved configuration fails to parse (for example a mistyped option value) now reports the actual parse error instead of a misleading "no destination directory specified" message.
Recording reliability
Recording recovers on its own after repeated download start failures
When a stream's CDN briefly rejected downloads (for example Douyu edge nodes returning HTTP 404 while the room was still live), three consecutive failures put the streamer into a short error backoff. A timing race between that backoff and the session-resume path could leave the recording session marked active with no download running — the room kept showing as live with an error, but recording never restarted until monitoring was toggled manually. The download-start gate now reports this refusal the same way other rejected downloads are reported: the session closes cleanly and a status check is scheduled for the moment the backoff expires, so recording resumes automatically once the stream is reachable again.
Live watchdog restarts downloads that disappeared silently
As a safety net for any path that drops a download start without feedback, the periodic live watchdog now recognizes "reported live, but no download activity for five minutes" and re-triggers the download start instead of discarding the check result.
Disabling a streamer can no longer be undone by an in-flight status check
Disabling a streamer while one of its status checks was still in flight could let that check re-mark the streamer as live, create a recording session, and start a download after the disable. Session creation now re-checks the streamer's state at the database serialization point, so a disable that has been saved always wins — the late check is discarded instead of overriding user intent.