Skip to content

Add Docky plugin - #1102

Open
datbird wants to merge 3 commits into
SteamDeckHomebrew:mainfrom
datbird:add/docky
Open

Add Docky plugin#1102
datbird wants to merge 3 commits into
SteamDeckHomebrew:mainfrom
datbird:add/docky

Conversation

@datbird

@datbird datbird commented Aug 7, 2026

Copy link
Copy Markdown

Add Docky to Plugin Store

Docky is a Steam Deck automation plugin on a Task → Action → Mode model, run manually or by triggers (dock/undock, AC power, controller connect, resume, startup). It ships built-in dock fixes (docked-audio sink switch, controller order, gamescope composition/stretch, TDP cap), a temp→RPM fan-control engine with named profiles, and full Sunshine game-streaming control.

How it differs from decky-sunshine: decky-sunshine only starts/stops Sunshine. Docky is a broader automation framework whose Sunshine support is one integrated Action — it can drive Sunshine directly or defer to decky-sunshine — and adds self-healing mDNS discovery, capture-health recovery, and Sunshine⇄Desktop GPU coexistence not offered elsewhere.

Root disclosure: Docky declares flags:["root"]. For Sunshine KMS capture, it creates a setuid-root copy of the system's own bwrap under /var/lib/docky (root-owned chain; /tmp and /run are nosuid on SteamOS). Rationale and the security hardening (TOCTOU guards, clean_env, subprocess timeouts) are in docs/design-notes.md and docs/decky-integration.md. It bundles no third-party binaries — the backend is pure Python, the frontend builds from source.

Repo: https://github.com/datbird/docky (v1.4.8)

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.
  • Generative AI was NOT used to write a majority of the code I am submitting.

Plugin

  • I have verified that my plugin works properly on the Stable and Beta 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.
  • No: 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.

@datbird
datbird requested a review from a team as a code owner August 7, 2026 03:23
@github-actions github-actions Bot added the plugin-addition Adding a plugin to the Plugin Store label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown

Issues Found

No issues with your PR description were found.

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. ❤️

@datbird datbird changed the title Add/docky Add Docky plugin Aug 7, 2026
@datbird

datbird commented Aug 7, 2026

Copy link
Copy Markdown
Author

Completed the two community testing requirements. Both were built from source at the PR's pinned commit and tested on a Steam Deck OLED running SteamOS 3.8.16 Stable with Decky Loader v3.2.6.

Testing reports:

Both plugins work as advertised. I've reported what I found in each, including a couple of backend issues worth a look, and left both installed so I can re-test if the authors push changes.

Still looking for a third party to test Docky on SteamOS Stable or Beta. Happy to help however is useful in the meantime.

@github-actions

Copy link
Copy Markdown

This pull request is stale as no updates or testing reports have been posted within the last 7 days. Please ensure you are actively recruiting testers or resolving the issues discussed. If you do not remove the stale label or comment, this will be closed in 7 days. Please close this pull request if you need more time to resolve issues so we can keep our repo healthy.

@datbird

datbird commented Aug 15, 2026

Copy link
Copy Markdown
Author

Continued efforts to try and get plugin tested and approved have been fruitless on the Decky plugin Discord. I am continuing to stay engaged on the Discord and recruit testers. Please keep the PR open until I get someone to review.

@datbird

datbird commented Aug 21, 2026

Copy link
Copy Markdown
Author

On this plugin's authorship history

I would rather state this up front than have a reviewer find it on their own.

In mid July I posted Docky in the Decky Discord looking for testers. AAGaming
looked at it and said it could not be accepted because it was mostly LLM code.
That was a fair read of the repo as it stood. AAGaming and NGnius then clarified
the actual policy for me: LLM assistance is fine for boilerplate and normal
tooling, but you should not write a plugin through an agent, because it produces
code that is hard to review, hard to maintain, and that the author cannot fix
when it breaks. I asked directly whether the plugin would get equal
consideration if I went through it myself, rewrote it, and published my own
commits. I was told yes.

That is what I did. The git history shows it plainly rather than hiding it.

Everything up to commit 4e58fdc (2026-07-15) carries a Co-Authored-By: Claude
trailer. That is 75 of the repo's 95 commits. I am not rewriting history to
erase them.

Every commit after that point is mine, with no trailer. That is 17 commits from
2026-07-16 to 2026-08-06, covering 36 files, 3,209 insertions and 2,767
deletions. It rewrote every backend module (main.py, docky.py, sunshine.py,
deckops.py, padswap.py, mdns.py, sysenv.py) and every frontend component.
It was not a cosmetic pass. I went through the plugin file by file, rewrote the
parts I did not want to own, fixed real bugs I found on the way, and documented
the platform behaviour I had to learn in order to do it.

"I refactored it" is easy to say and hard to verify, so here is what actually
came out of that work:

  • Removed a force HDR toggle built on a wrong premise. Latching gamescope's
    HDR atom does not gate a client's ability to request HDR. HDR is negotiated in
    the stream protocol from the encoder. The toggle enabled nothing and broke every
    SDR client. I removed it and added a migration that unlatches the atom on
    upgrade, so nobody is left stuck in HDR with no UI to undo it.
  • Tracked down a Moonlight black screen to the encoder, not to capture. The
    Deck's hevc_vaapi emits an IDR the bitstream parser cannot read on Mesa 26.0.6
    and Van Gogh. Sunshine advertises HEVC from an encoder open probe, which proves
    only that the encoder starts, not that its output decodes. That is now a
    documented toggle with a warning instead of a silent black screen.
  • Found that Steam's on screen keyboard swallows the click on any Decky panel
    button behind it.
    pointerdown reaches the button, but the following click
    is retargeted to the element underneath, so React's onClick never runs. I
    proved it over CDP on the device rather than guessing, then fixed it with a
    pointerdown handler alongside onClick behind a timestamp guard. This is not
    specific to Docky and will affect any plugin with a text field above a submit
    button.
  • Found that decky-frontend-lib's types describe intent, not runtime. DFL
    finds Steam's components by webpack sniffing, so the hand written types
    describe what it expects, not what the injected component honours. TextField
    silently drops onKeyDown. SliderField is not exposed and crashes the panel
    with React Add AutoFlatpaks #130. A green tsc proves nothing there, so I verify props on
    device and catch events on a wrapper in the capture phase.
  • Removed api_version: 1 from plugin.json after it broke every panel to
    backend call. Docky uses DFL's legacy callPluginMethod, and the loader
    rejects legacy methods above api_version 0. The store template ships
    api_version: 1 because it uses @decky/ui, which is why I got it wrong in the
    first place.

I am not claiming the plugin is flawless. I am claiming I understand it well
enough to maintain it, which was the concern actually raised, and the items above
are the evidence for that rather than an assertion.

If the history still disqualifies it, I would rather hear that directly than keep
the PR open on a false hope.

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.

1 participant