⏳ This skill is pending AI review.
Scores will appear once the review pipeline completes.
steam-debug
Inspect, debug, and inject custom code into a running Steam client — desktop (macOS, Linux, Windows) or Steam Deck over the network — through its Chromium Embedded Framework (CEF) Chrome DevTools Protocol endpoint. Use when developing Steam UI plugins, mods, themes, or integrations — injecting CSS/JS to try a change, locating webpack modules and obfuscated class names, reading React or SteamUIStore state, inspecting Big Picture / Quick Access Menu windows, screenshotting what actually rendered, streaming console logs, or diagnosing runtime errors in Steam's UI. The same commands run against either device, or both at once. Injection is per-session and for development only. Not for building a plugin loader or making changes persist across restarts, Steamworks game SDK work, game development, or scraping the public Steam web store.
Choose how to use this skill
You do not need every option. Choose the path your AI client supports. The stable page stays the same; versioned files are immutable.
1. Native installer
This listing has no registered native installer command. Use the complete package or source fallback below, depending on what your client supports.
Do not guess an installer command or replace an existing version without reviewing the diff.
2. Complete package recommended
Download the ZIP when available. It includes SKILL.md plus the references, security notes and version metadata.
No complete ProSkills package is published for this listing yet.3. Prompt-only
Copy the prompt above when the agent can read the stable page or when you want to adopt the workflow without installing a skill.
Need only the instruction file?
Download SKILL.md only if your client requires a single file. The complete ZIP is safer for a full installation because it preserves the references and release context.
No path installs or executes anything by itself. Your agent still needs access to the project files. Before updating, compare the installed version and review the diff.
// RATINGS
Not yet listed on ClawHub or SkillsMP
// README
steam-debug
A Claude skill and standalone CLI for inspecting, debugging, and injecting code into a running Steam client — desktop or Steam Deck — via the Chrome DevTools Protocol (CDP).
Steam's UI is a Chromium Embedded Framework (CEF) app. Launched with debug flags it exposes the
same protocol browser DevTools uses, so the entire Steam UI can be inspected and modified at
runtime like a web page. steam-debug.mjs wraps that protocol into focused commands — read React
state, search webpack modules, resolve minified class names, inspect computed CSS, drive
navigation, stream logs, and inject custom CSS/JS.
Built for plugin, theme, and integration development against Steam's UI.
Works on desktop and Steam Deck. Same commands for both — a desktop client on macOS, Linux or
Windows, and a Deck over the network via --host. Both are exercised by the test suite, and any
command can run against both at once. See reference/remote.md.
Scope. This is a debugging and development tool. Injection is per-session and disappears on reload, by design — it exists so you can try a change and see what happens.
Out of scope: making a change persist or load on startup, packaging or distributing plugins, and anything that runs unattended inside someone's client. That belongs in a plugin loader. The boundary is simple — this helps you find out what is going on and try a change; making a change stick is someone else's job.
Using with Claude
Place this directory at ~/.claude/skills/steam-debug/. Claude Code discovers it via SKILL.md.
Describe the task in plain language; Claude selects the commands, interprets output, and follows
the operating procedure in SKILL.md:
"Why is my injected CSS not showing up in Big Picture Mode?" "Find the webpack module that defines the DialogButton component." "Make the Quick Access Menu background darker." "Something is throwing a React error on the downloads page — find it."
SKILL.md is a strict SOP rather than a tutorial: it gates work behind a preflight check, fixes
which commands may be used, and defines how to verify a result before reporting it — because the
easiest mistake here is a confident answer drawn from the wrong window, a stale route, or a style
that computed but never painted.
Requirements
- Node.js 22+ — uses built-in
WebSocketandfetch, no dependencies - A Steam client with CDP enabled — either:
- desktop, launched with
-cef-enable-debugging(see below), or - a Steam Deck with Settings → System → Developer → CEF Remote Debugging, reachable on
your network. Address it with
--host; SteamOS serves CDP on port 8081.
- desktop, launched with
- Chrome — optional, only for the interactive DevTools UI
Launch Steam in debug mode
Launch flags are read only at startup. A already-running instance silently ignores them, so it must be closed first — note that this drops in-progress downloads and running games.
# macOS
pkill -f Steam
# Linux
pkill steam
# Windows
taskkill /IM steam.exe /F
| Platform | Command |
|---|---|
| macOS | open -a Steam --args -dev -windowed -cef-enable-debugging -gamepadui |
| Linux | steam -dev -windowed -cef-enable-debugging -gamepadui |
| Windows | steam.exe -dev -windowed -cef-enable-debugging -gamepadui |
| Steam Deck | Settings → System → Developer → CEF Remote Debugging |
| Flag | Effect |
|---|---|
-cef-enable-debugging | Required. Opens CDP on port 8080 (8081 on Steam Deck) |
-dev | Developer mode — relaxed security, verbose logging |
-windowed | Run windowed instead of fullscreen |
-gamepadui | Big Picture Mode. Required for page, menu, and stores |
Omit -gamepadui to debug the classic desktop UI, which is a different front end.
curl http://localhost:8080/json/version # {"Browser": "Chrome/...", ...}
Steam takes 30–90 seconds to fully initialise. Poll status until both marks are ✓.
Usage
S=~/.claude/skills/steam-debug/steam-debug.mjs
node $S status
node $S help
| Command | Description |
|---|---|
status | CDP endpoint, target count, webpack module count, init state |
doctor | Diagnose the whole setup and print the remedy for whatever is wrong |
targets | All CDP targets with title, URL, WebSocket URL |
eval <expr> | Evaluate JS; promises awaited; objects returned as JSON |
errors | Install a console.error capture shim, print what it caught |
logs | Stream live console, browser and Steam-backend output until Ctrl+C |
console <cmd> / console list | Run a Steam developer-console command, or list what exists |
restart <js|client> | Restart the UI or the whole client, and wait for it to come back |
react | React version, module ID, fiber tree stats |
styles <selector> | Computed styles, layout rect, resolved CSS custom properties |
dom <selector> | Dump an element subtree — structure, sizes, leaf text |
text [selector] | Dump the visible on-screen text — cheap alternative to a screenshot |
webpack <pattern> | Search every webpack module's source |
classes <pattern> | Resolve minified CSS-module class names by readable name |
module <id> | Dump a webpack module's full source |
navigate <page> | Drive Big Picture Mode to a page |
page | Current route and open menu |
menu <name> | Open or close Quick Access / Main Menu |
popups | Popup windows tracked by g_PopupManager |
stores | window.SteamUIStore sub-stores and properties |
screenshot [selector] | Capture what is actually painted, as a PNG |
inject css|js <file> | Inject a stylesheet or script, namespaced and reversible |
inject list / inject remove <slug> | List or undo injections |
watch css|js <file> | Re-inject on every file change until Ctrl+C |
| Option | Applies to | Default |
|---|---|---|
--target <name> | eval, errors, logs, styles, dom, text, module, screenshot, inject, watch | SharedJSContext |
--port <n> | all | tries 8080, 8081, then 9222 |
--host <addr> | all | localhost — comma-separate for several devices |
--timeout <ms> | all | 10000 |
--json | all | off |
--level <all|warn|error> | logs | all |
--source <all|console|browser|backend> | logs | all |
--grep <regex> | logs | — |
--limit <n> | webpack, classes, console list, text | 10 / 20 / 500 |
--ignore-case | webpack, classes, console list | off |
--depth <n> | dom | 2 |
--out <path> | screenshot | derived from target title |
--diff <path> | screenshot | — |
--settle | screenshot | off |
--file <path> | eval | — |
--id <slug> | inject, watch | derived from filename |
--confirm | restart, console | off |
--show-secrets | all | off |
--json works on every command and guarantees machine-readable stdout, so nothing has to be
parsed out of prose. logs --json emits one JSON object per line.
Credentials are redacted by default. Any JSON value under a key that looks like a token,
password, Steam Guard blob, machine ID or session id is replaced with a description of what was
withheld, and eval refuses an expression touching SteamClient.Auth. Pass --show-secrets
when you are deliberately debugging sign-in.
--host takes a list, so any command can run against a desktop client and a Steam Deck
together — the practical way to check a plugin behaves the same on both:
node $S page --host localhost,steamdeck
node $S inject css theme.css --host localhost,steamdeck --target BigPicture
node $S logs --host localhost,steamdeck --level error # concurrent, tagged per device
Output is labelled per device, --json aggregates into { devices: [...] }, --out is suffixed
so captures do not overwrite, and the exit code is 0 only if every device succeeded.
Reading Steam's own logs
Three streams, not o
// HOW IT'S BUILT
KEY FILES