Skip to content

Add Decky Clipper plugin#1003

Open
Managor wants to merge 11 commits intoSteamDeckHomebrew:mainfrom
Managor:submodule
Open

Add Decky Clipper plugin#1003
Managor wants to merge 11 commits intoSteamDeckHomebrew:mainfrom
Managor:submodule

Conversation

@Managor
Copy link
Copy Markdown

@Managor Managor commented Mar 19, 2026

Add Decky Clipper to Plugin Store

Decky Clipper is a successor to Decky Recorder. In its current state Decky Recorder is broken and adding this plugin would add a functioning recording program to Decky. I occasionally need to record the Steam UI, which the builtin tools don't provide.

Task Checklist

Developer

  • I am the original author or an authorized maintainer of this plugin.
  • I have abided by the licenses of the libraries I am utilizing, including attaching license notices where appropriate.

Plugin

  • I have verified that my plugin works properly on the Stable and Beta Main update channels of SteamOS.
  • I have verified my plugin is unique or provides more/alternative functionality to a plugin already on the store.

Backend

  • No: I am using a custom backend other than Python.
  • Not sure: I am using a tool or software from a 3rd party FOSS project that does not have it's dependencies statically linked.
  • No: I am using a custom binary that has all of it's dependencies statically linked.

Community

  • I have tested and left feedback on two other pull requests for new or updating plugins.
  • I have commented links to my testing report in this PR.

Testing

  • Tested by a third party on SteamOS Stable or Beta update channel.

@Managor Managor requested a review from a team as a code owner March 19, 2026 21:36
@github-actions github-actions bot added the plugin-addition Adding a plugin to the Plugin Store label Mar 19, 2026
@github-actions
Copy link
Copy Markdown

Issues Found

  • Both testing boxes are present in your description. Please remove one of them per the Markdown comment above the testing section.

Next Steps

  1. If we found any issues above, please edit your pull request description to resolve them and leave a comment saying you've done so.
  2. For the quickest review, please see the Community section of the pull request template for how you can help other developers.
  3. Once your description is correct, a maintainer will review your pull request as soon as possible.

Thank you for your contribution! If you need any help, please reach out on our Discord server. ❤️

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 19, 2026

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 19, 2026

I accidentally added the wrong url. I'll fix that

@EMERALD0874
Copy link
Copy Markdown
Member

@Managor Just to confirm—this plugin is significantly different from Decky Recorder in terms of UX? If it's similar enough to be considered an "update", you could take ownership of the original plugin and this could be considered a refactor so users can easily update through the plugin store. Just let us know what you prefer.

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 20, 2026

I don't know if there's any migratory steps to take. As a novice I'd rather start from scratch to learn. Also Recorder is broken.

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 21, 2026

0.7.3 ironed out some kinks. Github artifacts seem to replace spaces with periods. Is there a way to have the space so that the list view shows "Decky Clipper" and not "Decky-Clipper"?

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 21, 2026

Decky recorder also does things that Clipper doesn't do and I don't see myself supporting. Better to start with a new store entry to keep the user expectations in check.

@maroun2

This comment was marked as outdated.

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 21, 2026

In the decky loader it showing 0.7.3 version.

Goddammit. I always forget to bump the version within package.json

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 21, 2026

@maroun2 That should be fixed now

@maroun2
Copy link
Copy Markdown

maroun2 commented Mar 22, 2026

@Managor every video now have around 1s for me only no mather what. See the log please.
2026-03-22 06.32.29.log

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 24, 2026

@maroun2 Can you try the latest build? I changed nothing, but I created a new logging system that should help me understand more of what's happening.

It sounds a little bit like Managor/Decky-Clipper#1. Likely Chrome being a desktop app which makes it run at 0fps which causes the video to not work correctly. If possible, can you test with a game that outputs with a stable framerate?

@maroun2
Copy link
Copy Markdown

maroun2 commented Mar 25, 2026

2026-03-25 19.03.39.log
I played whole level and the final file has 309kb, 2026-03-25_19_04_52-Kingdom Rush Frontiers.
@Managor

@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 26, 2026

[2026-03-25 19:04:53,466][INFO]: STDOUT: ../gstreamer/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.c(703): gst_va_base_enc_handle_frame (): /GstPipeline:pipeline0/GstVaH264Enc:vah264enc0
[2026-03-25 19:04:53,466][INFO]: STDOUT: Execution ended after 0:00:00.174378460
[2026-03-25 19:04:53,466][INFO]: STDOUT: Setting pipeline to NULL ...
[2026-03-25 19:04:53,466][INFO]: STDOUT: ERROR: from element /GstPipeline:pipeline0/GstPipeWireSrc:pipewiresrc0: Internal data stream error.
[2026-03-25 19:04:53,466][INFO]: STDOUT: Additional debug info:
[2026-03-25 19:04:53,466][INFO]: STDOUT: ../gstreamer/subprojects/gstreamer/libs/gst/base/gstbasesrc.c(3177): gst_base_src_loop (): /GstPipeline:pipeline0/GstPipeWireSrc:pipewiresrc0:

Seems like either VAAPI or pipewiresrc is the culprit here. Are you on a device other than Steam Deck? Different hardware configuration could explain why I haven't encountered this on my own device.
Never mind. It says description=(string)"AMD\ Custom\ GPU\ 0932" right there in the log and I have the same.
I have zero clue where to start with this.

I pushed another version and enabled the verbose flag for gstreamer. Hopefully that can help shed light on the issue.

@Managor Managor marked this pull request as ready for review March 28, 2026 05:15
@Managor
Copy link
Copy Markdown
Author

Managor commented Mar 30, 2026

@EMERALD0874 This is now in a state that it's ready for the testing repo... I think.

@moi952
Copy link
Copy Markdown

moi952 commented Apr 3, 2026

Hi, I tried version v0.9.13 on Legion GO S Z1E with SteamOS 3.9 and the beta client.

It's producing 0-byte videos.

Unfortunately, when I try to play the video, nothing is displayed, neither in the plugin nor via VLC on the desktop.

Here's my log file.

2026-04-03 14.11.26.log

@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 3, 2026

Thanks. Did you move at all while recording Chrome? If the program doesn't output any frames, gamescope won't either and the pipeline does nothing. Try recording a game that produces a stable framerate.

If that does nothing there might be other issues. The program segfault at the end so there might be problems with the vaapi encoder. Try messing around in the terminal to find the root cause. Try replacing any element in the pipeline with a fakesink. For example:

GST_PLUGIN_PATH=/home/deck/homebrew/plugins/Decky-Clipper/bin/gstreamer-1.0 gst-launch-1.0 -ve pipewiresrc do-timestamp=true target-object=gamescope client-name=Video-capture ! queue ! videorate ! video/x-raw,format=NV12 ! videoconvert ! fakesink

This would help determine if there's anything wrong before vah264enc

@moi952
Copy link
Copy Markdown

moi952 commented Apr 3, 2026

Thanks. Did you move at all while recording Chrome? If the program doesn't output any frames, gamescope won't either and the pipeline does nothing. Try recording a game that produces a stable framerate.

If that does nothing there might be other issues. The program segfault at the end so there might be problems with the vaapi encoder. Try messing around in the terminal to find the root cause. Try replacing any element in the pipeline with a fakesink. For example:

GST_PLUGIN_PATH=/home/deck/homebrew/plugins/Decky-Clipper/bin/gstreamer-1.0 gst-launch-1.0 -ve pipewiresrc do-timestamp=true target-object=gamescope client-name=Video-capture ! queue ! videorate ! video/x-raw,format=NV12 ! videoconvert ! fakesink

This would help determine if there's anything wrong before vah264enc

Ah, I tried launching a game and it does work.

I thought it could also record the interface without having to launch a game. That seemed handy for making plugin test videos and showing how my plugin works.

It would be nice to be able to record the screen via ffmpeg without taking into account what is displayed on the screen.

Wouldn't it be wise not to create a video (or delete it) if no frames are recorded?

That would avoid a lot of bug tickets 😜

@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 3, 2026

I thought it could also record the interface without having to launch a game. That seemed handy for making plugin test videos and showing how my plugin works.

No, it does record the interface, it's just that the interface needs to have activity for it to send at least a single frame. The videorate element will then duplicate the frame and the video will roll. I've currently waiting for Steamos 3.9.0 to roll into stable with pipewire 1.6 so that I can swap videorate for keepalive-time=. After that I'll look into options for injecting a single frame at the start of the pipeline somehow or contacting gamescope devs to push one frame into the pipewire node whenever a new recording device connects. It's a waiting game.

Wouldn't it be wise not to create a video (or delete it) if no frames are recorded?

That would avoid a lot of bug tickets 😜

I'll look into it some day.

@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 3, 2026

Just tested with native Steam recording, they have the same issue. If I turn off recording and then turn it back on while chromium is producing no frames, Steam records nothing. Steam just has the advantage of automatically turning the recording on before chromium produces the first frame.

@EMERALD0874
Copy link
Copy Markdown
Member

@Managor @moi952 Please keep plugin testing and development to the plugin's repo if it hasn't been reviewed by a tester yet. Seeing as this plugin is still receiving commits as of today despite saying the plugin is ready for review, I am marking this PR as a draft. Please mark as ready for review only once you are satisfied with the current state of your plugin and will not update the PR with new changes again other than to address bugs.

@EMERALD0874 EMERALD0874 marked this pull request as draft April 3, 2026 17:16
@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 3, 2026

I'm adding features. The core part of the plugin was ready long ago. I was thinking it would be nice for the users to get the latest stuff once the plugin enters the testing repo. The plan was to enter feature freeze the moment someone reviews the code.
I'll do a 1.0.0 release now.

@Managor Managor marked this pull request as ready for review April 3, 2026 20:02
Copy link
Copy Markdown
Member

@EMERALD0874 EMERALD0874 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Please confirm that your plugin needs root access.
  • Could you provide a little more information in your description? Like "Records your entire screen, including Steam UI" or something similar. It would be helpful for users who don't understand the difference between this and game recording.
  • Can you please explain how/why your plugin serves videos on a web server?
  • If you aren't using the py_modules folder, please remove it.
  • If you aren't using the defaults folder, please remove it.
  • If you aren't using the backend folder, please remove it.

@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 10, 2026

  • No root access needed. Clipper uses the pipewire node provided by gamescope to record the screen. Steam native recording uses the same method but stops recording as soon as the game stops running. Should this be mentioned somewhere in the metadata?
  • Updated the description to explain what you can record and why.
  • I wasn't able to figure out a better way to view the videos in gamemode. It was a pain to go into desktop to view what you had actually recorded or use an external computer and connect with sftp (which a common user isn't going to do). I'm open for suggestions.
  • Deleted unused directories
  • backend directory is in use. It installs Gstreamer dependencies in the docker container and then copies them to the install zip since they're not preinstalled on the Deck. I'm waiting for vulkanh264enc to be available so I can drop vah264enc and this method of dependency adding.

Copy link
Copy Markdown

@mdeguzis mdeguzis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a comparison table on how this stacks up to the native screen recording Valve already has?

@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 14, 2026

Can you elaborate on what the comparison table should contain?

@mdeguzis
Copy link
Copy Markdown

I would review https://store.steampowered.com/gamerecording and see what the plugin would add / improve here. I used Decky Loader exclusively before Valve released recording officially, so it would be good to highlight differences and what this does better.

@Managor
Copy link
Copy Markdown
Author

Managor commented Apr 14, 2026

The readme already tells what it does better. Please provide concrete things you want to know.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

plugin-addition Adding a plugin to the Plugin Store

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants