Two package managers, and udev rules whatever you install
Linux software for the Stream Deck with support for original Elgato Stream Deck plugins
At a glance
- What is it?
- OpenDeck is a cross-platform application for Elgato Stream Deck devices, built with Rust and TypeScript on Tauri. Its repository carries both a package.json and a deno.json, and its Linux instructions require udev rules to be installed by hand even when the application comes from Flatpak.
- Who is it for?
- OpenDeck suits a Stream Deck owner on Linux who wants the plugins from the Elgato ecosystem to work, including Windows-only ones running through Wine, and who wants profile files that move between platforms unchanged. It does not suit a user without Elgato hardware unless they pair it with a phone through Tacto.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 44 days ago.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 28, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A package.json and a deno.json sit side by side
The repository has two JavaScript toolchains and the layout explains which is which. package.json is the SvelteKit frontend, with vite for dev and build, a static adapter, svelte-check for types, prettier for formatting, and the Tauri command wrapper. Everything in it is a dev dependency except a small runtime set: the Tauri API, its deep-link and dialog plugins, dompurify, and marked with three marked plugins, plus phosphor-svelte for icons. The marked stack with dompurify is a markdown rendering pipeline being sanitized, which is what you would expect in an application that renders plugin descriptions. Beside it sit deno.json and deno.lock, a second toolchain, alongside a package-lock-less setup, a vite.config.ts and a svelte.config.ts. So the frontend is TypeScript and Svelte built by Vite, while a second runtime manages something else in the same tree. Nothing in the README says what Deno is for, which is the kind of gap worth asking about before you extend the project.
udev rules are required however you install
The Linux install section is unusually detailed because the device needs permissions that a sandboxed package cannot grant itself. After installing the application, from a .deb, an .rpm, the AUR or Flathub, you have to install the udev subsystem rules, and the instructions come from the rust-elgato-streamdeck repository. If you used a .deb or .rpm the file is installed automatically; otherwise you download 40-streamdeck.rules and copy it to /etc/udev/rules.d/ with sudo. Then, either way, you reload with:
sudo udevadm control --reload-rules && sudo udevadm triggerThe Flatpak note repeats the requirement explicitly: the application is on Flathub, and you still need the udev rules installed as described. That is the correct and honest way to write it, because a Flatpak user who follows only the Flathub button gets an application that cannot see the device, and the symptom is a blank device rather than an error.
AppImage builds are discouraged yet still published
Among the Linux instructions is a piece of advice that says more about the project's experience than any feature list: you should avoid AppImage releases of OpenDeck as they tend to have problems, and you should just avoid AppImages in general. The AppImage is still published, so this is a warning about an artifact that exists rather than one that was withdrawn. Two other things are named in the same breath. For Arch-based distributions there are three AUR packages, opendeck and opendeck-bin for the newest tagged build and opendeck-git tracking the latest commit on main, so you have a stable path, a binary path and a rolling path. And there is an automated install script for Debian, Ubuntu, Fedora, Fedora Atomic, openSUSE and Arch-based systems, which fetches the appropriate .deb or .rpm, the AUR or Flathub, installs and reloads the udev rules, and can optionally install Wine and Node.js from your distribution during the process. The published tags run 2.14.0, 2.13.1 and 2.13.0 through the middle of 2026.
Wine and Node.js decide which plugins actually run
Plugin support is the whole reason this project exists, and it has a dependency profile. OpenDeck supports plugins made for the original Stream Deck SDK, which lets many plugins from the Elgato ecosystem run, and it also supports the OpenAction API. The plugins themselves may have requirements: if you intend to use compiled plugins not built for Linux you need Wine installed, and some of them also depend on Wine Mono, which the README notes is sometimes but not always included in a distribution's packaging of Wine. Node.js plugins need Node.js natively. The Flatpak note adds the constraint that matters most in practice: the Wine and Node.js Flatpaks are not supported, so those runtimes have to be installed natively on the host. On macOS the same Windows-plugin situation applies, and there is a separate reason to use OpenDeck there at all, which is that it can run Windows-only plugins through Wine where the first-party Elgato software cannot.
Profiles are folders named with a slash
The how-do-I section is a short guide to the interface, and one detail is a real design idea rather than a UI description. Profiles can be organised into folders by prefixing the profile name with the folder name and a forward slash, so the hierarchy lives in the name instead of in a separate tree structure. That choice has a practical consequence the README names elsewhere: profile files are easily movable between platforms with no changes necessary. A flat naming scheme with a path separator in the name survives a copy between machines, and OpenDeck also lets you configure automatic profile switching when a specific application's window is active, which is how a Stream Deck changes meaning depending on whether you are in your editor or your browser. Actions have their own editing conventions too: left-click opens a property inspector, right-click opens a context menu for deleting or for editing appearance, and the appearance editor sets the image and text per state.
A Tauri shell over a Rust device library
The architecture is visible in the directory names and the acknowledgements. src-tauri/ is the Rust side, which is where the process that talks to the device lives, and src/ with static/ is the SvelteKit frontend that renders it, with @sveltejs/adapter-static meaning the frontend is built to static files and served by the shell rather than by a web server. The project credits three dependencies by name: Tauri, the elgato-streamdeck Rust library from the OpenActionAPI organization, and Phosphor Icons. That second credit is the important one, because it is also where the udev rules come from, so the device library determines both the permission story and the plugin API. Product identity is handled in the repository rather than in code, with product_name.txt at the root and a translations/ directory, and scripts/ and plugins/ sit alongside. The project also keeps AGENTS.md at the root, a FOSS manifest in .fossim.json, and a product name file, which is an unusual amount of process to find around a desktop application.
Where OpenDeck is the wrong tool
Four cases. The first is a user without Elgato hardware. Only Elgato hardware is officially supported, and while plugins exist for other vendors, the device support is the part that is not there. The workaround named in the README is Tacto, which turns a smartphone into a controller, and that pairing changes the problem from hardware support to a phone. The second is a user who will not install udev rules or reload them. The application needs them on every install route, and a managed workstation where you cannot write to /etc/udev/rules.d/ and reload the subsystem is a hard stop rather than an inconvenience. The third is someone whose plugins are all Windows binaries and who does not want Wine. The Flatpak path makes it worse, since the Wine Flatpak is not supported, so it has to be installed natively, and Wine Mono may be missing from the distribution's packaging. The fourth is a plugin author targeting Elgato's own software. OpenDeck reads the existing plugin formats, and the OpenAction API is the alternative it supports alongside them, but nothing here replaces the vendor's marketplace, signing or update path.
Editorial conclusion
OpenDeck suits a Stream Deck owner on Linux who wants the plugins from the Elgato ecosystem to work, including Windows-only ones running through Wine, and who wants profile files that move between platforms unchanged. It does not suit a user without Elgato hardware unless they pair it with a phone through Tacto. Before installing, copy the udev rules into place and reload them, take the AUR package rather than the AppImage, and check whether the plugins you actually use are Windows binaries that will require Wine and possibly Wine Mono.
Frequently asked questions
What plugin formats does OpenDeck support?
Plugins made for the original Stream Deck SDK, so many from the Elgato ecosystem work, and the OpenAction API as an alternative. Compiled plugins not built for Linux need Wine, and some also need Wine Mono.
Do I need udev rules when installing OpenDeck from Flatpak?
Yes. The Flatpak note states you still need to install the udev subsystem rules as described, which means copying 40-streamdeck.rules into /etc/udev/rules.d/ and reloading with udevadm, since the sandbox cannot grant device access itself.
Should I use the AppImage build of OpenDeck?
No. The README says to avoid AppImage releases because they tend to have problems, and to avoid AppImages in general. For Arch-based distributions there are opendeck and opendeck-bin AUR packages plus opendeck-git for the latest commit.
How do I organise OpenDeck profiles into folders?
By prefixing the profile name with the folder name and a forward slash. The flat naming is what makes profile files movable between platforms without changes, and profiles can also switch automatically when a named application window is active.
What is OpenDeck built with?
Rust and TypeScript on Tauri, with a SvelteKit frontend built by Vite into static files and a Rust side in src-tauri that talks to the device through the elgato-streamdeck library. Icons are Phosphor.