github Nonary/Vibepollo 2.0.2-nightly.d20261023.8a753af16dcf

pre-release4 hours ago

This is a nightly release of Vibepollo 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: 8a753af16dcf

Since the preceding successfully published nightly 2.0.2-nightly.d20261022.83bb31680419: compare exact sources.

ea6334baa17f

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.

Vibepollo stamps frames before converting them, so both encode loops now
replace capture_timestamp and host_processing_timestamp with the
converted frame's stamps before the pacing stamp is derived from them
(the async loop's frame_variation smoothing then starts from the
converted frame). capture_pacing_timestamp stays the claim time, since it
anchors the capture loop's pacing rather than the frame. The demand
check keeps Vibepollo's pacing context argument.

A repeated direct frame is skipped, which must not delay a requested
keyframe until the next capture. The async loop carries the request into
the next iteration (retry_idr), which encodes the last input as the IDR
without waiting; the sync loop encodes the last input as the IDR in the
same pass, unstamped like the no-new-frame path. The decision is
video::policy::retry_idr_after_repeat.

This is the Vibepollo port of Nonary/vibeshine#347 and the follow-up fix.

Signed-off-by: Ramazan Kara <github@r-kara.de>

65c032fbe993

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.

This is the Vibepollo port of Nonary/vibeshine#347.

Signed-off-by: Ramazan Kara <github@r-kara.de>

0c260faadb86

fix(linux): Pass explicit empty environment to HDR focus broker

The RTX HDR foreground call still used the old exec_user_service signature, stopping Arch packaging at compilation. Supply the same empty stream environment used by the other focus operations while preserving supervised execution.

Co-authored-by: Codex <noreply@openai.com>

(cherry picked from commit c29254210cf1604d2980dd99556e4fd0baf5bd69)
Co-authored-by: Chase Payne <chase_payne@outlook.com>

7d23d8131daa

test(linux): match supervised focus execution signature

The production session broker now passes an explicit empty stream environment to exec_user_service. Keep the extracted RTX HDR foreground test aligned with that call and assert it does not add environment entries.

Co-authored-by: Codex <noreply@openai.com>

(cherry picked from commit 83bb316804190cd2919c6477e630bdd2b129bdac)
Co-authored-by: Chase Payne <chase_payne@outlook.com>

12292b2e8061

Merge pull request #659 from Nonary/fix/canary-hdr-focus-environment

fix(linux): port HDR focus broker signature fixes to canary

3bfb3f82ac1a

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.

Vibepollo port of Nonary/vibeshine#349.

(cherry picked from commit 73a00e8084194894a9da8ef999ebc7f95d828935)
Signed-off-by: Ramazan Kara <github@r-kara.de>

65b5b7bde290

fix(stream): isolate async UDP peer endpoints

(cherry picked from commit 01a138b5a5d455a0f74309f2682839d16993c967)

16d30541a4d6

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.

(cherry picked from commit e89ef712cded4ef68be70df7f0d0e72c6402cdb6)

b7579622674a

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>
(cherry picked from commit 688dd692702be5e0d2d508894e98e8ca0e6aa3aa)

77f3a34fb1f2

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>
(cherry picked from commit 6523e1d186ddcd020a79a26ea1f114fb06ce7954)

41a9b5b845a8

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>
(cherry picked from commit 95a4bed93ab9f0aa3fe2048238224d7ea3b0093b)

91edd35e9fcd

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.

Manually port unique merge-resolution changes; preserve Vibepollo product identity and UpgradeCode.

(cherry picked from commit 340fafac89ccdc8cf6c02e2bd91e24f2439f0ea9)

46e6f5904647

test(ci): Initialize COM before inspecting packaged MSI

(cherry picked from commit 3c5d2fb5e4283319c694ae9ca5b1960aa5770ef8)

8f7989b9060c

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>
(cherry picked from commit 397d9a9d5edf037723383c350a5c8912cb54a572)

cdadaba4b04b

test(ci): assert canonical inclusive WiX upgrade range

(cherry picked from commit fe6878e2d62f10d4bb348769d1ec8343395965e1)

47078a279a7d

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>
(cherry picked from commit 209d1709758093388386bdae567a49f56d14dcc5)

3fb3bdbefc87

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>
(cherry picked from commit a9993fbbe09b4860ab6b8151bbdaee966bd2c9fe)

5ece19471dc0

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>
(cherry picked from commit 37f52eb19d9a170941af46966b52359c9077eeac)

be09ccecae18

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>
(cherry picked from commit 892e1530e0e406fe95221e70a6b81cbc37052b31)

b2af1b615552

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>

(cherry picked from commit 97861bafbb2e43f244711fe93a1732b981bbaa56)

3126d4387ac8

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.

(cherry picked from commit 57a889c0b905435b09cf9ce269a73a2f5c1b0a6f)

20bf29e31df6

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>

(cherry picked from commit 03b4375ee1a48154ee6389d4e84a7e4e9396c371)

eacc526373be

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.

(cherry picked from commit a75667a94c6aa8eaf9e1f212b7f58eabe9fa48b8)

b4cefcb7f68c

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>
(cherry picked from commit 5bdc3339d64f435f1dfb1378614f95cd9df31346)

72e17746ecae

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.

(cherry picked from commit 7b28fe75cb211c187872c9d3f60459e80419c988)

6e1d727569de

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.

(cherry picked from commit 0950b2b8c194300aed8135167b7f37acbf346c72)

2a47cb2769e6

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>
(cherry picked from commit 16d69c5c54a51ea30faacaf1c7d27c69db80117a)

9dd4a3fc6fac

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>
(cherry picked from commit 4dd07bf852c8980aa5518b64d81f5937789d3256)

b06b1fed2b47

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>
(cherry picked from commit 4c5c58de7a5f2d43b537679710987e8061af410c)

45a85c49d9a5

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
(cherry picked from commit 20c959f8fecc51b4797d270f7a3c4648f55a4eda)

e0d5fa9547ff

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.

(cherry picked from commit 73a00e8084194894a9da8ef999ebc7f95d828935)

710b2770114f

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
(cherry picked from commit 72c18359f2976f337631836186cc64cfa36efb0b)

d4184d2d6203

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
(cherry picked from commit 6b4e1a3f182ab94f7a222fee4824007789bc8155)

71589ca536be

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
(cherry picked from commit 8f94e2932a22afa2411324a85c644f37a46e1cf0)

47a9335eaf87

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.

(cherry picked from commit 4d8ff65649c50ad10c1b5c2e32c33f0b8c3cb705)

9122f827e68d

ci: decouple nightly builds from upstream migration readiness

9f9e9ea9f63d

Merge pull request #530 from RamazanKara/codex/wgc-direct-encoder-input

perf(wgc): encode the helper frame directly and publish it with one copy

a7bd0e6185ab

Merge pull request #661 from Nonary/fix/nightly-independent-source-20261023

ci: build changed nightly source without migration attestation

608032e12937

merge: align canary with reviewed migration and independent nightly builds

Preserve the merged WGC contributor and HDR focus histories alongside the reviewed master migration and PR #661. Retain contributor timestamp commentary and helper formatting, and keep one WGC direct-input configuration section. No streaming behavior or release guards change in conflict resolution.

7dbeb982532e

fix(tests): propagate JSON includes to reconnect regression

65e281f2caae

Merge pull request #662 from Nonary/fix/remote-input-json-includes

fix(tests): pass resolved JSON includes to reconnect regression

2b5cee73e5f4

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

(cherry picked from commit b3ad05a281030ecc730ffd5d6d8c9cc18f95a1c3)

8a753af16dcf

test: avoid assuming worker observed web lease expiry

(cherry picked from commit d60c67e2633ee37536c5ec17185174f48d2c5c2f)

Don't miss a new Vibepollo release

NewReleases is sending notifications on new releases.