Skip to content

Repository files navigation

Steamcord

Discord in Steam Gaming Mode — a Decky Loader plugin for Steam Deck / Bazzite / SteamOS.

Voice chat, private messages and screen sharing from the Quick Access Menu, without leaving Game Mode and without a second device.

🌍 Languages: English · Français · Deutsch · Español · Italiano · Português · Nederlands · Polski · Русский

Steamcord is an independent project. It was originally inspired by Deckcord (see Credits), but the codebase has been largely rewritten and now follows its own direction — it is not affiliated with or endorsed by that project.

The plugin UI is fully translated into 9 languages and follows your SteamOS language automatically.


How it works

Steamcord runs Vesktop — a real, native Discord client — invisibly in the background, and drives it over the Chrome DevTools Protocol. The plugin injects a small client into it and exposes everything in the Steam Quick Access Menu.

Going native fixes the hard problems of the old hidden-browser approach: your microphone and the voice audio work natively, exactly as in the desktop Discord app — no capture hacks, no autoplay workarounds. Vesktop is launched (and installed if missing) automatically, stays logged in across reboots, and never needs a desktop window in Gaming Mode.


Features

  • One Discord per Steam account (multi-session) — Every Steam user on the machine gets their own Discord profile: switch the Steam account and Steamcord switches Discord automatically within seconds (the first time shows the QR login; after that each session is remembered). Nobody lands in someone else's Discord.
  • QR code login — Scan a QR code with the Discord mobile app to log in instantly. On your phone: Discord → Settings → Scan QR Code, then aim at the code shown in the panel. No password typing on the Deck.
  • CAPTCHA solver, no Desktop Mode — Discord sometimes puts a CAPTCHA on its login page; until it is solved no login ticket is issued and the QR code just keeps refreshing. Steamcord detects that and mirrors the login page in Gaming Mode so you can clear the challenge with the controller: D-pad moves the pointer, A clicks.
  • Unified navigation — Top tabs Voice / Text / ⚙️ Settings, with a shared Servers / DMs switch underneath, so the same source toggle works for both voice and text.
  • Voice chat — Join voice channels and hear everyone, with each member shown live (speaking ring, mute/deafen badges), a per-user volume slider (0–200%) and a per-user local mute (silence someone just for you, without them knowing). Mic and audio are native (Vesktop).
  • Private messages (DMs & Group DMs) — Browse your conversations and start/join voice calls with friends directly from the Quick Access Menu. Active calls are highlighted.
  • Server voice browser — See which voice channels have people in them (with member avatars) before joining.
  • Text chat — servers and DMs — Read and reply to a server channel or a private conversation from the QAM (full-width input, Steam keyboard opens automatically). Image attachments show as thumbnails (loaded only while the channel is open) and links open in the Steam Gaming Mode browser. Auto-scrolls to the latest message.
  • Discord status on your name — Your clickable username at the top shows your current status; tap it to change it. Optional auto-sync makes Discord follow your Steam status in the background; picking one by hand switches back to manual.
  • Audio device selection — From Settings, choose the output (Discord sound) and input (microphone) device — Auto (system default) or a specific device, e.g. send Discord audio to your headset only while games stay on HDMI. A Reload audio devices button makes both the system and Discord re-read the devices — for a microphone that is not picked up in Gaming Mode.
  • Mute / Deafen / Disconnect — One-tap voice controls from the QAM, with Discord's own native sound cues (mute/unmute, deafen/undeafen, disconnect, participants joining/leaving).
  • Soundboard — Browse and play the default sounds, the current server's sounds, and (with Nitro) every other server's sounds, right from the voice call view. You hear your own sounds too, just like the real client.
  • Screen share — Share your whole screen to a voice channel (Go Live), natively in Desktop, Big Picture and Gaming Mode. In Gaming Mode Steamcord supplies a small ScreenCast portal (portal_shim.py) that gives Chromium the gamescope PipeWire node used by Steam Game Recording. Game audio is carried through a dedicated isolated bridge, so Discord call audio is never sent back into the stream. No kernel module or rootfs write is needed. The GStreamer WebRTC relay and the "Share screen (game mode)" virtual-camera button (v4l2loopback) remain fallbacks. The QAM thumbnail is a gamescopectl snapshot, refreshed only while the QAM is visible outside a running game, to avoid starving the screen-share buffer pool.
  • Watching a stream keeps the screen awake — while you are watching someone's Go Live (in the panel, the expanded view or the fullscreen grid), the SteamOS screen saver is switched off, then put back exactly as it was. It can be turned off in Settings, and screen dimming and auto-sleep are never touched.
  • Share game audio — Stream your game's sound into the voice channel along with your voice. Two mix sliders (🎙️ voice / 🎮 game) control what the others hear, while you keep hearing the game normally — and it works even without a physical microphone (the plugin creates a virtual Steamcord Mic input).
  • In-game notifications — Incoming DM calls and pings appear as native Steam notifications (popup + sound), respecting your Discord status (silenced when invisible / do-not-disturb). A message rings on both sides at once (Discord's own sound and Steam's), so the notification settings let you pick which one you keep — Discord by default.
  • 🕹️ Controller voice shortcut — Capture any button combo on your controller and bind it to mute toggle or push-to-talk. It works globally in-game, even with the QAM closed (set it up in the Settings tab).
  • Share screenshots — Send a Steam screenshot straight into the conversation you have open.
  • Vencord is built into Vesktop, giving access to its plugin ecosystem.
  • Save attachments — Any file posted in a conversation can be saved to your Downloads folder: images, videos, and everything else (PDFs, archives, logs) that used to show up as a bare count. Images and videos open fullscreen in the panel rather than in the Steam browser.
  • Forward messages — Send a message, with its images and files, to another channel or DM without leaving the game. The author's name travels with it.
  • Scheduled events — See what is coming up on your servers, open an event for its banner, description and attendees, and join one that is already running straight into its voice channel.
  • 🖥️ Expanded view (proof of concept) — A full-screen Discord, opened from the icon next to your name: DMs showing what each person is doing, friends (activity, message anyone, call, add by username, requests), servers unfolding into members by role, events, text channels and voice channels with their channel chat, every event in one place, the current call and settings. Chats open inside the view; L1 / R1 go back and forward, B goes up one level — out of a chat or a server's members, then back to the Quick Access panel, which the sidebar also offers as a button. The panel's settings choose which of the two the Steamcord icon opens. Y on a person opens Profile, Message, Call and friend / block actions. Leaving the view never ends a call. Still a proof of concept — bugs are expected, reports welcome.
  • Streamer mode — While you are live (Discord Go Live, or a BoneCast stream or recording), notifications are held so they don't end up in the video, then shown afterwards. Always on covers OBS and other streaming software.
  • Display name — The panel shows your Discord display name instead of your login, and you can change it from Settings.
  • 🐧 Compatibility — we actively work to support every OS that can run Steam in Gaming Mode / Big Picture (Linux for now): portable detection, vendored Python deps, no distro-specific assumptions. Per-distro package notes: docs/OS-NOTES.md.

📸 Screenshots

Steamcord panel in the Quick Access Menu, server list Steamcord panel during a voice call

Expanded view, friends online with their activity Expanded view, server list

Expanded view, chat opened inside the view Expanded view, current call

Installation

Not yet on the Decky Store. Install manually via Developer Mode.

  1. Enable Developer Mode in Decky → General settings
  2. Go to Developer in Decky settings
  3. Install from URL: https://github.com/Necrosiak/Steamcord/releases/latest/download/Steamcord.zip

A note on automatic updates. Decky owns the plugin's top-level directory, so the built-in updater can rewrite existing files but cannot create new ones. A release that adds a file at the top level therefore has to be installed the normal way — Install plugin from URL, above — rather than through the automatic update. The release notes say so whenever that is the case.

Vesktop is installed and launched automatically by the plugin the first time it runs. Just log in once (QR code, or Vesktop in Desktop Mode) and you stay logged in.

Nothing else is required: the Python dependencies are vendored, and the handful of system tools some features shell out to (pw-dump, pactl, ffmpeg, gamescopectl) are optional — each one only costs the feature it powers, and the backend logs a [deps] line at startup naming any that are missing. See docs/OS-NOTES.md for the full table and per-distro packages, including NixOS, Gentoo, Alpine and Void.

Screen share

Screen sharing works out of the box — the plugin auto-installs its Python dependency (aiohttp) for the system Python on first run. GStreamer is provided by the system.

Keyboard / mouse push-to-talk outside SteamOS

Binding the voice shortcut to a controller button works everywhere. Binding it to a keyboard key or mouse button requires the plugin to read /dev/input/event*, which needs a uaccess ACL — and systemd grants that to joysticks only (70-uaccess.rules: ENV{ID_INPUT_JOYSTICK}). SteamOS ships an extra rule covering input devices; most other distributions do not.

Measured on Bazzite: a USB wireless mouse returned EACCES on all five of its nodes, and a keyboard was readable only because an unrelated RGB-lighting rule happened to tag it. The shortcut panel tells you when a device is present but unreadable, instead of silently offering nothing.

To opt in, as root:

# /etc/udev/rules.d/70-input-uaccess.rules
SUBSYSTEM=="input", ENV{ID_INPUT_KEYBOARD}=="1", TAG+="uaccess"
SUBSYSTEM=="input", ENV{ID_INPUT_MOUSE}=="1", TAG+="uaccess"
sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=input

⚠️ Know what this costs: uaccess lets any process running as your user read every keystroke on the machine, in any window — not just this plugin. It is the same trade SteamOS makes on the Deck, which is reasonable on a single-user games console and much less so on a machine you also work on. Delete the file to revert.


Build from source

git clone https://github.com/Necrosiak/Steamcord
cd Steamcord
pnpm install
pnpm run build
# copy dist/, main.py, defaults/, plugin.json, package.json to ~/homebrew/plugins/Steamcord/
sudo systemctl restart plugin_loader

🐛 Issues & ideas — don't hesitate!

Found a bug, something misbehaving on your distro, or missing a feature? Please open an issue — every report directly shapes what gets built next. Include if you can:

  • your distro & version (Bazzite 42, CachyOS, Ubuntu 24.04…) and how Steam runs (Gaming Mode / Big Picture / desktop)
  • the plugin version (Settings → Update) and whether Vesktop is flatpak or native
  • what you did, what you expected, what happened instead
  • logs: ~/homebrew/logs/Steamcord/ and journalctl -b | grep -i steamcord

Feature requests and "it works!" reports on unusual setups are just as valuable.

The UI for the newer features is not final. The in-game voice and POV overlays, the fullscreen multi-POV grid and the quick-reply panel are recent additions and their layout, controls and defaults are still open to change. If something feels awkward or you'd arrange it differently, please say so in an issue — the same goes for anything added from here on. Suggestions shape these as much as bug reports do.

Credits

Code contributors

  • @azizzidinative Go Live in Gaming Mode via the gamescope ScreenCast portal shim (#10, landed in v1.15.0)
  • @Memberoffoxhound — five fixes carried over from his GameModeCord fork (landed in v1.31.0): the panel scaling to its own size instead of Deck-absolute pixels, B walking back one menu at a time, chat images and videos opening in the fullscreen viewer, and two that were silently breaking screen sharing for everyone — v4l2loopback looked up in sysfs rather than hardcoded to /dev/video42, and both share buttons no longer vanishing from DM calls
  • @jezonekpush-to-talk on a keyboard key or a mouse button (#34), including the backend evdev reader and its privacy constraints

Community bug hunters

Steamcord is largely shaped by the people who report things. The full list — who found what, and which release it landed in — lives in CREDITS.md.

Goes well with

  • decky-quick-tab by @moi952 — pins a plugin as its own tab in the Quick Access Menu, so Steamcord opens in one press instead of going through the Decky list. Not affiliated with this project, just genuinely useful with it.

AI disclaimer

AI was used in the making of this project — for reverse engineering, development and documentation. It was not used for any art or creative writing. Everything released publicly is reviewed by a human, and the results are my responsibility. If that is not something you are comfortable with, now you know.

About

Discord voice chat, DMs and screen sharing inside Steam Game Mode — a Decky Loader plugin for Steam Deck, Bazzite and SteamOS

Topics

Resources

Stars

25 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages