This plugin is part of CapyDeploy — a cross-platform tool for deploying games to Steam Deck and other handheld Linux devices. It requires the CapyDeploy Hub running on your PC.
A Decky Loader plugin that acts as a CapyDeploy Agent inside gaming mode. While the desktop Agent requires switching to desktop mode, this plugin runs natively in the Quick Access Menu — receive games, create shortcuts, and apply artwork without leaving your game library.
- No Steam restart — Creates shortcuts using native
SteamClient.AppsAPIs - Instant artwork — Applies cover art, icons, and heroes via
SteamClient.Apps.SetCustomArtworkForApp() - Hardware telemetry — Real-time CPU, GPU, RAM, battery, fan, power metrics streamed to Hub
- Console log streaming — Live Steam console logs with bitmask-based level filtering (debug/info/warn/error)
- Game log wrapper — Launch games with stdout/stderr capture via context menu, logs streamed to Hub
- Remote control — Hub can toggle console log on/off remotely
- Toggle On/Off — Enable/disable the WebSocket connection from the QAM panel
- Auto-connect — Reconnects automatically when enabled
- Real-time notifications — Toast notifications for game installs
- Progress tracking — See transfer progress in the panel
- Secure pairing — 6-digit code on first connection, token stored for future sessions
| Feature | Desktop Agent (Wails) | Decky Plugin |
|---|---|---|
| Shortcuts | shortcuts.vdf (restart Steam) |
SteamClient.Apps.AddShortcut() (instant) |
| Artwork | File copy to grid/ |
SteamClient.Apps.SetCustomArtworkForApp() |
| Telemetry | sysfs/procfs collector | sysfs/procfs collector |
| Console Log | CEF CDP console capture | SteamClient console capture |
| Game Log | Wrapper via CEF launch options | Wrapper via context menu |
| UI | Standalone window | Quick Access Menu panel |
| Mode | Desktop | Gaming |
- Steam Deck or other handheld running SteamOS/Bazzite
- Decky Loader installed
- CapyDeploy Hub running on your PC
- Open Decky Loader (... button in gaming mode)
- Go to the Plugin Store
- Search for "CapyDeploy"
- Click Install
- Download the latest
CapyDeploy.zipfrom releases - Extract to
~/homebrew/plugins/ - Restart Decky Loader
- Open the Quick Access Menu (... button)
- Find CapyDeploy in the Decky plugins list
- Toggle the plugin ON
- On your PC, open CapyDeploy Hub — it will discover the plugin via mDNS
- If this is your first connection, enter the 6-digit pairing code shown in the Hub
- Start sending games from the Hub!
Hub (PC) ──WebSocket──► Decky Plugin (Handheld)
│
├─► SteamClient.Apps.AddShortcut()
├─► SteamClient.Apps.SetCustomArtworkForApp()
├─► Toast notifications
├─► Hardware telemetry (sysfs/procfs → Hub)
├─► Console log streaming (SteamClient → Hub)
└─► Game log wrapper (launch options → stdout capture → Hub)
The plugin runs a WebSocket server that speaks the same protocol as the desktop Agent. The Hub doesn't need to know which type of agent it's talking to — the protocol is identical.
- Bun (used by CI and the monorepo's build tooling)
- Python 3.11+ (for backend dependencies)
# Install frontend dependencies
bun install
# Build frontend
bun run build
# Full build with Python deps and ZIP packaging (Linux only)
./build.sh# Watch mode (auto-rebuild on changes)
bun run watchdecky-capydeploy/
├── main.py # Python backend — Decky API entry point
├── steam_utils.py # Steam helpers (platform detection, VDF parsing)
├── mdns_service.py # mDNS/DNS-SD advertisement
├── pairing.py # Pairing codes + token management
├── upload.py # UploadSession data class
├── artwork.py # Artwork download + icon VDF writing
├── ws_server.py # WebSocket server for Hub connections
├── telemetry.py # Hardware telemetry collector (sysfs/procfs)
├── console_log.py # Console log collector + streaming
├── game_log.py # Game log file tailer (reads wrapper output)
├── bin/
│ └── capydeploy-game-wrapper.sh # Bash wrapper for game stdout capture
├── src/
│ ├── index.tsx # React UI entry point
│ ├── eventPoller.tsx # Background polling + SteamClient operations
│ ├── components/ # React components (StatusPanel, InstalledGames, etc.)
│ ├── patches/ # Context menu patches (game log wrapper)
│ ├── hooks/ # Custom hooks (useAgent, usePanelState)
│ ├── styles/ # Theme constants
│ └── types.ts # TypeScript type definitions
├── plugin.json # Decky plugin manifest
├── package.json # Node.js dependencies
├── rollup.config.mjs # Rollup build configuration
├── build.sh # Build + packaging script
└── requirements.txt # Python dependencies
This repo contains only the Decky Loader plugin. It is maintained as a standalone repository because the Decky Plugin Store requires plugins to be in their own repos (referenced as git submodules).
- Main project: lobinuxsoft/capydeploy
- Issues & discussions: Please use the main project's issues for bugs and feature requests
- Documentation: lobinuxsoft.github.io/capydeploy
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Since this plugin is part of the CapyDeploy ecosystem, major changes should be discussed in the main project first.
AGPL-3.0 — See LICENSE for details.
If you find CapyDeploy useful, consider supporting development:
- BTC:
bc1qkxy898wa6mz04c9hrjekx6p0yht2ukz56e9xxq - USDT (TRC20):
TF6AXBP3LKBCcbJkLG6RqyMsrPNs2JCpdQ - USDT (BEP20):
0xd8d2Ed67C567CB3Af437f4638d3531e560575A20 - Binance Pay:
78328894
