github Nonary/vibeshine 2.0.2-nightly.d20261023.abd0b8aa79fd

pre-release4 hours ago

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.

Commit log

Source: abd0b8aa79fd

Since the preceding successfully published nightly 2.0.2-nightly.d20261022.1e4674a00adc: compare exact sources.

01a138b5a5d4

fix(stream): isolate async UDP peer endpoints

e89ef712cded

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.

688dd692702b

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>

6523e1d186dd

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>

dab193443081

Merge pull request #329 from Nonary/dot/issue-644-dmabuf-alignment

fix(vaapi): use safe CPU fallback when RGB DMA-BUF import fails

95a4bed93ab9

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>

340fafac89cc

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.

3c5d2fb5e428

test(ci): Initialize COM before inspecting packaged MSI

397d9a9d5edf

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>

d6a469ea6dbb

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.

ecae44d171f5

ci: disable common lint PR trigger on active branch

7687b60c82e8

ci: disable common lint PR trigger on active branch

fe6878e2d62f

test(ci): assert canonical inclusive WiX upgrade range

cc8824afb94d

Merge pull request #328 from Nonary/dot/issue-638-dualsense-pcm

diagnostics: trace DualSense PCM forwarding boundaries (#638, partial)

209d17097580

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>

8ae2ce2a5526

Merge pull request #335 from Nonary/codex/pr-validation-version

Fix PR validation build version

a9993fbbe09b

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>

37f52eb19d9a

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>

da98c15f4e06

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>

c90dadd250f1

Merge pull request #337 from Nonary/dot/issue-475-speaker-host

fix(input): produce and route independent DualSense speaker PCM

892e1530e0e4

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>

97861bafbb2e

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>

d18952bd8358

Merge pull request #341 from Nonary/dot/issue-645-steam-discovery

fix(steam): exclude non-Windows launch entries on Windows

57a889c0b905

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.

03b4375ee1a4

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>

a75667a94c6a

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.

5bdc3339d64f

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>

c0c1e13aca01

Merge pull request #342 from Nonary/dot/issue-619-bundle-filename

fix(web): align Maintenance log downloads with Logs navigation

7b28fe75cb21

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.

e9b75511f21f

Merge pull request #345 from Nonary/dot/issue-603-macos-build

fix(macos): correct Boost.Process and DNS-SD API usage

51a3f59382ff

Merge pull request #346 from Nonary/dot/issue-539-static-assets

fix(build): preserve nested common assets in the build tree

a69fd8174e87

Merge pull request #306 from hbashton/fix/async-udp-peer-endpoints

Keep video and audio UDP peers separate

0950b2b8c194

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.

8b8471f18322

Merge pull request #343 from Nonary/dot/issue-603-web-build

fix(build): declare Web UI entrypoints as generated outputs

51f9ebf043dc

Merge pull request #344 from Nonary/dot/issue-561-input-reconnect

fix(remote): keep Remote Input reconnectable through teardown

16d69c5c54a5

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>

4dd07bf852c8

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>

bb02a9325444

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>

4c5c58de7a5f

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>

28f086f665ff

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>

20c959f8fecc

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

73a00e808419

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.

72c18359f297

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

6b4e1a3f182a

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

8f94e2932a22

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

4d8ff65649c5

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.

1184c8732fc6

Merge pull request #350 from Nonary/dot/issue-660-retained-inventory-timeouts

fix(installer): bound retained display inventory queries

22e1a38fceca

Merge pull request #349 from Nonary/fix/rfi-fallback-idr-retry

fix(video): promptly retry IDR after reference-invalidation fallback

b3ad05a28103

test: verify host stats leases without a scheduler-speed assumption

d60c67e2633e

test: avoid assuming worker observed web lease expiry

abd0b8aa79fd

Merge pull request #353 from Nonary/dot/fix-host-stats-nightly-test

test: remove host-stats nightly scheduling assumption

Don't miss a new vibeshine release

NewReleases is sending notifications on new releases.