OBS quick launch (EB / EB + VOD) from the System tab#36
Merged
Conversation
Soulhackzlol
force-pushed
the
feat/system-obs-quick-launch
branch
from
July 5, 2026 10:05
b052926 to
5a0794b
Compare
Soulhackzlol
force-pushed
the
feat/system-obs-quick-launch
branch
from
July 5, 2026 10:13
5a0794b to
68a83ac
Compare
The Enhanced Broadcasting launchers only existed inside the Twitch destination editor, behind the VOD-audio toggle - starting OBS pre-wired meant opening a destination's settings every time. System -> Behavior now has an "OBS quick launch" card with: - Launch OBS - Enhanced Broadcasting (session-only --config-url launch) - Launch OBS - EB + VOD audio track - Make a desktop shortcut (the existing VOD+EB cold-start .lnk) The EB+VOD button does one thing the old flow got for free from the form: it persists vod_audio=true on the enabled Twitch destination before writing OBS's flag. That's required for durability, not cosmetics - reconcile_obs_vod_files derives OBS's on-disk flag from the destinations on every save, so a launch that skipped the destination flag would be silently reverted by the next save. Each step reports into the same red-to-green checklist as the form flow (renderer extracted and shared). The card warns inline when no enabled Twitch destination with a key exists (OBS launches, but EB has nothing to engage) and the buttons disable with a reason when OBS isn't installed (probe cached per session, refreshed via loadDestinations so destination changes update the warning live). No backend changes - reuses /obs/launch-with-eb, /obs/setup-vod-eb, /shortcut/create-eb, and /destinations. 235 tests green; verified the new functions survive build.rs minification in the embedded output.
Soulhackzlol
force-pushed
the
feat/system-obs-quick-launch
branch
from
July 5, 2026 10:40
68a83ac to
41b7880
Compare
Proven with a simulation: animateNumber() has been a direct-set its entire life. It only stored per-element state on the animate path, but a fresh id can never reach that path - the throwaway object it builds always has `to === target`, so it hits the no-change branch and returns without seeding numState. The map stays empty forever, every call rebuilds a fresh matching object, and the number snaps to each value. This is why my earlier ease/linear/snap tweaks did nothing (dead code on a function that can't animate) and why the user still saw the arming "jump" and the disarm instant-zero. Two fixes: 1. animateNumber now seeds numState on first sight of an id (show the value, store state), so subsequent changes reach the animate path. The stat readouts ease properly now too - also never animated before. 2. The hero delay figure gets a dedicated critically-damped spring (Unity SmoothDamp) on a single persistent rAF that chases the latest target. It tracks the buffer fill at smooth, near-constant velocity while arming (no jerk from tweening a varying gap over a fixed duration) and eases the big jumps - especially the roll-down to 0 on cut/disarm - to rest with no overshoot, no snap, no freeze, immune to the state-update cadence. Verified the roll-down and count-up numerically before wiring it in. 235 tests green; verified the new code in the actual built exe over HTTP.
The OBS dock rendered its big number from current_delay_ms, which includes the pipeline's natural transit latency (encoder -> ingest -> ring -> egress) even when no delay is armed - so passthrough read as "1.0s". It now mirrors the dashboard: armed target when a delay is engaged (fill while arming), 0 in passthrough. Review pass over the whole merge set: clippy clean (no Rust dead code), no dead JS functions, no leftover references from the animation iterations, dashboard animations are read-only (never POST, cannot desync the stream state), and the dock is a standalone file unaffected by the dashboard changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The Enhanced Broadcasting launchers no longer hide inside the Twitch destination editor behind the VOD-audio toggle. System → Behavior → OBS quick launch offers three buttons that work without opening any destination's settings:
--config-urlpointed at InstantClone. Session-only; reopening OBS normally streams plain again..lnk, now reachable from here.The one subtle bit
The EB+VOD button persists
vod_audio=trueon the Twitch destination before touching OBS's flag, and that is required for correctness, not convenience:reconcile_obs_vod_filesderives OBS's on-disk VOD flag from the destination set on every destination save. A quick-launch that only wrote the OBS flag would be silently reverted the next time any destination is saved. The pre-step closes that hole and shows up as its own checklist line.Guard rails
loadDestinations).Verification
/obs/launch-with-eb,/obs/setup-vod-eb,/shortcut/create-eb, and/destinationsendpoints.cargo test --release: 235 passed; fmt clean.index.html.gzand confirmed all new functions and ids survive build.rs minification.