Steam Deck automation, driven entirely from Game Mode. Docky is a Decky Loader plugin that runs Actions when something happens — you dock, unplug AC, connect a controller, wake from sleep, or boot — and ships built-in fixes for the common docked-mode annoyances (audio not switching, the controller-order shuffle, the docked stretch/blur, performance). It also fully manages Sunshine game streaming.
Everything is built and edited in the Quick Access panel — no config files, no Desktop Mode required.
Task — one atomic operation (a built-in fix, a file op, or run a script/binary)
Action — an ordered list of Tasks
Mode — a named set of Actions, activated manually or by a Trigger
Trigger— an event (dock/undock, AC, controller, resume, startup) → a Mode
- Triggers — run a Mode automatically on dock/undock, AC connect/disconnect, external-controller connect/disconnect, resume-from-sleep, or startup.
- Built-in dock fixes — switch audio output, disable the built-in controller so an external pad is Player 1, and force gamescope composition (the docked stretch fix) — all as one-tap tasks.
- Fan & TDP control — a temperature → RPM fan curve (with a live graph), manual RPM, or auto; an APU TDP cap with optional continuous enforcement; reusable fan/TDP profiles you can apply from the panel, a task, or a Mode; and a one-tap "hand control back to SteamOS". See Performance.
- Favorites — pin the actions/modes you use most to the panel; stateful ones (like force-composition) show a live on/off LED.
- Sunshine — install/update from Flathub, start/stop/restart, set the
encoder, force composition, and pair/manage Moonlight
clients — or defer to the
decky-sunshineplugin (auto-detected). A watchdog relaunches it if it crashes and rebuilds its screen capture if it can't grab the display — the docked-boot / resume / dock-change "Error 503" — and Docky keeps it discoverable (self-healing mDNS) so Moonlight finds the Deck after a reboot instead of showing it offline. - In-Game-Mode editor — build Actions, Modes, Favorites, Triggers, and Sunshine settings from the gear menu; nothing persists until you Save.
Docky isn't on the Decky store yet, so it installs manually — either from the release URL or from source below. Decky Loader must already be installed, and do this from Game Mode.
In Decky: gear (Settings) → turn on Developer mode → the Developer section → Install Plugin from URL, and paste:
https://github.com/datbird/docky/releases/latest/download/Docky.zip
That link always points at the newest release, so it stays current. No terminal, no toolchain.
Building the frontend needs Node + pnpm:
git clone https://github.com/datbird/docky.git
cd docky
pnpm install && pnpm run build # build the frontend bundle (dist/index.js)
sudo ./install.shRe-run install.sh to update; ./uninstall.sh to remove (your config is
preserved). dist/index.js is a build artifact, not committed, so install.sh
refuses to run until you've built it — if you don't have a Node toolchain, use
the prebuilt Release zip above instead. This path also installs the Desktop-Mode
Steam autostart fix (see Sunshine), which the URL install
does not.
Then: Game Mode → Quick Access (•••) → Decky → Docky.
- Open Docky → gear (Settings) → Modes → + New mode, name it
Docked. Repeat forHandheld. - Actions → + New action → add tasks, e.g. for
Docked: Audio: HDMI, Controller: Off (external is P1), Sunshine: force composition → On. Make aHandheldaction with the inverse. - Assign each action to its mode (Modes tab → toggle the action on).
- Triggers tab → set When docked →
Docked, When undocked →Handheld. Save. - Back in the panel → Triggers section → turn on Dock / undock.
Dock the Deck and the Docked mode runs automatically. Pin either mode as a
Favorite for a one-tap manual switch.
| Guide | Covers |
|---|---|
| Concepts | Tasks → Actions → Modes → Triggers → Favorites |
| Task reference | Every task type, its fields, and examples |
| Performance | Fan curve/manual, TDP cap + enforcement, profiles |
| Triggers | All triggers, dock detection, mode mapping |
| Sunshine | Engine selection, install/update, pairing, encoder, composition, watchdog & discovery |
| Streaming ⇄ Desktop | Why Moonlight (Sunshine) and Desktop-Mode RDP share one GPU, and how the handoff + Steam wrapper let you move between them |
| Configuration | config.json / state.json reference |
| Troubleshooting | Common issues and fixes |
| Design notes | Accepted trade-offs & known limitations, with rationale |
| Development | Architecture, build/dev loop, deploy |
| Decky integration | How the plugin plugs into Steam, the webpack/patches boundary, and marketplace precedent |
Docky's backend runs as root (plugin.json flags: ["root"]) — most of what
it does (system services, protected paths, managing other processes, the
streaming-capture helper) needs it. Files created by file-op tasks are chowned
back to their parent directory's owner so user-space can still read/edit them.
Script/command tasks therefore run as root; treat your config like a root cron.
See Configuration → Security for details.
Build and dev workflow are in docs/development.md; PR notes in CONTRIBUTING.md. Issues and PRs welcome.
MIT © datbird









