个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Stream Deck app for Omarchy and Hyprland, written in Rust
翻译准备中
正在加载完整 README。
查看完整 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