This is a nightly release of Vibeshine and contains several bug fixes and may contain new features. Check the commit log for more information.
Windows installer · Linux (Arch x86_64)
Nightly Windows installers are unsigned and include self-signed gamepad components. They may cause false-positive antivirus alerts.
Source: abd0b8aa79fd
Since the preceding successfully published nightly Commit log
2.0.2-nightly.d20261022.1e4674a00adc: compare exact sources.
fix(stream): isolate async UDP peer endpoints
diagnostics(input): expose bounded DualSense PCM forwarding boundaries
Report host admission, feedback queue, and ENet queue outcomes without logging sample contents. Reset backend diagnostics on resume and print numeric slot indices. Add executable gate and log-budget tests.
Partial diagnostic work for Nonary/Vibepollo#638; does not claim to fix physical waveform playback.
fix(ci): Use a valid version for pull request builds
The release-candidate job intentionally skips pull requests, but its Windows and Arch callers had fallen back to 0.0.0. That value is rejected by the release version safety gate before compilation. Give both nonrelease jobs the same deterministic validation prerelease while preserving the production zero-version guard.
Co-authored-by: Codex <codex@openai.com>
fix(input): produce and route independent DualSense speaker PCM
Extract USB speaker channels separately from actuators. Bound pending blocks
per controller, carry generation/sequence/sample position, invalidate stale
producer epochs, and require PS-scoped capability plus negotiated encrypted
speaker transport. Keep actuator timeouts independent.
Add production protocol, backend lifecycle and exact wire boundary tests.
Related to Nonary/Vibepollo#475. Native hardware validation remains separate.
Co-authored-by: Codex <noreply@openai.com>
Merge pull request #329 from Nonary/dot/issue-644-dmabuf-alignment
fix(vaapi): use safe CPU fallback when RGB DMA-BUF import fails
fix(input): serialize speaker reset with final ENet queue admission
Close SA-1 after serialization and encryption: a dedicated producer epoch
gate covers final generation validation plus bounded ENet enqueue. Reset
shares the gate; no slot mutex, producer callback or network flush runs in
the sender critical section. Wire protocol and dependency pins unchanged.
Add forced reset-before-enqueue and concurrent enqueue/reset regressions.
Both fail when the final gate is bypassed; repaired wire5/5 and backend23/23
pass ASan+UBSan.
Co-authored-by: Codex <noreply@openai.com>
fix(ci): Guard validation installers and bound artifact retention
Integrate current canary without importing master-only changes. Keep PR package validation build-only, reject replacement by validation MSIs, and preserve release upgrade/downgrade and 90-day recovery semantics. Exercise the real CMake/CPack contract and inspect the built MSI before upload.
test(ci): Initialize COM before inspecting packaged MSI
fix(input): echo client owner binding in speaker protocol v2
Consume a validated reliable speaker binding once per controller arrival,
scoped to the input session. Legacy unbound arrivals remain valid but cannot
produce speaker PCM. Echo the full64-bit owner in version2 packets so a
client can reject an unseen old generation after slot reuse or reconnect.
Keep the final epoch/enqueue gate and typed capability checks. Add production
binding lifecycle/bounds, legacy arrival, missing owner and exact wire tests.
Co-authored-by: Codex <noreply@openai.com>
Merge canary Windows build correction into PR validation fix
Bring the shared Winsock-before-Windows include correction and current canary baseline into the existing PR branch. The effective six-file validation repair remains unchanged. Re-ran workflow/version/CPack contract checks; Windows MSI validation awaits this exact-head CI run.
ci: disable common lint PR trigger on active branch
ci: disable common lint PR trigger on active branch
test(ci): assert canonical inclusive WiX upgrade range
Merge pull request #328 from Nonary/dot/issue-638-dualsense-pcm
diagnostics: trace DualSense PCM forwarding boundaries (#638, partial)
fix(input): retain speaker submission ownership across USB audio completion
Capture an internal incarnation at actual USB/IP URB submission and reject stale speaker completion after retained-slot rebind. Keep actuator delivery independent and preserve the manual-only lint workflow.
Production protocol/backend regressions cover pending URBs, same-owner rebind, free/reallocate and fresh completion. ASan/UBSan suites and negative controls pass; native Windows hardware remains unverified.
Co-authored-by: Codex <noreply@openai.com>
Merge pull request #335 from Nonary/codex/pr-validation-version
Fix PR validation build version
fix(input): retain speaker provenance across receive fragmentation
Capture ownership before nonblocking receive and preserve the leading
incomplete record tag through parsing, without dropping framing bytes.
Keep actuator delivery independent and scope provenance to application
receive buffers rather than claiming kernel or hardware qualification.
Co-authored-by: Codex <noreply@openai.com>
fix(hdr): Restore Linux RTX HDR highlights above 1000 nits
The pinned NVIDIA runtime accepts higher peaks but clips output near 1000 nits.
Compensate native tuning and apply a GPU PQ lookup for NVENC and PyroWave,
with a gray-floor correction to avoid doubling low midtones.
Validate highlight levels, live tuning and independent pixel references;
record the binary investigation and bounded GPU measurements.
Co-authored-by: Codex <noreply@openai.com>
merge(canary): Reconcile upstream changes with RTX HDR peak fix
Preserve remote canary updates alongside the RTX HDR correction.
The combined build passed; all four full-suite failures passed serial reruns.
Co-authored-by: Codex <noreply@openai.com>
Merge pull request #337 from Nonary/dot/issue-475-speaker-host
fix(input): produce and route independent DualSense speaker PCM
fix(web): align Maintenance bundle navigation with Logs
Adapt donny110's one-attribute compatibility change from Nonary/Vibepollo#619 into the source repository. Preserve server attachment naming and normal same-origin GET navigation without client filename hints. Add separately labeled DOM-contract and real download tests for Maintenance and Logs.
Browser execution remains blocked in the cloud sandbox, so the reported Windows filename symptom is not independently reproduced. See the draft PR for validation limits.
Co-authored-by: donny110 <63401186+donny110@users.noreply.github.com>
fix(steam): exclude non-Windows launch entries on Windows
Adapt the Windows host filter from PreceptorOfMagic's Nonary/Vibepollo#645 (3d849df4a8df7f32909b7f182f85773c8df0035a) into the source-first Vibeshine canary lane. Preserve Linux native/Proton selection and cover both implicit and explicit working directories, compatible OS lists, unsupported depots, and appinfo refreshes.
Co-authored-by: PreceptorOfMagic <271783941+PreceptorOfMagic@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Merge pull request #341 from Nonary/dot/issue-645-steam-discovery
fix(steam): exclude non-Windows launch entries on Windows
fix(build): declare web entrypoints as generated outputs
Adapt the OUTPUT correction contributed by LeeroyDing in Nonary/Vibepollo#603 and benjweaver in Nonary/Vibepollo#539.
Add executable Makefiles and Ninja regression coverage of the production web target and shared install rules, including clean parallel builds, incremental no-ops, missing-output recovery, source changes, failure/retry, and install prerequisites.
fix(remote): replace reconnecting input sessions by generation
Keep Remote Input visible through asynchronous teardown and replace only
the caller's previous input generation before new RTSP admission. Prevent
retired input callbacks from clearing replacement runtime overrides.
Adapted from Nonary/Vibepollo#561 and #588. Excludes the separate game-cancel
scope.
Co-authored-by: Ben Weaver <benjweaver@outlook.com>
Co-authored-by: pedrobispo <pedrobispo@unifei.edu.br>
fix(macos): use current process and DNS-SD APIs
Port only the shared API compatibility corrections from benjweaver's Nonary/Vibepollo#539 and LeeroyDing's Nonary/Vibepollo#603. Preserve the existing launch and publication behavior without importing either broader macOS port.
Add executable Boost cwd-initializer and typed service-registration regression controls. Native macOS SDK/runtime validation remains outstanding.
fix(build): preserve nested common assets in the build tree
Adapt the common asset directory preservation fix from Ben Weaver's Nonary/Vibepollo PR #539 (ca1883d78437e1ca5c5f4c70eaf0d8233db950ec). Keep the existing install rules and browser-source exclusions unchanged.
Add a regression that executes the production CMake module and validates runtime icon paths, duplicate basenames, nested and spaced paths, reconfigure behavior, and installed payload bytes.
Co-authored-by: Ben Weaver <benjweaver@outlook.com>
Merge pull request #342 from Nonary/dot/issue-619-bundle-filename
fix(web): align Maintenance log downloads with Logs navigation
test(build): observe dependency timestamp advancement
Address PR #343 review comment 4354354143. Replace the fixed 1.1-second delay with bounded polling of the actual dependency mtime relative to all generated web outputs. Touch at the current time rather than setting future timestamps, preserving no-op assertions on coarse filesystems.
Merge pull request #345 from Nonary/dot/issue-603-macos-build
fix(macos): correct Boost.Process and DNS-SD API usage
Merge pull request #346 from Nonary/dot/issue-539-static-assets
fix(build): preserve nested common assets in the build tree
Merge pull request #306 from hbashton/fix/async-udp-peer-endpoints
Keep video and audio UDP peers separate
fix(remote): drain input cleanup before reconnect preparation
Serialize generation retirement with the destructive Input expiry callback
tail, including callbacks that already removed their owner. Preserve paused
game overrides and use a non-expiring RTSP activity snapshot while holding
the short cleanup gate. Release it before joins or config application.
Cover RI-1 retirement and already-claimed schedules with deterministic
production-body regressions, idle and paused games, resource release, and
non-reentrant peer expiry.
Merge pull request #343 from Nonary/dot/issue-603-web-build
fix(build): declare Web UI entrypoints as generated outputs
Merge pull request #344 from Nonary/dot/issue-561-input-reconnect
fix(remote): keep Remote Input reconnectable through teardown
perf(wgc): let GPU encoders read the helper frame directly
With WGC capture the helper already publishes every frame into a shared
D3D11 texture, but the host copied it into a pooled image before the
encoder converted it, costing a full-frame GPU copy per frame.
Add wgc_direct_encoder_input (default on, latched per capture session).
When it is active, each pool image aliases the helper's shared texture
through its own duplicated NT handle, opened once per image on the
encoder device. The capture thread only claims the newest frame id; the
encoder takes the shared keyed mutex on its own device, reads the frame
record under it, and converts the texture in place. Switching the option
off restores the copy path.
The encoder pairs the actual converted pixels with their frame id and
timestamp: the helper may publish a newer frame between the claim and
the lock, so the conversion reports the id and timestamp it really read
through converted_frame_t, and the encode loops use those instead of the
claimed ones. A per-encoder-device cursor skips a frame that was already
converted, so the same pixels are never converted or encoded twice; the
AMF device cancels its reserved input surface when it skips. A restarted
helper bumps the frame record generation, which restarts the ids.
Sources that need a stable image of their own keep the copy path:
constant frame rate capture, which re-sends its cached image on a
timeout that the cursor would drop as a repeat, and PyroWave, which pins
and reads the capture image's own texture and keyed mutex. Constant
frame rate is latched with the input mode, so changing the capture
option cannot leave a direct pool with nothing to re-send. PyroWave runs
on the shared capture, so any live PyroWave consumer is part of the
shared capture's configuration: a PyroWave client joining a capture that
already latched direct mode restarts it onto the copy path through the
existing demand check (a PyroWave client leaving does not restart it).
Software encoding and DXGI capture are unaffected.
A direct image whose frame record cannot be read is skipped like a
repeat, without touching the frame cursor, and logged at most once a
second. That only happens if the helper died mid-publish, and the IPC
session's broken-pipe handling restarts capture in that case. The
timestamp choice and the skip of an already-converted frame are one
policy shared by both encode loops, and only frames actually converted
are counted as such.
Signed-off-by: Ramazan Kara <github@r-kara.de>
perf(wgc): publish helper frames with one copy when the host is keeping up
The helper copied every WGC frame into a scratch texture and then, on
its delivery thread, from the scratch texture into the shared texture
the host reads, so each frame cost two GPU copies even when nothing was
queued.
When no older frame is queued or mid-delivery, the capture callback now
copies the WGC frame straight into the shared texture, as long as the
helper's D3D context is free and the keyed mutex can be acquired without
waiting. Otherwise the frame takes the scratch handoff as before, so a
newer frame is never published ahead of an older one. The helper counts
direct publications in its periodic diagnostics.
The scratch fallback no longer holds the D3D context while it waits for
the host. The delivery thread used to hold the context lock for up to
200 ms waiting on the shared keyed mutex, and the capture callback needs
that lock for its scratch copy, so encoder backpressure could stall
FrameArrived. It now waits for the keyed mutex alone and then takes the
context only if it is free; if the callback is mid-copy, it hands the
texture back and waits for the context instead. Neither side holds one
lock while waiting on the other, and the frame stays in the delivering
state throughout, which keeps the callback from publishing a newer frame
ahead of it.
Signed-off-by: Ramazan Kara <github@r-kara.de>
Merge pull request #347 from Nonary/perf/wgc-direct-encoder-input
perf(wgc): encode the helper frame directly and publish it with one copy
Signed-off-by: Ramazan Kara <github@r-kara.de>
fix(wgc): don't delay a requested keyframe behind a repeated direct frame
With direct encoder input, the async encode loop can pop an image whose
conversion reports pixels the session already sent, and skips it. If a
keyframe had been requested in that iteration, the next iteration started
with the request cleared and waited up to max_frametime in images->pop(),
so on a static desktop the IDR only went out with the next capture or the
minimum-FPS timeout. The copy path encodes it immediately.
The loop now carries the request into the next iteration (retry_idr), which
takes the existing requested-IDR path: no wait, the last input is encoded
as the IDR. If another image is already queued it is popped first, as
before. The decision lives in video::policy::retry_idr_after_repeat, so a
repeat with a keyframe request retries, a plain repeat is a skip, and a
converted frame never retries.
The synchronous loop keeps the pending IDR in the session, so no request
was lost, but it skipped the repeat and only sent the IDR on the next
capture callback. It now encodes the last input as the IDR in the same
pass when a keyframe was requested for that session, with the stamps left
unset like the no-new-frame path.
Follow-up to #347.
Signed-off-by: Ramazan Kara <github@r-kara.de>
Merge pull request #348 from Nonary/fix/wgc-direct-idr-retry
fix(wgc): don't delay a requested keyframe behind a repeated direct frame
Signed-off-by: Ramazan Kara <github@r-kara.de>
fix(display): Open driver before virtual screen catalog checks
Catalog validation ran before display creation opened the driver, so a first virtual screen launch could return 503 despite a healthy driver. Open the control transport before inspection while preserving catalog restrictions and healthy connection provenance.
Cover cold starts, stale connections and failed opens in the production-function regression fixture, and log catalog rejection reasons.
Generated with [Codex](https://openai.com/codex/)
Model: GPT 6.1-Sol High
fix(video): retry recovery IDRs after reference invalidation fallback
Propagate backend RFI fallback into the async loop's pending IDR state,
reusing #348's retry handling for repeated direct inputs. Preserve
successful invalidation and process every queued feedback range.
Add an extracted-production CPU regression covering 36 NVENC/AMF
recovery scenarios, with a failing unchanged-canary negative control.
Prepared with OpenAI Codex on behalf of the repository owner.
Full Windows build and live GPU streaming validation remain unrun.
perf(logs): speed up support export redaction
Slow regex scans delayed support downloads. Use Boost.Regex to cut redaction time from 34.4 to 8.6 seconds on a 64 MiB log set while preserving patterns, boundaries, and placeholder identity.
Verify identical output against the previous engine on local logs and 10,000 generated cases. Add compatibility coverage; all three log export test targets pass.
Generated with [Codex](https://openai.com/codex/)
Model: GPT 6.1-Sol High
fix(installer): Prevent display inventory timeouts
Exclude inbox drivers from the bounded inventory to avoid exhausting its 15-second deadline during setup.
Attribute warnings to the driver action that produced them and preserve wrapped 64-bit error details so SudoVDA failures no longer blame the selected display driver.
Generated with [Codex](https://openai.com/codex/)
Model: GPT 6.1-Sol High
fix(logging): Reduce repeated discovery and polling noise
Routine discovery and UI polling overwhelmed useful streaming diagnostics. Log capability snapshots at Debug on first result or change, with adapter and codec details; retain repeated successes and lease bookkeeping at Verbose.
Generated with [Codex](https://openai.com/codex/)
Model: GPT 6.1-Sol High
fix(installer): bound retained display inventory queries
Keep retained-device and post-repair CIM/DISM queries behind the existing
bounded process edge. Fail closed on timeout or invalid results, retain
version/trust and device-policy safeguards, and preserve runtime restoration.
Validate 45 production guard fixtures with real inventory child processes
and mocked Windows edges; confirm the original hang with a negative control.
No live Windows driver qualification. Related report #660 remains unconfirmed.
Prepared with OpenAI Codex on behalf of the repository owner.
Merge pull request #350 from Nonary/dot/issue-660-retained-inventory-timeouts
fix(installer): bound retained display inventory queries
Merge pull request #349 from Nonary/fix/rfi-fallback-idr-retry
fix(video): promptly retry IDR after reference-invalidation fallback
test: verify host stats leases without a scheduler-speed assumption
test: avoid assuming worker observed web lease expiry
Merge pull request #353 from Nonary/dot/fix-host-stats-nightly-test
test: remove host-stats nightly scheduling assumption