個人 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