a13n
Build AI agents and run them on cloud.
Fifteen keys. Zero friction. A Rust daemon + GTK4 app that makes the Stream Deck feel native on Omarchy.
Developer toolsRust · CSSGitHub @thewizsterAvailability needs another checkOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Stream Deck app for Omarchy and Hyprland, written in Rust
Loading the full README.
Read the full README ↗Written in Rust: a tiny background daemon drives the hardware, and a GTK4/libadwaita app lays out your keys.
uwsm-app, the same way Omarchy launches them.pw-play), with per-key volume.hl.dsp.focus({ workspace = "3" })) is passed straight to hyprctl dispatch. Classic syntax (workspace 3, movetoworkspace 2, togglefloating, fullscreen, killactive, exec …) is translated automatically on Hyprland versions that use a Lua config.omarchy theme set … and the deck re-renders instantly.~/.config/omadeck/, and imported icons are copied into it, so you can copy that folder to another machine.curl -LO https://github.com/thewizster/omadeck/releases/download/v0.3.0/omadeck-0.3.0-x86_64-linux.tar.gz
curl -LO https://github.com/thewizster/omadeck/releases/download/v0.3.0/SHA256SUMS
sha256sum -c SHA256SUMS
tar xzf omadeck-0.3.0-x86_64-linux.tar.gz && cd omadeck-0.3.0-x86_64-linux
scripts/install.sh
The installer uses the prebuilt binaries, enables the omadeckd user service and offers to set
up the udev rule (details below). If the deck isn't detected straight away, replug it once.
Coming soon: omarchy pkg add omadeck-bin from the Omarchy Package Repository. The package
is in review.
# Rust toolchain, if you don't have one yet
mise use -g rust@latest
git clone https://github.com/thewizster/omadeck && cd omadeck
scripts/install.sh
The script:
Cargo.lock), or uses the prebuilt ones from a release tarball, and installs omadeck + omadeckd to ~/.local/bin;omadeckd systemd user service, which starts with your graphical session;sudo commands, and runs them only if you answer y.To remove omadeck, run scripts/uninstall.sh. It also removes the Omarchy bar widget, and leaves your config in place.
omadeck speaks to decks through the elgato-streamdeck crate.
| Model | Status |
|---|---|
| Stream Deck (V2), 15 keys | ✅ Tested |
| Stream Deck Original / MK.2, 15 keys | Expected to work |
| Stream Deck Mini / Mini MK.2, 6 keys | Expected to work |
| Stream Deck XL / XL V2, 32 keys | Expected to work |
| Stream Deck Neo, 8 keys | Keys expected to work; info screen and touch keys unsupported |
| Stream Deck +, 8 keys | Keys expected to work; dials and touch strip unsupported |
| Stream Deck Pedal | Not supported (no display) |
Got one of the untested models? Please file a hardware report, whether it works or not.
Open omadeck from the launcher (Super+Space). On first run you get a starter layout:
| Row | Keys |
|---|---|
| 1 | Terminal · Browser · Files · Screenshot · omarchy.org |
| 2 | Workspaces 1–5 (Hyprland) |
| 3 | Mute · Night light · Next wallpaper · a sound · Lock |
Click any key to change it, or clear it with the trash button. The ▶ button tests the action without touching the deck.
The switcher above the deck picks the page you're editing; + adds a page, and the pencil and trash buttons rename or delete it. To make a folder, set a key to Open page and click New page: you get a page with a Back key already in place, and the key gets a folder symbol. Open it with › to fill it.
On the deck, Go back returns to the page you came from, or Home. Renaming a page updates every key that opens it.
A key can also do something when you let go of it: set When released in the editor. With
voxtype (Omarchy's dictation), a key that runs
voxtype record start when pressed and voxtype record stop when released gives you
push-to-talk: hold it, speak to your AI agent, let go. If the deck is unplugged or the service
stops while you're holding a key, it's let go then, so nothing stays switched on.
On Omarchy, the app offers once to add an omadeck icon to the bar. It shows whether your deck
is connected and which page it's on, and opens omadeck when clicked. Turn it on or off any time
with Show in Omarchy bar in the app's settings (or omarchy plugin disable dev.omadeck).
omadeckd run the daemon (normally via systemd)
omadeckd list show connected decks
omadeckd press 3 [PAGE] run key 3's action, then its release action (keys count from 0)
omadeckd snapshot x.png [PAGE] render the layout to an image
omadeckd status [--follow] the deck's state as Waybar-style JSON (keeps printing with --follow)
omadeckd press is handy in Hyprland bindings and scripts, for example to share one action between a key and a keyboard shortcut.
The config file is ~/.config/omadeck/config.toml. The app edits it for you, but it's plain TOML and safe to edit by hand, even while the app is open; the daemon and the app reload it as soon as you save. If the app can't read your edit, it shows the error and leaves the file alone until you fix it. See examples/config.toml.
Each time the app opens, and before it deletes a page, it keeps a copy of config.toml in ~/.local/state/omadeck/backups (the newest 20). Deleting a page or clearing a key can also be undone from the notice that pops up.
brightness = 70
[style]
follow_theme = true # colours from the active Omarchy theme
[[key]]
index = 0 # left-to-right, top-to-bottom, from 0
label = "Terminal"
icon = "icons/utilities-terminal.png" # relative to ~/.config/omadeck
[key.action]
type = "app"
command = "xdg-terminal-exec" # or a desktop id like "firefox.desktop"
[[key]]
index = 10
label = "Mute"
glyph = "\U000F075F" # Nerd Font symbol (or "f075f" / "U+F075F")
[key.action]
type = "app"
command = "omarchy audio output volume mute-toggle"
[[key]]
index = 4
label = "Media"
glyph = "\U000F024B"
[key.action]
type = "page" # open another page
page = "Media"
[[page]] # top-level [[key]]s are the Home page; more pages go here
name = "Media"
[[page.key]]
index = 0
label = "Back"
[page.key.action]
type = "back" # previous page, or Home
Action types:
type | Fields |
|---|---|
app | command |
script | path, terminal |
sound | file, volume (0.0–1.5) |
url | url |
hyprland | dispatch |
page | page (a page name) |
back |
A key's [key.on_release] (or [page.key.on_release]) takes any of these except page and
back, and runs when the key is let go.
Per-key look overrides are background, label_color and show_label.
crates/
omadeck-core/ config, Omarchy theme, key renderer, actions, IPC types
omadeckd/ daemon: owns the USB device, paints keys, runs actions
omadeck-gui/ GTK4 + libadwaita configurator (binary: omadeck)
packaging/ systemd unit, udev rule, desktop entry, AUR PKGBUILDs
scripts/ install / uninstall / package a release
site/ project website: static HTML/CSS/JS with an interactive demo
config.toml (atomically). The daemon watches it, plus Omarchy's theme state in ~/.local/state/omarchy/current, and repaints.omadeck-core is shared, so the previews in the app are rendered by the same code that paints the hardware.$XDG_RUNTIME_DIR/omadeck.sock. The app uses this for its status line, press-to-select and following the deck's page, and sends back the page you're editing so the deck can show it.systemctl --user status omadeckd (press q to leave its pager, or add --no-pager). Logs: journalctl --user -u omadeckd -f.packaging/70-omadeck.rules → /etc/udev/rules.d/), then replug it again.streamdeck-ui first.Ideas, roughly in order; docs/ROADMAP.md has the details. Want one sooner? Open an issue; see CONTRIBUTING.
omadeck was built on Omarchy by Raymond Brady together with Claude Code (Anthropic's AI coding agent), as a showcase of what that pairing can do. Every change goes through the same checks as any contribution: rustfmt, clippy -D warnings, tests, CI and testing on real hardware.
MIT © Raymond Brady