Open source · Go + Bubble Tea

$ lazydeck

A lazydocker-style terminal UI for managing a fleet of Steam devkits: Steam Deck, Steam Machine, and anything else running the SteamOS devkit tools. One keyboard-driven panel instead of clicking through Valve's GUI once per device.

Install View on GitHub Releases API Docs
lazydeck terminal UI showing a device list panel, detail panel, and activity log, managing three Steam devkits

The real lazydeck TUI: device list, detail, and activity panels, refreshing status across a small devkit fleet.

One panel per devkit

Your whole fleet in one view. Multi-select devices with space and batch a deploy, log sync, or delete across all of them at once.

Finds devkits on its own

mDNS/Bonjour LAN discovery (f in the TUI, or an add-device wizard that walks discover → pick → pair) means no hunting for a Deck's IP address.

Built on Valve's own protocol library

Vendors the MIT-licensed devkit_client library, pulled from the actively-maintained flibitijibibo/steamos-devkit fork. Same pairing/SSH/rsync/mDNS logic Valve's GUI uses, not reimplemented from scratch.

Headless-first

A local lazydeck serve API (versioned, loopback-only, HTTP+SSE) exposes every operation for scripting and for game-engine editor plugins. The TUI is just one client.

No display required

A pure terminal UI, not a PySDL2/imgui window. Runs over SSH, inside tmux or screen, on a headless Linux build box where Valve's own devkit client can't open a window at all.

Engine integrations

Godot 4 and Unity editor plugins (dock UI, export, deploy, log sync) ship today, plus an Unreal plugin in progress. All talk to lazydeck serve directly.

MCP server, if you want it

lazydeck mcp exposes the same API as MCP tools over stdio for Claude Desktop, VS Code Copilot, and other MCP-capable clients. Read-only by default; mutating tools are opt-in.

Extend it without forking

Bind any key to an arbitrary shell command against the selected device(s) in config.yml, lazygit-style. No plugin API to learn, no fork to maintain.

Tells your team when a job's done

Point webhooks at a Discord or Slack incoming webhook URL (auto-detected and formatted natively) or any other endpoint, and every deploy or log-sync job posts success or failure when it finishes.

Trust-on-first-use SSH

Records devkit host keys the first time you pair, in a dedicated known_hosts file, and warns (or optionally rejects) on a changed key later.

Supply-chain conscious

Pinned Go/Python/tool versions via mise, a reproducible Containerfile, GitHub Actions pinned to commit SHAs, and SBOMs, checksums, and build provenance generated for every release.

Install

macOS · amd64/arm64 Linux · amd64/arm64 Homebrew tap
brew install kevintcoughlin/lazydeck/lazydeck

Or grab a tagged release archive from Releases and run install.sh. Every release bundles the Go binary alongside the vendored Python runtime; you only need uv installed locally.

Engine integrations

lazydeck serve exposes health, capabilities, device discovery/pairing/status, async deploy and log-sync jobs (with cancel + SSE progress), all over a versioned local HTTP API. Browse the rendered API docs or read the raw OpenAPI spec.

Godot 4 plugin Unity package Unreal plugin (in progress) MCP server (lazydeck mcp)

Optional: MCP server

lazydeck mcp exposes the same local API to Claude Desktop, VS Code Copilot, and other MCP-capable clients over stdio, for anyone who wants to script their fleet from an LLM client instead of the TUI. Read-only tools are on by default; add --allow-mutations to let an agent pair devices, deploy, sync logs, or cancel jobs.

{
  "mcpServers": {
    "lazydeck": {
      "command": "/absolute/path/to/lazydeck",
      "args": ["mcp"]
    }
  }
}

Restart your MCP client after editing its config. See the MCP guide for details.

Keybindings

KeyAction
↑/k · ↓/jmove the cursor
spacemulti-select (batches d/l/x)
srefresh status for all devices
ddeploy a build
lsync logs down
glist installed games
aadd-device wizard (discover + pair)
enteropen an interactive SSH shell
?full help screen