Skip to content

fix: Resolve minimum_fps_target related issues on all platforms#4967

Merged
ReenigneArcher merged 3 commits into
LizardByte:masterfrom
psyke83:min_fps_target_fixes
Apr 19, 2026
Merged

fix: Resolve minimum_fps_target related issues on all platforms#4967
ReenigneArcher merged 3 commits into
LizardByte:masterfrom
psyke83:min_fps_target_fixes

Conversation

@psyke83

@psyke83 psyke83 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

Description

Multiples changes that affects all platforms, aimed at resolving issues related to the minimum_fps_target setting. During testing of both portalgrab and kmsgrab, certain streaming conditions can be observed to cause the stream framerate cap to be violated, which is resolved by these changes.

fix(video): set correct default minimum_fps_target and max_frametime interval alignment

The current minimum_fps_target and max_frametime intervals are set/logged incorrectly
and break capture methods on Linux. Example with a 60fps stream:

  • default minimum_fps_target is populated as config.framerate (60),
  • minimum FPS target is logged as 30 and interval logged as 33.33ms, but
    pop() interval is actually 16.6ms.
  • result: default value is 2x what documentation implies should be the case.
    Setting a manual value logs the target FPS and interval incorrectly but
    sets the correct target interval for the duplicate insertion logic via pop().

Issues observed at 60fps:

  • kmsgrab: fps cap violations and stuttering during cursor shape changes
    due to increased host processing latency triggering extra duplicates.
  • portalgrab: idle desktop settles on ~52fps instead of the correct 30fps
    default target.
  • portalgrab: massive framerate bursting due to irregular frame arrival
    that manifests at specific framerates; example: "strangle 45 glxgears"
    produces sustained 90fps on a 60fps stream. Can also manifest when framerate =
    stream framerate, but is harder to reproduce.

New behaviour:

  • minimum_fps_target defaults to (config.framerate / 2), and max_frametime
    aligns with the actual minimum target FPS. This makes the logging accurate
    and the existing documention becomes sensible.
  • kmsgrab: during expensive cursor updates, no more framerate violations
    or stuttering.
  • portalgrab: desktop idles at 30fps instead of ~52fps.
  • portalgrab: bursting is resolved. No more violations at 45fps, 60fps, etc.

fix: resolve timed pop() resetting timeout on spurious wakeups

The previous implementation called wait_for(delay) inside a manual loop,
causing the full timeout to reset on each spurious wakeup.
Replace with a single predicate-based wait_for call, which handles
spurious wakeups internally while correctly honoring the original deadline.

Revert "fix(linux/xdgportal): avoid duplicate frame insertion (#4839)"

This reverts commit 99d4e05.

Screenshot

Issues Fixed or Closed

Fixes #4906

Roadmap Issues

Type of Change

  • feat: New feature (non-breaking change which adds functionality)
  • fix: Bug fix (non-breaking change which fixes an issue)
  • docs: Documentation only changes
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semicolons, etc.)
  • refactor: Code change that neither fixes a bug nor adds a feature
  • perf: Code change that improves performance
  • test: Adding missing tests or correcting existing tests
  • build: Changes that affect the build system or external dependencies
  • ci: Changes to CI configuration files and scripts
  • chore: Other changes that don't modify src or test files
  • revert: Reverts a previous commit
  • BREAKING CHANGE: Introduces a breaking change (can be combined with any type above)

Checklist

  • Code follows the style guidelines of this project
  • Code has been self-reviewed
  • Code has been commented, particularly in hard-to-understand areas
  • Code docstring/documentation-blocks for new or existing methods/components have been added or updated
  • Unit tests have been added or updated for any new or modified functionality

AI Usage

  • None: No AI tools were used in creating this PR
  • Light: AI provided minor assistance (formatting, simple suggestions)
  • Moderate: AI helped with code generation or debugging specific parts
  • Heavy: AI generated most or all of the code changes

@psyke83 psyke83 force-pushed the min_fps_target_fixes branch from 3a84519 to 3bac8e3 Compare April 9, 2026 19:29
@psyke83 psyke83 changed the title Min fps target fixes fix: Resolve minimum_fps_target related issues on all platforms; kmsgrab improvements Apr 9, 2026
@psyke83

psyke83 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

The basic issue that this PR aims to solve is framerate violations that occur when frame processing latency is a bit higher than usual. This can happen with any capture method, but a solid Linux testcase that can be replicated for the issue against master is the following:

  • Host running KDE, making sure that the hardware cursor plane is enabled (i.e., make sure KWIN_FORCE_SW_CURSOR=1 is not set in your environment)
  • Keep minimum_fps_target as the default (0) or unset.
  • Capture using kmsgrab + vaapi or vulkan.
  • Stream the desktop with active content that is rendering at the full stream framerate; for example, open https://www.vsynctester.com/ and leave it running.
  • Repeatedly hover the mouse over elements on the desktop that will rapidly trigger cursor shape changes, such as moving from the browser's address URL bar to the tab selection/window decorations so that the cursor toggles between the selection cursor and pointer. Avoid moving too fast, as you can trigger the "shake" cursor effect on KDE, which switches to a software cursor that is not affected by the issue.

Result on master:

  • During cursor shape changes, the decoding framerate violates the stream limit (bursting to 70+ on a 60fps stream) and frame queue delay becomes very high. This results in noticeable stuttering.

Results with PR:

  • The stream no longer violates the limit or has noticeable stuttering, and the minimum_fps_target still works as expected.

Requesting a test from @andygrundman and @oryschakj-personal if it's not too much trouble.

@ReenigneArcher I've also added two additional commits. One implements snapshot timeout + duplicate filtering on kmsgrab, and the other reverts the portalgrab workaround related to the same issue that this PR should hopefully solve. If you want we can split these into separate PRs, but I think it's helpful to test all three changes together as a first step.

@psyke83 psyke83 marked this pull request as ready for review April 9, 2026 20:03
@codecov

codecov Bot commented Apr 9, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

@codecov

codecov Bot commented Apr 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 0% with 6 lines in your changes missing coverage. Please review.
✅ Project coverage is 18.00%. Comparing base (7228c25) to head (3f71759).
⚠️ Report is 1 commits behind head on master.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/thread_safe.h 0.00% 1 Missing and 3 partials ⚠️
src/video.cpp 0.00% 1 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #4967      +/-   ##
==========================================
+ Coverage   17.36%   18.00%   +0.63%     
==========================================
  Files         108      109       +1     
  Lines       23220    23502     +282     
  Branches    10138    10374     +236     
==========================================
+ Hits         4033     4232     +199     
+ Misses      17075    16041    -1034     
- Partials     2112     3229    +1117     
Flag Coverage Δ
Archlinux 11.59% <0.00%> (+<0.01%) ⬆️
FreeBSD-14.3-aarch64 ?
FreeBSD-14.3-amd64 13.58% <0.00%> (+<0.01%) ⬆️
Homebrew-ubuntu-22.04 13.97% <0.00%> (+<0.01%) ⬆️
Linux-AppImage 12.26% <0.00%> (+<0.01%) ⬆️
Windows-AMD64 14.90% <0.00%> (?)
Windows-ARM64 13.23% <0.00%> (+<0.01%) ⬆️
macOS-arm64 19.02% <0.00%> (+<0.01%) ⬆️
macOS-x86_64 18.37% <0.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/platform/common.h 33.01% <ø> (+2.46%) ⬆️
src/platform/linux/pipewire.cpp 0.00% <ø> (ø)
src/video.cpp 32.37% <0.00%> (+0.13%) ⬆️
src/thread_safe.h 57.20% <0.00%> (+0.68%) ⬆️

... and 62 files with indirect coverage changes


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 7228c25...3f71759. Read the comment docs.

@psyke83 psyke83 force-pushed the min_fps_target_fixes branch from 3bac8e3 to 48e6847 Compare April 9, 2026 23:21
@psyke83 psyke83 changed the title fix: Resolve minimum_fps_target related issues on all platforms; kmsgrab improvements fix: Resolve minimum_fps_target related issues on all platforms Apr 9, 2026
@psyke83

psyke83 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

I've backed out the kmsgrab duplicate detection change as it was triggering some false timeouts. I'll check if that can be fixed later and send in a separate PR if so. The testcase and fix I described for kmsgrab still applies to this PR in its current state, however.

I'm still testing this PR with portalgrab to make 100% sure that it solves the issue of runaway framerate bursting; it's more difficult to reproduce consistently, so it may take some time to see if there's a regression.

@oryschakj-personal

Copy link
Copy Markdown

I got the build installed (48e6847) but can't get either VA-API or Vulkan running on my 5090. Is the fix still applicable to nvenc?

@psyke83

psyke83 commented Apr 10, 2026

Copy link
Copy Markdown
Contributor Author

I got the build installed (48e6847) but can't get either VA-API or Vulkan running on my 5090. Is the fix still applicable to nvenc?

Yes. You can still try the test case as long as you test with the kmsgrab capture method, the encoder shouldn't matter. This PR should resolve your issue reported in #4906 (but make sure the hardware cursor is enabled in kwin and set minimum_fps_target back to the default if you want to trigger the stutter issue properly).

@oryschakj-personal

Copy link
Copy Markdown

I got the build installed (48e6847) but can't get either VA-API or Vulkan running on my 5090. Is the fix still applicable to nvenc?

Yes. You can still try the test case as long as you test with the kmsgrab capture method, the encoder shouldn't matter. This PR should resolve your issue reported in #4906 (but make sure the hardware cursor is enabled in kwin and set minimum_fps_target back to the default if you want to trigger the stutter issue properly).

Excellent, thank you! I've been running this for a couple hours with the appropriate Sunshine config settings, vsync tester, stream stats, and top up and am not seeing any of the problems I reported for that bug.

@oryschakj-personal

Copy link
Copy Markdown

Actually - maybe a false alarm. I can recreate the laggy/stuttering mouse behavior with high Sunshine CPU usage and 50ms+ host processing times by mousing around an open Konsole window. Nothing needs to be running in the console session.

@psyke83

psyke83 commented Apr 11, 2026

Copy link
Copy Markdown
Contributor Author

@oryschakj-personal

It would really help if you could confirm: on master/stable builds, were you able to reproduce the specific symptoms of the framerate cap being violated during cursor shape changes using the testcase I described? Keep in mind that the high CPU usage in Sunshine that's specific to kmsgrab and cursor shape changes is not being solved by the PR, but the visible stuttering and framerate violations during this mouse movement is what I'm attempting to address.

With this PR, there are no stutters visible on the stream on my system when the cursor shape changes, but the maximum host processing latency does still increase from ~3-4ms to ~11-15ms when the mouse issue is triggered, and Sunshine's CPU usage still increases. I'm only testing at 60fps @ 1080P, but I did try a 120fps stream and it seems roughly the same (but my client has a 60Hz screen, so naturally I'm not seeing all frames).

I'll mark this as draft, as I've discovered some other issues related to minimum_fps_target that requires more investigation.

@psyke83 psyke83 marked this pull request as draft April 11, 2026 16:51
@andygrundman

Copy link
Copy Markdown
Contributor

Do you have problems if you set your min_fps to a lower value like 10 or 20? Does this affect Windows? I am not sure we should change this part of the code for everyone, if it's just a Linux issue.

I would really like to have a nice Linux test environment, if you guys have any tips let me know. I still get overwhelmed thinking about the matrix of backends and encoders and all the stuff I don't know how to run or test.

@psyke83

psyke83 commented Apr 11, 2026

Copy link
Copy Markdown
Contributor Author

@andygrundman

I believe that the logic needs to be changed in encode_run() as this logic is potentially exposing issues for all capture methods in different ways. Let me document what I know:

The kmsgrab backend has no duplicate filtering on frames, so it always captures at full framerate, and capture cadence is usually consistent, meaning that minimum_fps_target setting should not affect this capture method at all... in theory. There's one exception: the update_cursor() function has expensive mmap/memcpy calls that only happens when the cursor shape changes, causing quite large CPU usage and host latency spikes for individual frames (the testcase in comment 2 of this PR). During this time, multiple frames arrive at irregular intervals, but duplicate frames are also inserted which violates the framerate cap.

Portalgrab is receiving frames from the compositor via pipewire, and these buffers arrive at irregular intervals compared to a traditional capture method like DXGI or kmsgrab. If you recall, I effectively disabled duplicate frame insertion to work around the issue, but I had a lot of trouble reproducing a testcase to justify the change. Now I can reproduce it clearly:

Apr 11 19:27:58 archlinux sunshine[141610]: [2026-04-11 19:27:58.092]: Info: Minimum FPS target set to ~30fps (33.3333ms)
  • Using libstrangle, test content running at 45fps on a 60fps stream:
strangle 45 glxgears

This consistently results in the stream violating the framerate cap, running at 90fps for a 60fps stream due to duplicate frames being inserted and bunched together with the actual 45fps worth of frames.

I'm trying to find a better resolution than this PR as it stands currently. Some WIP code:

diff --git a/src/video.cpp b/src/video.cpp
index 09645818..346e7fb7 100644
--- a/src/video.cpp
+++ b/src/video.cpp
@@ -2069,6 +2069,9 @@ namespace video {
       }
     }
 
+    // 1. Initialize the tracker before the while(true) loop
+    auto last_encode_time = std::chrono::steady_clock::now();
+    const auto slack_factor = 2.5;
     while (true) {
       // Break out of the encoding loop if any of the following are true:
       // a) The stream is ending
@@ -2102,7 +2105,17 @@ namespace video {
 
       // Encode at a minimum FPS to avoid image quality issues with static content
       if (!requested_idr_frame || images->peek()) {
-        if (auto img = images->pop(max_frametime)) {
+        // 2. Calculate how much 'patience' we have left
+        auto now = std::chrono::steady_clock::now();
+        auto elapsed = now - last_encode_time;
+
+        // We want to wait until at least (max_frametime * slack_factor)
+        // has passed since the last encode.
+        auto wait_limit = std::chrono::duration_cast<std::chrono::milliseconds>(max_frametime * slack_factor);
+        auto remaining_wait = (wait_limit > elapsed) ? (wait_limit - elapsed) : 0ms;
+
+        if (auto img = images->pop(remaining_wait)) {
+          // We got a real frame!
           frame_timestamp = img->frame_timestamp;
           if (session->convert(*img)) {
             BOOST_LOG(error) << "Could not convert image"sv;
@@ -2110,6 +2123,10 @@ namespace video {
           }
         } else if (!images->running()) {
           break;
+        } else {
+          // 3. Timeout reached: We haven't seen a new frame in ~1.5x intervals.
+          // We will fall through and encode() the last known image as a duplicate.
+          BOOST_LOG(debug) << "Minimum FPS heartbeat triggered (Duplicate sent)"sv;
         }
       }
 
@@ -2117,6 +2134,7 @@ namespace video {
         BOOST_LOG(error) << "Could not encode video packet"sv;
         return;
       }
+      last_encode_time = std::chrono::steady_clock::now();
 
       session->request_normal_frame();
 

This resolves the 45 -> 90fps issue on portalgrab, but the slack factor needs consideration. If set to 1.5x, it doesn't fix the kmsgrab cursor stuttering. if set to 2.0x exactly, it resolves kmsgrab cursor stutter, but we may still see duplicates inserted for 30fps content on a 60fps stream for portalgrab.

I believe this issue can also potentially manifest on Windows, but I've not been testing Sunshine on that platform lately myself. There may be some issues tracked here (90fps FPS on a 60fps stream) that could point the finger to minimum_fps_target that can happen if the frame receive interval is erratic.

@psyke83

psyke83 commented Apr 11, 2026

Copy link
Copy Markdown
Contributor Author

Do you have problems if you set your min_fps to a lower value like 10 or 20? Does this affect Windows? I am not sure we should change this part of the code for everyone, if it's just a Linux issue.

I would really like to have a nice Linux test environment, if you guys have any tips let me know. I still get overwhelmed thinking about the matrix of backends and encoders and all the stuff I don't know how to run or test.

OT, but I have a SSD connected via a USB adapter plugged into my host PC, and I use ventoy + vtoyboot that allows me to native boot into multiple VDI images of Fedora, Arch etc., and the images are stored on an exfat partition. I believe it also supports booting from an ntfs partition (even your Windows partition), but I wouldn't risk it myself (hence the external storage).

@oryschakj-personal

oryschakj-personal commented Apr 11, 2026 via email

Copy link
Copy Markdown

@psyke83 psyke83 force-pushed the min_fps_target_fixes branch 3 times, most recently from d2cb654 to 7330c1f Compare April 14, 2026 15:28
@psyke83 psyke83 marked this pull request as ready for review April 14, 2026 15:29
@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

I believe these changes are worth checking. I haven't yet verified if Windows capture is affected negatively, but if I can test later if the build artifacts succeed.

Two commits are not directly related or needed to fix the bursting, but benefit from testing with these changes:

@andygrundman

I understand that you don't have a Linux test system up and running, but what are your thoughts on the main fix? Was this an oversight in the logging vs actual wait period to be used by the pop() timeout, or am I completely misunderstanding the intended logic of the minimum_fps_target? This change alone resolves all the bursting issues I was seeing with both portalgrab and kmsgrab, and fixes idle desktop (previously, 60fps at idle was settling on ~52fps, now idles at ~28-30fps).

@Kishi85

Kishi85 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

I'm going to give this a try after having a few issues with one game (Blue Prince) that is stuttering when streaming using moonlight-android (on a CCwGTV). I'm also getting Bandwidth warnings (and black screens on connecting until seeing activity) with moonlight-android on idle desktop (but I'm not sure if are related to Vulkan encoding with VBR yet). I'll report my findings once I've had some time to give this an extended try.

First thing I've noted with the patch is from having a minimum_fps_target=30 set explicitly in config (as a workaround for those moonlight-android issues) that the Desktop will idle at around ~15fps. Setting it to 40 will make the desktop idle at ~20fps. Removing the minimum_fps_target (or setting it to 0) and setting 60fps as the stream framerate in Moonlight will make the Desktop idle at ~28-30fps. Looks like the real minimum fps now is 1/2*minimum_fps_target if that is set with the current state of the patch.

EDIT: All using portalgrab with vulkan encoder on CachyOS latest with an RX9070XT

@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

I'm going to give this a try after having a few issues with one game (Blue Prince) that is stuttering when streaming using moonlight-android (on a CCwGTV). I'm also getting Bandwidth warnings (and black screens on connecting until seeing activity) with moonlight-android on idle desktop (but I'm not sure if are related to Vulkan encoding with VBR yet). I'll report my findings once I've had some time to give this an extended try.

If you could turn down the client bitrate to eliminate transient network issues that would help make sure it's not an issue with the PR. I don't believe any of my changes should cause bitrate bursting.

First thing I've noted with the patch is from having a minimum_fps_target=30 set explicitly in config (as a workaround for those moonlight-android issues) that the Desktop will idle at around ~15fps. Setting it to 40 will make the desktop idle at ~20fps. Removing the minimum_fps_target (or setting it to 0) and setting 60fps as the stream framerate in Moonlight will make the Desktop idle at ~28-30fps. Looks like the real minimum fps now is 1/2*minimum_fps_target if that is set with the current state of the patch.

EDIT: All using portalgrab with vulkan encoder on CachyOS latest with an RX9070XT

With the changes to this PR, that's the expected result; unset will select the stream framerate, and the value will be halved to give the actual target FPS which you can check from your log:

Apr 14 17:06:00 archlinux sunshine[54921]: [2026-04-14 17:06:00.514]: Info: Minimum FPS target set to ~30fps (33.3333ms)

The difference related to this logging is that master branch is lying about the frame time target (it was using a 16ms interval in my case). That's the main change that fixes the bursting issues on portalgrab and kmsgrab.

@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

I'm going to give this a try after having a few issues with one game (Blue Prince) that is stuttering when streaming using moonlight-android (on a CCwGTV). I'm also getting Bandwidth warnings (and black screens on connecting until seeing activity) with moonlight-android on idle desktop (but I'm not sure if are related to Vulkan encoding with VBR yet). I'll report my findings once I've had some time to give this an extended try.

Sorry, I misunderstood what you meant here. The previous is_event_driven() workaround was setting the target fps to 0.5fps and your Android client is having decoding issues due to the low framerate, right? If so, the PR will definitely help for that specific issue, as the workaround is reverted and portalgrab will use the same default FPS target as other capture methods.

@Kishi85

Kishi85 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

With the changes to this PR, that's the expected result; unset will select the stream framerate, and the value will be halved to give the actual target FPS which you can check from your log:

Apr 14 17:06:00 archlinux sunshine[54921]: [2026-04-14 17:06:00.514]: Info: Minimum FPS target set to ~30fps (33.3333ms)

The difference related to this logging is that master branch is lying about the frame time target (it was using a 16ms interval in my case). That's the main change that fixes the bursting issues on portalgrab and kmsgrab.

I see but then the config setting should probably be renamed shouldn't it? As it's more like the intended fps target and the minimum is half of that value or am I misunderstanding something here?

The previous is_event_driven() workaround was setting the target fps to 0.5fps and your Android client is having decoding issues due to the low framerate, right? If so, the PR will definitely help for that specific issue, as the workaround is reverted and portalgrab will use the same default FPS target as other capture methods.

That is what it looks like as setting a minium_fps_target of half the framerate set on moonlight was also helping with the issue. The patch is helping for that issue as expected.

@Kishi85

Kishi85 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

I see but then the config setting should probably be renamed shouldn't it? As it's more like the intended fps target and the minimum is half of that value or am I misunderstanding something here?

or just use 2*minimum_fps_target to get the intended effect.

@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

Well, it would help to understand the reason why it was changed. I believe the previous setting was causing issues on Windows, but I wasn't actively using Sunshine on that OS at the time. The documentation is half-correct; the value 0 is "treated" as half the stream framerate, but the effective value would be 60 for 60fps. Additionally, you would want to set 40 instead of 20 to avoid duplicating 24fps content.

@ReenigneArcher

Copy link
Copy Markdown
Member

I see but then the config setting should probably be renamed shouldn't it? As it's more like the intended fps target and the minimum is half of that value or am I misunderstanding something here?

or just use 2*minimum_fps_target to get the intended effect.

It seems linear on the lower end, but it's not linear as you go up.

Well, it would help to understand the reason why it was changed. I believe the previous setting was causing issues on Windows, but I wasn't actively using Sunshine on that OS at the time. The documentation is half-correct; the value 0 is "treated" as half the stream framerate, but the effective value would be 60 for 60fps. Additionally, you would want to set 40 instead of 20 to avoid duplicating 24fps content.

This goes way back to #754 which set the floor to ~10fps. But this caused other issues, so it became configurable. I really just wish we could stream the exact rate that's being requested. We shouldn't really worry about tiny bandwidth saving in my opinion, since live gamestreaming (or any kind of video streaming) is going to consume a ton of bandwidth anyway.

@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

If you look at the original implementation, the 10fps floor was correctly using a 100ms pop interval. Some time from then till now, the pop timeout interval became half the stated target floor (that was configured & logged), thus the effective frametime became the same as the stream's frametime (60fps -> 16ms), which was the main culprit for all the bursting issues.

@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

I'm also happy that this is configurable (even though it's not working on master as expected), as the difference between idle and 30fps is 10W+ in measured GPU load. Electricity is not cheap in Europe, and I don't have decoding issues at low framerate. Either way, the implementation needs to be fixed to resolve the bursting.

@psyke83

psyke83 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor Author

OK, so I've added a commit to align the variable with the actual desired FPS value, which is what the documentation already implies is the case.

minimum_fps_target = 0 or unset -> real value is assigned to (config.framerate / 2), so 30 for a 60fps stream.
minimum_fps_target = 30 -> (keeping in mind that both the fps and frametime target are now used for the base duplication logic):

Apr 14 21:41:41 archlinux sunshine[81074]: [2026-04-14 21:41:41.419]: Info: Minimum FPS target set to ~30fps (33.3333ms)

The PR is messy right now, but I'm trying to avoid squashing or rebasing commits so that my recent changes can be more easily tracked.

@andygrundman

Copy link
Copy Markdown
Contributor

If you have an Xbox try the Display-locked frame pacer, I think it’s the only actual solution to the variable framerate situation. The client takes over all responsibility for duping frames, and simply renders 1 frame every frame at the refresh rate, choosing between a new or repeat frame based on interpolating the incoming framerate. It works well, there is a bit more resource use on the client but no bandwidth is wasted. It would also let you stream at 1fps from the server if you wanted. I am almost done porting this frame pacer option to Mac and then the rest of Qt (plus lots more improvements like the ImGui graphs, a dev UI panel for viewing data and tweaking everything, etc.

@psyke83

psyke83 commented Apr 18, 2026

Copy link
Copy Markdown
Contributor Author

I've rebased the PR with just the minimal fixes; kmsgrab and pacing changes that will improve kmsgrab and 30fps pacing with portalgrab may be submitted later when the PR load reduces.

@ReenigneArcher I believe these changes are ready for merge, but I'd like to test a Windows build first. I'd appreciate if you could kick off a build when possible so I can test the Windows artifact, as my dev environment on my old Windows install was wiped. Thanks.

@ReenigneArcher

Copy link
Copy Markdown
Member

No worries. Your PRs are always welcomed and valuable. I really appreciate you testing and reviewing other PRs as well. It helps a lot!

@Kishi85

Kishi85 commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

This looks good on my end as well. Have been using it for a while now and haven't had any issues when using kmsgrab, portalgrab or kwingrab (#5009).

@ReenigneArcher

This comment was marked as resolved.

psyke83 added 3 commits April 18, 2026 23:09
The previous implementation called wait_for(delay) inside a manual loop,
causing the full timeout to reset on each spurious wakeup.
Replace with a single predicate-based wait_for call, which handles
spurious wakeups internally while correctly honoring the original deadline.
…interval alignment

The current minimum_fps_target and max_frametime intervals are set/logged incorrectly
and break capture methods on Linux. Example with a 60fps stream:

* default minimum_fps_target is populated as config.framerate (60),
* minimum FPS target is logged as 30 and interval logged as 33.33ms, but
  pop() interval is actually 16.6ms.
* result: default value is 2x what documentation implies should be the case.
  Setting a manual value logs the target FPS and interval incorrectly but
  sets the correct target interval for the duplicate insertion logic via pop().

Issues observed at 60fps:
* kmsgrab: fps cap violations and stuttering during cursor shape changes
  due to increased host processing latency triggering extra duplicates.
* portalgrab: idle desktop settles on ~52fps instead of the correct 30fps
  default target.
* portalgrab: massive framerate bursting due to irregular frame arrival
  that manifests at specific framerates; example: "strangle 45 glxgears"
  produces sustained 90fps on a 60fps stream. Can also manifest when framerate =
  stream framerate, but is harder to reproduce.

New behaviour:
* minimum_fps_target defaults to (config.framerate / 2), and max_frametime
  aligns with the actual minimum target FPS. This makes the logging accurate
  and the existing documention becomes sensible.
* kmsgrab: during expensive cursor updates, no more framerate violations
  or stuttering.
* portalgrab: desktop idles at 30fps instead of ~52fps.
* portalgrab: bursting is resolved. No more violations at 45fps, 60fps, etc.
@sonarqubecloud

Copy link
Copy Markdown

@psyke83

psyke83 commented Apr 19, 2026

Copy link
Copy Markdown
Contributor Author

@ReenigneArcher

I checked the Windows build and it looks OK to me. It may idle a bit lower than before (~22fps on a 60fps stream), but the previous behavior was logging an invalid interval and causing havoc with other capture methods, and the documentation was not making sense, so this fix should be committed IMO.

If the lower effective floor on Windows introduces an issue with poor client decoders, the proper fix would be to target a different default value of the minimum_fps_target variable, or add an artificial multiplication factor for known problematic capture method such as Windows instead of using the wrong pop() duplicate pacing interval. For my example, adding a 1.35 (or rather, 0.75 if the capture method really needs a shorter pop interval) factor for Windows only would bring it closer to 30, but of course it would need more testing and some clarity to make sure that the real frame interval is logged properly with the factor applied.

Using a factor to bring the real FPS to slightly above 50% of config.framerate would also indirectly benefit Linux capture, as it would help avoid unnecessary dropped frames caused by pipewire capture jitter for the exact half framerate case such as 30fps active rendering on a 60fps stream - but my duplicate pacing changes would be a better solution. We can revisit the pacing changes or evaluate a different default value later, if needed.

@ReenigneArcher ReenigneArcher merged commit 44bf39b into LizardByte:master Apr 19, 2026
72 of 73 checks passed
eball added a commit to Above-Os/Sunshine that referenced this pull request Jun 24, 2026
* chore(l10n): update translations (#4793)

* build(homebrew): dynamic link opus (#4826)

* fix(linux/wlgrab): add frame_timestamp using wayland's ready timestamp (#4787)

Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* fix(linux): use FQDN naming for all Linux packaging types (#4779)

Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* build(deps): bump lucide-vue-next from 0.576.0 to 0.577.0 (#4818)

Bumps [lucide-vue-next](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-vue-next) from 0.576.0 to 0.577.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.577.0/packages/lucide-vue-next)

---
updated-dependencies:
- dependency-name: lucide-vue-next
  dependency-version: 0.577.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* refactor(confighttp): HTML page handlers into generic getPage function (#4645)

* build(deps): move nvapi to official NVIDIA repo and bump to R590 (#3725)

* build(deps): bump vue-i18n from 11.2.8 to 11.3.0 (#4828)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.2.8 to 11.3.0.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.3.0/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(linux/xdgportal): implement event-driven capture (#4768)

* build(windows): sign windows executables (#4829)

* build(deps): bump vue from 3.5.29 to 3.5.30 (#4834)

Bumps [vue](https://github.com/vuejs/core) from 3.5.29 to 3.5.30.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.29...v3.5.30)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.30
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(l10n): update translations (#4831)

* fix(web-ui): add missing featured apps platform icons (#4837)

* ci(windows): disable signing for arm64 (#4838)

* fix(linux/xdgportal): descriptor/pointer cleanups (#4840)

* feat(web-ui): add browse feature to find directories/executables/files (#4848)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `5de4612` to `37eb3e5` (#4844)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `5de4612` to `37eb3e5`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/5de461271d05f43f267b954ac6010b410378ae47...37eb3e5bdc5a14d13ee27b85265aae2c5e9a60c2)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 37eb3e5bdc5a14d13ee27b85265aae2c5e9a60c2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/download-artifact from 8.0.0 to 8.0.1 in the github-actions group across 1 directory (#4842)

build(deps): bump actions/download-artifact

Bumps the github-actions group with 1 update in the / directory: [actions/download-artifact](https://github.com/actions/download-artifact).


Updates `actions/download-artifact` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(l10n): update translations (#4841)

* build(Fedora): Adjust version ranges for GCC selection (#4851)

* fix(linux/xdgportal): avoid duplicate frame insertion (#4839)

* build(deps): bump vmactions/freebsd-vm from 1.4.2 to 1.4.3 (#4849)

Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.4.2 to 1.4.3.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/c9f815bc7aa0d34c9fdd0619b034a32d6ca7b57e...4807432c7cab1c3f97688665332c0b932062d31f)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `fc11224` to `a61b494` (#4850)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `fc11224` to `a61b494`.
- [Commits](https://github.com/flathub/shared-modules/compare/fc1122496c63b13aa96ca2351a9662294291b9e0...a61b4949d10e96e5f8923284a1c847964ac3f9ad)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: a61b4949d10e96e5f8923284a1c847964ac3f9ad
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(linux): generate glad sources at compile time (#4798)

Co-authored-by: Conn O'Griofa <connogriofa@gmail.com>

* build(deps): bump third-party/doxyconfig from `ba47416` to `a9f0c38` (#4853)

Bumps [third-party/doxyconfig](https://github.com/LizardByte/doxyconfig) from `ba47416` to `a9f0c38`.
- [Commits](https://github.com/LizardByte/doxyconfig/compare/ba47416c88a7f5661fa1ed24b7300ef62185e877...a9f0c38766e53d29f1141098db237e51ba3d64d8)

---
updated-dependencies:
- dependency-name: third-party/doxyconfig
  dependency-version: a9f0c38766e53d29f1141098db237e51ba3d64d8
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(i18n): clarify cmd notes (#4856)

* build(deps): bump third-party/inputtino from `504f0ab` to `73e9fa1` (#4860)

Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `504f0ab` to `73e9fa1`.
- [Commits](https://github.com/games-on-whales/inputtino/compare/504f0abc7da8ebc351f8300fb2ed98db5438ee48...73e9fa11179c86c8801e1dbce1c329d2ca07621a)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: 73e9fa11179c86c8801e1dbce1c329d2ca07621a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/glad from `dcc4f69` to `73db193` (#4858)

Bumps [third-party/glad](https://github.com/Dav1dde/glad) from `dcc4f69` to `73db193`.
- [Release notes](https://github.com/Dav1dde/glad/releases)
- [Commits](https://github.com/Dav1dde/glad/compare/dcc4f69620ce15e3d40b3e8d907d293bd297dbe1...73db193f853e2ee079bf3ca8a64aa2eaf6459043)

---
updated-dependencies:
- dependency-name: third-party/glad
  dependency-version: 73db193f853e2ee079bf3ca8a64aa2eaf6459043
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/xdgportal): allow unified systemd service for all capture methods (#4854)

* feat(linux/keyboard): add F13-F24 keycodes (#4833)

* build(deps): bump apple-actions/import-codesign-certs from 6.0.0 to 6.1.0 (#4864)

build(deps): bump apple-actions/import-codesign-certs

Bumps [apple-actions/import-codesign-certs](https://github.com/apple-actions/import-codesign-certs) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/apple-actions/import-codesign-certs/releases)
- [Commits](https://github.com/apple-actions/import-codesign-certs/compare/b610f78488812c1e56b20e6df63ec42d833f2d14...fe74d46e82474f87e1ba79832ad28a4013d0e33a)

---
updated-dependencies:
- dependency-name: apple-actions/import-codesign-certs
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/nv-codec-headers from `22441b5` to `fe32761` (#4866)

build(deps): bump third-party/nv-codec-headers

Bumps [third-party/nv-codec-headers](https://github.com/FFmpeg/nv-codec-headers) from `22441b5` to `fe32761`.
- [Release notes](https://github.com/FFmpeg/nv-codec-headers/releases)
- [Commits](https://github.com/FFmpeg/nv-codec-headers/compare/22441b505d9d9afc1e3002290820909846c24bdc...fe32761e7a8bc79fcf560f356bf3898271bf4d56)

---
updated-dependencies:
- dependency-name: third-party/nv-codec-headers
  dependency-version: fe32761e7a8bc79fcf560f356bf3898271bf4d56
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/cache from 5.0.3 to 5.0.4 in the github-actions group across 1 directory (#4870)

build(deps): bump actions/cache

Bumps the github-actions group with 1 update in the / directory: [actions/cache](https://github.com/actions/cache).


Updates `actions/cache` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/cdf6c1fa76f9f475f3d7449005a359c84ca0f306...668228422ae6a00e4ad889ee87cd7109ec5666a7)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump codecov/codecov-action from 5.5.2 to 5.5.3 (#4871)

Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 5.5.3.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...1af58845a975a7985b0beb0cbe6fbbb71a41dbad)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 5.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `37eb3e5` to `cc1d7b8` (#4872)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `37eb3e5` to `cc1d7b8`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/37eb3e5bdc5a14d13ee27b85265aae2c5e9a60c2...cc1d7b8ddc859d611faed53c263af78a0aeb0c5c)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: cc1d7b8ddc859d611faed53c263af78a0aeb0c5c
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/inputtino from `73e9fa1` to `f4ce2b0` (#4873)

Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `73e9fa1` to `f4ce2b0`.
- [Commits](https://github.com/games-on-whales/inputtino/compare/73e9fa11179c86c8801e1dbce1c329d2ca07621a...f4ce2b0df536ef309e9ff318f75b460f7097d7c1)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: f4ce2b0df536ef309e9ff318f75b460f7097d7c1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux): use FQDN service name in desktop launcher (#4874)

* fix(linux/xdgportal): portalgrab capture stability & mutter compatibility (#4875)

* feat(macOS): Capture audio on macOS using Tap API (#4209)

Co-authored-by: David Lane <42013603+ReenigneArcher@users.noreply.github.com>

* feat(linux/glad): implement EGL_IMG_context_priority (#4857)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `cc1d7b8` to `5c73dc4` (#4880)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `cc1d7b8` to `5c73dc4`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/cc1d7b8ddc859d611faed53c263af78a0aeb0c5c...5c73dc44f2be1cc5968e4700ba67c32dfa11ba23)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 5c73dc44f2be1cc5968e4700ba67c32dfa11ba23
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump marked from 17.0.4 to 17.0.5 (#4881)

Bumps [marked](https://github.com/markedjs/marked) from 17.0.4 to 17.0.5.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.4...v17.0.5)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 17.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/doxyconfig from `a9f0c38` to `334ad6a` (#4888)

Bumps [third-party/doxyconfig](https://github.com/LizardByte/doxyconfig) from `a9f0c38` to `334ad6a`.
- [Release notes](https://github.com/LizardByte/doxyconfig/releases)
- [Commits](https://github.com/LizardByte/doxyconfig/compare/a9f0c38766e53d29f1141098db237e51ba3d64d8...334ad6a7421663be9edbaf4897c33b524642ca70)

---
updated-dependencies:
- dependency-name: third-party/doxyconfig
  dependency-version: 334ad6a7421663be9edbaf4897c33b524642ca70
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/libdisplaydevice from `b46492b` to `fe7e6a8` (#4887)

build(deps): bump third-party/libdisplaydevice

Bumps [third-party/libdisplaydevice](https://github.com/LizardByte/libdisplaydevice) from `b46492b` to `fe7e6a8`.
- [Release notes](https://github.com/LizardByte/libdisplaydevice/releases)
- [Commits](https://github.com/LizardByte/libdisplaydevice/compare/b46492be8e5d1933ead8fb8867a7910ed10b610a...fe7e6a81f65deae91594702e1a185f47229745b9)

---
updated-dependencies:
- dependency-name: third-party/libdisplaydevice
  dependency-version: fe7e6a81f65deae91594702e1a185f47229745b9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `a61b494` to `2f1fb18` (#4886)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `a61b494` to `2f1fb18`.
- [Commits](https://github.com/flathub/shared-modules/compare/a61b4949d10e96e5f8923284a1c847964ac3f9ad...2f1fb187252a619f4775e3126395584041b071fb)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 2f1fb187252a619f4775e3126395584041b071fb
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(csrf): make errors more apparent (#4889)

* fix: clear tray icon when unpairing the last paired client (#4890)

* feat(linux): add thread priority support for POSIX systems (#4885)

* build: fix build-deps tag matching (#4899)

* build(deps): bump third-party/tray from `4caf0d0` to `563dee4` (#4894)

Bumps [third-party/tray](https://github.com/LizardByte/tray) from `4caf0d0` to `563dee4`.
- [Release notes](https://github.com/LizardByte/tray/releases)
- [Commits](https://github.com/LizardByte/tray/compare/4caf0d0868aa45b98373249db8761551f7da7b03...563dee475f8878d252ab2b9938d3a014e776ed08)

---
updated-dependencies:
- dependency-name: third-party/tray
  dependency-version: 563dee475f8878d252ab2b9938d3a014e776ed08
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump msys2/setup-msys2 from 2.30.0 to 2.31.0 (#4893)

Bumps [msys2/setup-msys2](https://github.com/msys2/setup-msys2) from 2.30.0 to 2.31.0.
- [Release notes](https://github.com/msys2/setup-msys2/releases)
- [Changelog](https://github.com/msys2/setup-msys2/blob/main/CHANGELOG.md)
- [Commits](https://github.com/msys2/setup-msys2/compare/4f806de0a5a7294ffabaff804b38a9b435a73bda...cafece8e6baf9247cf9b1bf95097b0b983cc558d)

---
updated-dependencies:
- dependency-name: msys2/setup-msys2
  dependency-version: 2.31.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump lucide-vue-next from 0.577.0 to 1.0.0 (#4905)

Bumps [lucide-vue-next](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-vue-next) from 0.577.0 to 1.0.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.0.0/packages/lucide-vue-next)

---
updated-dependencies:
- dependency-name: lucide-vue-next
  dependency-version: 1.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump azure/trusted-signing-action from 1.1.0 to 1.2.0 (#4903)

Bumps [azure/trusted-signing-action](https://github.com/azure/trusted-signing-action) from 1.1.0 to 1.2.0.
- [Release notes](https://github.com/azure/trusted-signing-action/releases)
- [Commits](https://github.com/azure/trusted-signing-action/compare/87c2e83e6868da99d3380aa309851b32ed9a8346...b443cf8ea4124818d2ea9f043cba29fc3ec47b16)

---
updated-dependencies:
- dependency-name: azure/trusted-signing-action
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `5c73dc4` to `caca92b` (#4910)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `5c73dc4` to `caca92b`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/5c73dc44f2be1cc5968e4700ba67c32dfa11ba23...caca92bc6898ea40d6521b581fef2402ba3b3aae)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: caca92bc6898ea40d6521b581fef2402ba3b3aae
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump vue from 3.5.30 to 3.5.31 (#4911)

Bumps [vue](https://github.com/vuejs/core) from 3.5.30 to 3.5.31.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.30...v3.5.31)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump LizardByte/actions from 2026.227.200013 to 2026.328.161128 in the lizardbyte-actions group across 1 directory (#4920)

build(deps): bump LizardByte/actions

Bumps the lizardbyte-actions group with 1 update in the / directory: [LizardByte/actions](https://github.com/lizardbyte/actions).


Updates `LizardByte/actions` from 2026.227.200013 to 2026.328.161128
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/70bb8d394d1c92f6113aeec6ae9cc959a5763d15...0affa4f7bcb27562658960eee840eff8ff844578)

---
updated-dependencies:
- dependency-name: LizardByte/actions
  dependency-version: 2026.328.161128
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: lizardbyte-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* test(windows): fix display device tests with clang (#4921)

* chore: update global workflows (#4916)

* build(deps): bump codecov/codecov-action from 5.5.3 to 6.0.0 (#4913)

Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.3 to 6.0.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/1af58845a975a7985b0beb0cbe6fbbb71a41dbad...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build: Allow FFMPEG_PLATFORM_LIBRARIES to be overridden by the user (#4915)

* fix: restore stdin-based pairing (#4912)

* build(deps): bump third-party/moonlight-common-c from `6268780` to `7022b33` (#4923)

build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `6268780` to `7022b33`.
- [Commits](https://github.com/moonlight-stream/moonlight-common-c/compare/62687809b1f7410c3db4be2527503a54ae408d70...7022b337a9a682f1d974aed69f6065fa57b4164f)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-version: 7022b337a9a682f1d974aed69f6065fa57b4164f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(api/ui): add client enable/disable access control (#4771)

* fix(windows): update-path.bat registry command syntax in installer (#4902)

* build(deps): bump vmactions/freebsd-vm from 1.4.3 to 1.4.4 (#4928)

Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.4.3 to 1.4.4.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/4807432c7cab1c3f97688665332c0b932062d31f...7ca82f79fe3078fecded6d3a2bff094995447bbd)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.4.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(linux): Add Vulkan video encoder (#4603)

* build(deps): bump third-party/moonlight-common-c from `7022b33` to `7b026e7` (#4930)

build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `7022b33` to `7b026e7`.
- [Commits](https://github.com/moonlight-stream/moonlight-common-c/compare/7022b337a9a682f1d974aed69f6065fa57b4164f...7b026e77be62175104640e7e722b758df6d3d0d7)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-version: 7b026e77be62175104640e7e722b758df6d3d0d7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/nvapi from `9296d67` to `9b181ea` (#4917)

Bumps [third-party/nvapi](https://github.com/NVIDIA/nvapi) from `9296d67` to `9b181ea`.
- [Commits](https://github.com/NVIDIA/nvapi/compare/9296d671e71608d6d6b7749ed93989af4ada8858...9b181ea572f680327fe01a14a0f1f41c78034104)

---
updated-dependencies:
- dependency-name: third-party/nvapi
  dependency-version: 9b181ea572f680327fe01a14a0f1f41c78034104
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: update global workflows (#4936)

* build(deps): bump vue from 3.5.31 to 3.5.32 (#4941)

Bumps [vue](https://github.com/vuejs/core) from 3.5.31 to 3.5.32.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.31...v3.5.32)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump marked from 17.0.5 to 18.0.0 (#4957)

Bumps [marked](https://github.com/markedjs/marked) from 17.0.5 to 18.0.0.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.5...v18.0.0)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 18.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump vue-i18n from 11.3.0 to 11.3.1 (#4953)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.3.0 to 11.3.1.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.3.1/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `2f1fb18` to `6ea20c8` (#4949)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `2f1fb18` to `6ea20c8`.
- [Commits](https://github.com/flathub/shared-modules/compare/2f1fb187252a619f4775e3126395584041b071fb...6ea20c834ed5378c4ab5d36676650921eeac1367)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 6ea20c834ed5378c4ab5d36676650921eeac1367
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: redact logging of sensitive config & CSRF validation (#4955)

* fix(linux): correct "Pulseadio" typo in PulseAudio log messages (#4956)

* fix(linux/vulkan): add 16-bit DRM format support for HDR DMA-BUF import (#4962)

* fix(linux/xdgportal): Properly support multiple screens by exposing pipewire streams as separate displays (#4931)

* fix(linux/postins): allow running on rpm-ostree environments (#4963)

* build(deps): bump actions/github-script from 8.0.0 to 9.0.0 (#4970)

build(deps): bump actions/github-script in /

Bumps [actions/github-script](https://github.com/actions/github-script) in `/` from 8.0.0 to 9.0.0.


Updates `actions/github-script` from 8.0.0 to 9.0.0
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github_actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump vue-i18n from 11.3.1 to 11.3.2 (#4964)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.3.1 to 11.3.2.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.3.2/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/xdgportal): Improve multi-monitor support and work around breaking kmsgrab (#4969)

* chore: update global workflows (#4976)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `caca92b` to `9d9ad80` (#4983)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `caca92b` to `9d9ad80`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/caca92bc6898ea40d6521b581fef2402ba3b3aae...9d9ad80a55d730e4284d1f09a93da667c84a118a)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 9d9ad80a55d730e4284d1f09a93da667c84a118a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `6ea20c8` to `b8236c7` (#4975)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `6ea20c8` to `b8236c7`.
- [Commits](https://github.com/flathub/shared-modules/compare/6ea20c834ed5378c4ab5d36676650921eeac1367...b8236c7961e3dd447b1b9605375a54a12f9f24b6)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: b8236c7961e3dd447b1b9605375a54a12f9f24b6
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump peter-evans/create-pull-request from 8.1.0 to 8.1.1 (#4974)

build(deps): bump peter-evans/create-pull-request in /

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) in `/` from 8.1.0 to 8.1.1.


Updates `peter-evans/create-pull-request` from 8.1.0 to 8.1.1
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/c0f553fe549906ede9cf27b5156039d195d2ece0...5f6978faf089d4d20b00c7766989d076bb2fc7f1)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github_actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 (#4973)

build(deps): bump actions/upload-artifact in /

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) in `/` from 7.0.0 to 7.0.1.


Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github_actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/xdgportal): Additional error handling and minor code improvements (#4979)

* feat(linux/vulkan): enable RADV low-latency Vulkan Video encoding (#4984)

* build(deps-dev): bump vite from 6.4.1 to 6.4.2 (#4985)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.4.1 to 6.4.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.4.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.4.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.4.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* revert: "feat(linux/vulkan): enable RADV low-latency Vulkan Video encoding" (#4989)

* chore: update global workflows (#4990)

* fix(linux/vulkan): encoder not working on NVIDIA GPUs (#4994)

* chore(deps): update dependency @vitejs/plugin-vue to v6.0.6 (#4992)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/cache action to v5.0.5 (#4991)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux/vulkan): guard deprecated FFmpeg Vulkan queue lock/unlock (#5005)

* chore(deps): update dependency setuptools to v81 (#5003)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update lizardbyte/actions action to v2026.417.35446 (#5012)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.1 (#5011)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update vmactions/freebsd-vm action to v1.4.5 (#5001)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `9d9ad80` to `34ecf07` (#5015)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `9d9ad80` to `34ecf07`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/9d9ad80a55d730e4284d1f09a93da667c84a118a...34ecf07ef4843f36b3078637ca13f1dbb1c2963a)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 34ecf07ef4843f36b3078637ca13f1dbb1c2963a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update msys2/setup-msys2 action to v2.31.1 (#5016)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @codecov/vite-plugin to v2 (#4996)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux): auto-detect GPU with connected display for VAAPI and Vulkan (#4961)

* refactor(linux/xdgportal): Split pipewire code into it's own file so it can be reused (#5008)

* fix(rtsp): ignore clientRefreshRateX100 if more than 1% variance from framerate (#5027)

Co-authored-by: Andy Grundman <105828+andygrundman@users.noreply.github.com>

* fix: Resolve minimum_fps_target related issues on all platforms (#4967)

* fix(linux/vulkan): remove deprecated FFmpeg Vulkan queue lock/unlock (#5031)

* feat(nvenc): support for split frame encoding on GPUs with 2+ nvenc blocks (#4892)

Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* refactor(linux/xdgportal): Move elevated privilege check/drop to misc.cpp (#5026)

* fix(linux/vulkan): change default rate control from VBR to CBR (#5032)

* chore(deps): update actions/setup-node action to v6.4.0 (#5033)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.2 (#5022)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump third-party/nv-codec-headers from `e844e5b` to `33a9ede` (#5035)

build(deps): bump third-party/nv-codec-headers

Bumps [third-party/nv-codec-headers](https://github.com/FFmpeg/nv-codec-headers) from `e844e5b` to `33a9ede`.
- [Release notes](https://github.com/FFmpeg/nv-codec-headers/releases)
- [Commits](https://github.com/FFmpeg/nv-codec-headers/compare/e844e5b26f46bb77479f063029595293aa8f812d...33a9ede8d9914299d9262539c576a15bd0a19621)

---
updated-dependencies:
- dependency-name: third-party/nv-codec-headers
  dependency-version: 33a9ede8d9914299d9262539c576a15bd0a19621
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux): multi-GPU segfault + wlr GPU auto selection, DMA-BUF metadata planes and revert wlr vulkan support (#5030)

* chore(deps): update apple-actions/import-codesign-certs action to v7 (#5037)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix: touch scaling bug and initialize display variables as 0 (#4758)

Co-authored-by: Chase Payne <27069224+nonary@users.noreply.github.com>

* fix(network): restore ExternalIP in server info response (#5043)

* chore(deps): update dependency vue to v3.5.33 (#5042)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux/pipewire): Fix absolute touchinput for multi-monitor (#5041)

* refactor(linux): remove leftovers from portalgrab -> pipewire split (#5039)

* docs(readme): restructure feature compatibility tables (#5040)

* fix(linux/pipewire): calculate env_width/env_height from all displays for pipewire_display_t  (#5050)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `34ecf07` to `e39e586` (#5052)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `34ecf07` to `e39e586`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/34ecf07ef4843f36b3078637ca13f1dbb1c2963a...e39e58633c61060e3705b5a24d1b52e99a79f1b5)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: e39e58633c61060e3705b5a24d1b52e99a79f1b5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency vue-i18n to v11.4.0 (#5048)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(linux/xdgportal): Simplify display matching logic (#5053)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `e39e586` to `50a0768` (#5055)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `e39e586` to `50a0768`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/e39e58633c61060e3705b5a24d1b52e99a79f1b5...50a07682428880637a315e4225499b719317344f)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 50a07682428880637a315e4225499b719317344f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(linux/pipewire): Add support for pipewire stream selection by object serial (#5054)

* build(deps): bump third-party/build-deps from `c08f69d` to `cd7d45a` (#5056)

* build(deps): bump third-party/build-deps from `c08f69d` to `cd7d45a`

Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `c08f69d` to `cd7d45a`.
- [Release notes](https://github.com/LizardByte/build-deps/releases)
- [Commits](https://github.com/LizardByte/build-deps/compare/c08f69db10450bd06cf79045e79b9179c99bae70...cd7d45a4a1916d7949046162d81e859112ad3ab1)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-version: cd7d45a4a1916d7949046162d81e859112ad3ab1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update FFmpeg flatpak sources to v2026.425

Bump the FFmpeg prebuilt artifacts used by the Flatpak module to release v2026.425.130933. Updated download URLs and SHA256 checksums for x86_64 and aarch64 builds (dest-filename remains ffmpeg.tar.gz). No other changes.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* feat(capture/linux): add KWin direct screencast capture method (#5009)

Co-authored-by: Ramalama2 <6314556+Ramalama2@users.noreply.github.com>

* feat(linux/pipewire): Handle HDR(Rec. 2020/SMPTE 2084 PQ) visuals (#5025)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `50a0768` to `1895ec8` (#5073)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `50a0768` to `1895ec8`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/50a07682428880637a315e4225499b719317344f...1895ec86e460198100089435ecb7c387ebd2264d)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 1895ec86e460198100089435ecb7c387ebd2264d
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `b8236c7` to `2dfad85` (#5070)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `b8236c7` to `2dfad85`.
- [Commits](https://github.com/flathub/shared-modules/compare/b8236c7961e3dd447b1b9605375a54a12f9f24b6...2dfad855131c70ff7cafd32f3f4901c6d82b9247)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 2dfad855131c70ff7cafd32f3f4901c6d82b9247
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/wlr-protocols from `a741f0a` to `bf4fc79` (#5072)

Bumps [third-party/wlr-protocols](https://github.com/LizardByte-infrastructure/wlr-protocols) from `a741f0a` to `bf4fc79`.
- [Commits](https://github.com/LizardByte-infrastructure/wlr-protocols/compare/a741f0ac5d655338a5100fc34bc8cec87d237346...bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a)

---
updated-dependencies:
- dependency-name: third-party/wlr-protocols
  dependency-version: bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.3 (#5068)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(input): implement multiseat support and virtual device naming (#4954)

* fix(linux): security: drop CAP_SYS_ADMIN when possible, retain CAP_SYS_NICE (#5075)

* feat(linux/wlgrab): match output_name by xdg_output name (#5071)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `1895ec8` to `dda10aa` (#5077)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `1895ec8` to `dda10aa`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/1895ec86e460198100089435ecb7c387ebd2264d...dda10aa5949811589747e6e485da6ae2e86b5d2b)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: dda10aa5949811589747e6e485da6ae2e86b5d2b
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency vue to v3.5.34 (#5078)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(linux): add ubuntu 26.04 support (#5051)

* build(linux): fix gcov detection for ArchLinux (#5081)

* chore(deps): update dependency vue-i18n to v11.4.2 (#5080)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Merge commit from fork

* build(web-ui): commit lock file (#5083)

* fix: show actual bind address in Web UI log message (#4897)

* build(windows): Always setup Node.js in Windows CI (#5084)

* feat(nvenc): support intraRefresh for h264, add outputRecoveryPointSEI=1 to intra-refresh config for h264 and hevc (#5091)

* fix: building without the system tray enabled (#5092)

* build(deps): bump third-party/build-deps from `cd7d45a` to `d8b1d18` (#5097)

Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `cd7d45a` to `d8b1d18`.
- [Release notes](https://github.com/LizardByte/build-deps/releases)
- [Commits](https://github.com/LizardByte/build-deps/compare/cd7d45a4a1916d7949046162d81e859112ad3ab1...d8b1d18b7e82f8ee396bdd05e226896fa523b0df)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-version: d8b1d18b7e82f8ee396bdd05e226896fa523b0df
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `2dfad85` to `8c3f3cf` (#5098)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `2dfad85` to `8c3f3cf`.
- [Commits](https://github.com/flathub/shared-modules/compare/2dfad855131c70ff7cafd32f3f4901c6d82b9247...8c3f3cfa5a4af9a696ff0bfb3ed0eba404faaf5d)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 8c3f3cfa5a4af9a696ff0bfb3ed0eba404faaf5d
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* ci: remove moonlight discord release announcement (#5099)

* build(deps): Add SUNSHINE_SYSTEM_VULKAN_HEADERS option (#5103)

Signed-off-by: James Le Cuirot <chewi@gentoo.org>

* build(macos): configure C++ standard and ICU root (#5101)

* fix(macos): preserve modifier state in input events (#5102)

* build(windows): drop unused boost-locale (#5116)

* ci(windows): add linkage check (#5118)

* chore(deps): update azure/trusted-signing-action action to v2 (#5117)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(macos): provide left/right identity for modifiers (#5115)

* feat(web-ui): add logout (#5121)

* build(deps): bump third-party/moonlight-common-c from `7b026e7` to `2600bea` (#5123)

build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `7b026e7` to `2600bea`.
- [Commits](https://github.com/moonlight-stream/moonlight-common-c/compare/7b026e77be62175104640e7e722b758df6d3d0d7...2600beaf13f18bfa43453609cf5e3b84a4227760)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-version: 2600beaf13f18bfa43453609cf5e3b84a4227760
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency @vitejs/plugin-vue to v6.0.7 (#5122)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump third-party/plasma-wayland-protocols from `18afc45` to `4c015e9` (#5124)

build(deps): bump third-party/plasma-wayland-protocols

Bumps [third-party/plasma-wayland-protocols](https://github.com/KDE/plasma-wayland-protocols) from `18afc45` to `4c015e9`.
- [Commits](https://github.com/KDE/plasma-wayland-protocols/compare/18afc45c092857e998c890afce1e7e71f808d819...4c015e90ae6c88f2ffa766e899387ef431eade49)

---
updated-dependencies:
- dependency-name: third-party/plasma-wayland-protocols
  dependency-version: 4c015e90ae6c88f2ffa766e899387ef431eade49
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/pipewire): Add 10-bit RGB formats with 2-bit Alpha to format_map (#5088)

* chore: update global workflows (#5126)

* fix(audio): fix install of Steam Streaming Speakers driver (#5125)

* build(deps): bump third-party/doxyconfig from `334ad6a` to `e552f7c` (#5127)

Bumps [third-party/doxyconfig](https://github.com/LizardByte/doxyconfig) from `334ad6a` to `e552f7c`.
- [Release notes](https://github.com/LizardByte/doxyconfig/releases)
- [Commits](https://github.com/LizardByte/doxyconfig/compare/334ad6a7421663be9edbaf4897c33b524642ca70...e552f7c9f00cd0cf24764a37d0905935b3d2c188)

---
updated-dependencies:
- dependency-name: third-party/doxyconfig
  dependency-version: e552f7c9f00cd0cf24764a37d0905935b3d2c188
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build: bump freebsd version to 14.4 and build-deps to v2026.516.30821 (#5129)

* build(deps): bump third-party/inputtino from `f4ce2b0` to `b887f6a` (#5135)

Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `f4ce2b0` to `b887f6a`.
- [Commits](https://github.com/games-on-whales/inputtino/compare/f4ce2b0df536ef309e9ff318f75b460f7097d7c1...b887f6a37a4f6babea66ee7b9a79bc8f520d7554)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: b887f6a37a4f6babea66ee7b9a79bc8f520d7554
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(macos): scale remote scroll input using macOS scroll speed (#5133)

* chore(deps): update dependency vue-i18n to v11.4.3 (#5139)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore: fixes for release automation (#5142)

* chore(deps): update dependency vue-i18n to v11.4.4 (#5143)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency date-fns to v4.2.1 (#5145)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update codecov/codecov-action action to v6.0.1 (#5149)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(web): disconnect only the disabled client instead of all sessions (#5138)

* chore(deps): update dependency marked to v18.0.4 (#5151)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore: rename copilot-instructions.md to AGENTS.md (#5156)

* fix(Windows-installer): move ViGEmBus to ThirdParty group (#5157)

* feat(rtsp): add option to limit packetsize for clients that cannot configure it (#5153)

Signed-off-by: Georgi Valkov <gvalkov@gmail.com>

* feat(web-ui): Added Filtering & Searching to the Apps page (#5158)

Co-authored-by: Noklef <281545466+Noklef@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `dda10aa` to `ee65dc7` (#5155)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `dda10aa` to `ee65dc7`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/dda10aa5949811589747e6e485da6ae2e86b5d2b...ee65dc7a798be56de8c4c1ab73411461cac020b4)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: ee65dc7a798be56de8c4c1ab73411461cac020b4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(crowdin): set commit message (#5160)

* chore(l10n): update translations (#5161)

* fix(web): the packetsize upper limit is 65535 (#5167)

Signed-off-by: Georgi Valkov <gvalkov@gmail.com>

* chore(l10n): update translations (#5162)

* chore(deps): update dependency date-fns to v4.3.0 (#5172)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `ee65dc7` to `96e2fe8` (#5165)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `ee65dc7` to `96e2fe8`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/ee65dc7a798be56de8c4c1ab73411461cac020b4...96e2fe8bf7d2e5791ca1bdce2dba373f1e27c425)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 96e2fe8bf7d2e5791ca1bdce2dba373f1e27c425
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update lizardbyte/actions action to v2026.522.121358 (#5173)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(web-ui): add documentation link and version-aware URLs (#5176)

* chore(deps): update lizardbyte/actions action to v2026.524.145234 (#5177)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): migrate from lucide-vue-next to @lucide/vue (#5179)

* chore(l10n): update translations (#5178)

* chore: Add CLion run configuration for 'sunshine' (#5181)

* build(freebsd): fix npm install (#5182)

* fix(linux): migrate to qt tray (#4907)

Co-authored-by: Kishi <41839133+Kishi85@users.noreply.github.com>

* fix: explicitly check construct function error in thread_safe.h (#5184)

* build(macos): quote SHOULD_SIGN env expansion in install script (#5185)

* fix(macos/packaging): add NSLocalNetworkUsageDescription so Bonjour can register (#5186)

* chore(l10n): update translations (#5193)

* fix(linux/vulkan): preserve host aspect ratio in encoder output (#5130)

* fix(macos): drop max_ref_frames=1 for h264_videotoolbox and enable PARALLEL_ENCODING (#5200)

* chore(deps): update dependency vue to v3.5.35 (#5204)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(l10n): update translations (#5196)

* build(Archlinux): Shallow clone dependent submodules (#5206)

* chore(deps): update dependency @lucide/vue to v1.17.0 (#5210)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/setup-dotnet action to v5.3.0 (#5208)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux/vulkan): Ensure RADV vulkan video encoding is enabled on newer versions of Mesa (#5211)

* fix(linux/kwin): retry init with fully dropped elevated privileges in case KWin is missing CAP_SYS_NICE on linux (#5212)

* feat(web-ui): Updated `Add` / `Edit` app form to use modals + new `Delete` App UI flow (#5166)

* chore(deps): bump wayland-protocols to 1.48 (#5219)

* chore(deps): update dependency date-fns to v4.4.0 (#5215)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(l10n): update translations (#5220)

* build(deps): bump third-party/tray from `6332649` to `df9af11` (#5221)

Bumps [third-party/tray](https://github.com/LizardByte/tray) from `6332649` to `df9af11`.
- [Release notes](https://github.com/LizardByte/tray/releases)
- [Commits](https://github.com/LizardByte/tray/compare/6332649ac6c051453c00327919e84472c7a2f660...df9af119085e2cd3f1a9e88e4cc865963879d468)

---
updated-dependencies:
- dependency-name: third-party/tray
  dependency-version: df9af119085e2cd3f1a9e88e4cc865963879d468
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(python): migrate to uv (#5222)

* build(homebrew): fix service install on linux (#5223)

* chore(gh-pages): remove unused jquery dependency (#5235)

* docs(contributing): refresh clang-format guidance (#5233)

* chore(deps): update vmactions/freebsd-vm action to v1.4.6 (#5226)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(l10n): update translations (#5229)

* chore(deps): update dependency bootstrap-icons to v1.13.1 (#5239)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency vite to v6.4.3 (#5238)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update official github actions to v6.0.3 (#5242)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency simple-icons to v13 (#5243)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency simple-icons to v16 (#5248)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: David Lane <42013603+ReenigneArcher@users.noreply.github.com>

* chore(deps): use lizardbyte-common for python helpers (#5250)

* chore(deps): update lizardbyte/actions action to v2026.605.34721 (#5253)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.5 (#5251)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update astral-sh/setup-uv action to v8.2.0 (#5245)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update codecov/codecov-action action to v7 (#5262)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency vue-i18n to v11.4.5 (#5256)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `96e2fe8` to `ac5a296` (#5263)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `96e2fe8` to `ac5a296`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/96e2fe8bf7d2e5791ca1bdce2dba373f1e27c425...ac5a296ac6111aa2319daf532f609a067b88d8a9)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: ac5a296ac6111aa2319daf532f609a067b88d8a9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/wayland-protocols from `02e63e7` to `ee78491` (#5271)

build(deps): bump third-party/wayland-protocols

Bumps [third-party/wayland-protocols](https://github.com/LizardByte-infrastructure/wayland-protocols) from `02e63e7` to `ee78491`.
- [Commits](https://github.com/LizardByte-infrastructure/wayland-protocols/compare/02e63e74a807afed95bc25a386173110afef24e3...ee78491a237eaff9389a0ccf8680521d074407d3)

---
updated-dependencies:
- dependency-name: third-party/wayland-protocols
  dependency-version: ee78491a237eaff9389a0ccf8680521d074407d3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(homebrew): bump ubuntu to 24.04 (#5272)

* fix(wayland): support DMA-BUF modifiers for wlroots capture (#5132)

* chore(deps): bump libdisplaydevice (#5280)

* chore(deps): update vue monorepo to v3.5.37 (#5281)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(tray): fix compiling without system tray enabled (#5284)

* chore(deps): update msys2/setup-msys2 action to v2.32.0 (#5285)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update lucide monorepo to v1.18.0 (#5287)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update vue monorepo to v3.5.38 (#5283)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(Linux/AppImage): replace gtk plugin with qt plugin for system tray (#5295)

* feat(linux): Add hardware yuv444 chromasubsampling support on nvidia cards (cuda/cuda gl) (#4965)

* chore(deps): lock file maintenance (#5269)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump third-party/tray from `df9af11` to `8ea4c68` (#5296)

Bumps [third-party/tray](https://github.com/LizardByte/tray) from `df9af11` to `8ea4c68`.
- [Release notes](https://github.com/LizardByte/tray/releases)
- [Commits](https://github.com/LizardByte/tray/compare/df9af119085e2cd3f1a9e88e4cc865963879d468...8ea4c6835d623b1095a6c8885d70e6c836ca2307)

---
updated-dependencies:
- dependency-name: third-party/tray
  dependency-version: 8ea4c6835d623b1095a6c8885d70e6c836ca2307
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update lucide monorepo to v1.20.0 (#5297)

Co-authored-by: renovate[bot] <29139614+renovate[…
Kishi85 added a commit to Kishi85/Sunshine that referenced this pull request Jun 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Mouse movement spikes CPU usage with KMS

5 participants