{"id":13831982,"url":"https://github.com/muesli/deckmaster","last_synced_at":"2025-04-06T01:10:18.368Z","repository":{"id":37488405,"uuid":"197689966","full_name":"muesli/deckmaster","owner":"muesli","description":"An application to control your Elgato Stream Deck on Linux","archived":false,"fork":false,"pushed_at":"2024-05-22T06:08:15.000Z","size":715,"stargazers_count":270,"open_issues_count":43,"forks_count":47,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-30T00:07:55.090Z","etag":null,"topics":["elgato","elgato-stream-deck","service","stream-deck","streamdeck"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/muesli.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"muesli"}},"created_at":"2019-07-19T02:45:42.000Z","updated_at":"2025-03-21T11:10:49.000Z","dependencies_parsed_at":"2024-01-15T15:43:35.448Z","dependency_job_id":"3196a24c-1fff-4426-a906-a71b235ffafa","html_url":"https://github.com/muesli/deckmaster","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muesli%2Fdeckmaster","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muesli%2Fdeckmaster/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muesli%2Fdeckmaster/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muesli%2Fdeckmaster/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/muesli","download_url":"https://codeload.github.com/muesli/deckmaster/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247419861,"owners_count":20936012,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elgato","elgato-stream-deck","service","stream-deck","streamdeck"],"created_at":"2024-08-04T10:01:46.590Z","updated_at":"2025-04-06T01:10:18.347Z","avatar_url":"https://github.com/muesli.png","language":"Go","readme":"# deckmaster\n\n[![Latest Release](https://img.shields.io/github/release/muesli/deckmaster.svg?style=for-the-badge)](https://github.com/muesli/deckmaster/releases)\n[![Go Doc](https://img.shields.io/badge/godoc-reference-blue.svg?style=for-the-badge)](https://pkg.go.dev/github.com/muesli/deckmaster)\n[![Software License](https://img.shields.io/badge/license-MIT-blue.svg?style=for-the-badge)](/LICENSE)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/muesli/deckmaster/build.yml?branch=master\u0026style=for-the-badge)](https://github.com/muesli/deckmaster/actions)\n[![Go ReportCard](https://goreportcard.com/badge/github.com/muesli/deckmaster?style=for-the-badge)](https://goreportcard.com/report/muesli/deckmaster)\n\nAn application to control your Elgato Stream Deck on Linux\n\n## Features\n\n- Multiple pages \u0026 navigation between decks\n- Buttons (icons \u0026 text)\n- Background images\n- Brightness control\n- Supports different actions for short \u0026 long presses\n- Comes with a collection of widgets:\n    - Buttons\n    - Time (with formatting)\n    - CPU/Mem usage\n    - Weather\n    - Command output\n    - Recently used windows (X11-only)\n- Lets you trigger several actions:\n    - Run commands\n    - Emulate a key-press\n    - Paste to clipboard\n    - Trigger a dbus call\n\n## Installation\n\n### Packages\n\n- Arch Linux: [deckmaster](https://aur.archlinux.org/packages/deckmaster/)\n- [Packages](https://github.com/muesli/deckmaster/releases) in Alpine, Debian \u0026 RPM formats\n- [Binaries](https://github.com/muesli/deckmaster/releases) for various architectures\n\n### From source\n\nMake sure you have a working Go environment (Go 1.17 or higher is required).\nSee the [install instructions](https://golang.org/doc/install.html).\n\nTo install deckmaster, simply run:\n\n    git clone https://github.com/muesli/deckmaster.git\n    cd deckmaster\n    go build\n\n## System Setup\n\nOn Linux you need to set up some `udev` rules to be able to access the device as\na regular user. Edit `/etc/udev/rules.d/99-streamdeck.rules` and add these lines:\n\n```\nSUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0fd9\", ATTRS{idProduct}==\"0060\", MODE:=\"666\", GROUP=\"plugdev\", SYMLINK+=\"streamdeck\"\nSUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0fd9\", ATTRS{idProduct}==\"006d\", MODE:=\"666\", GROUP=\"plugdev\", SYMLINK+=\"streamdeck\"\nSUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0fd9\", ATTRS{idProduct}==\"0080\", MODE:=\"666\", GROUP=\"plugdev\", SYMLINK+=\"streamdeck\"\nSUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0fd9\", ATTRS{idProduct}==\"0063\", MODE:=\"666\", GROUP=\"plugdev\", SYMLINK+=\"streamdeck-mini\"\nSUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0fd9\", ATTRS{idProduct}==\"006c\", MODE:=\"666\", GROUP=\"plugdev\", SYMLINK+=\"streamdeck-xl\"\n```\n\nMake sure your user is part of the `plugdev` group and reload the rules with\n`sudo udevadm control --reload-rules`. Unplug and re-plug the device, and you\nshould be good to go.\n\n### Starting deckmaster automatically\n\nIf you want deckmaster to be started automatically upon device plugin, you can\nuse systemd path activation, adding `streamdeck.path` and `streamdeck.service`\nfiles to `$HOME/.config/systemd/user`.\n\n`streamdeck.path` contents:\n\n```ini\n[Unit]\nDescription=\"Stream Deck Device Path\"\n\n[Path]\n# the device name will be different if you use streamdeck-mini or streamdeck-xl\nPathExists=/dev/streamdeck\nUnit=streamdeck.service\n\n[Install]\nWantedBy=multi-user.target\n```\n\n`streamdeck.service` contents:\n\n```ini\n[Unit]\nDescription=Deckmaster Service\n\n[Service]\n# adjust the path to deckmaster and .deck file to suit your needs\nExecStart=/usr/local/bin/deckmaster --deck path-to/some.deck\nRestart=on-failure\nExecReload=kill -HUP $MAINPID\n\n[Install]\nWantedBy=default.target\n```\n\nThen enable and start the `streamdeck.path` unit:\n\n```bash\nsystemctl --user enable streamdeck.path\nsystemctl --user start streamdeck.path\n```\n\n## Usage\n\nStart `deckmaster` with the initial deck configuration you want to load:\n\n```bash\ndeckmaster -deck deck/main.deck\n```\n\nYou can control the brightness, in percent:\n\n```bash\ndeckmaster -brightness 50\n```\n\nControl a specific streamdeck:\n\n```bash\ndeckmaster -device [serial number]\n```\n\nSet a sleep timeout after which the screen gets turned off:\n\n```bash\ndeckmaster -sleep 10m\n```\n\n## Configuration\n\nYou can find a few example configurations in the [decks](https://github.com/muesli/deckmaster/tree/master/decks)\ndirectory. Edit them to your needs!\n\n### Widgets\n\nAny widget is build up the following way:\n\n```toml\n[[keys]]\n  index = 0\n```\n\n`index` needs to be present in every widget and describes the position of the\nwidget on the streamdeck. `index` is 0-indexed and counted from top to bottom\nand left to right.\n\n#### Update interval for widgets\n\nOptionally, you can configure an update `interval` for each widget:\n\n```toml\n[keys.widget]\n  id = \"button\"\n  interval = 500 # optional\n```\n\nThe attribute `interval` defines the time in `ms` between two consecutive\nupdates of a widget.\n\n#### Button\n\nA simple button that can display an image and/or a label.\n\n```toml\n[keys.widget]\n  id = \"button\"\n  [keys.widget.config]\n    icon = \"/some/image.png\" # optional\n    label = \"My Button\" # optional\n    fontsize = 10.0 # optional\n    color = \"#fefefe\" # optional\n    flatten = true # optional\n```\n\nIf `flatten` is `true` all opaque pixels of the icon will have the color `color`.\n\n#### Recent Window (requires X11)\n\nDisplays the icon of a recently used window/application. Pressing the button\nactivates the window.\n\n```toml\n[keys.widget]\n  id = \"recentWindow\"\n  [keys.widget.config]\n    window = 1\n    showTitle = true # optional\n```\n\nIf `showTitle` is `true`, the title of the window will be displayed below the\nwindow icon.\n\n#### Time\n\nA flexible widget that can display the current time or date.\n\n```toml\n[keys.widget]\n  id = \"time\"\n  [keys.widget.config]\n    format = \"%H;%i;%s\"\n    font = \"bold;regular;thin\" # optional\n    color = \"#fefefe\" # optional\n    layout = \"0x0+72x24;0x24+72x24;0x48+72x24\" # optional\n```\n\nWith `layout` custom layouts can be definded in the format `[posX]x[posY]+[width]x[height]`.\n\nValues for `format` are:\n\n| %   | gets replaced with                                                 |\n| --- | ------------------------------------------------------------------ |\n| %Y  | A full numeric representation of a year, 4 digits                  |\n| %y  | A two digit representation of a year                               |\n| %F  | A full textual representation of a month, such as January or March |\n| %M  | A short textual representation of a month, three letters           |\n| %m  | Numeric representation of a month, with leading zeros              |\n| %l  | A full textual representation of the day of the week               |\n| %D  | A textual representation of a day, three letters                   |\n| %d  | Day of the month, 2 digits with leading zeros                      |\n| %h  | 12-hour format of an hour with leading zeros                       |\n| %H  | 24-hour format of an hour with leading zeros                       |\n| %i  | Minutes with leading zeros                                         |\n| %s  | Seconds with leading zeros                                         |\n| %a  | Lowercase Ante meridiem and Post meridiem                          |\n| %t  | Timezone abbreviation                                              |\n\n#### Top\n\nThis widget shows the current CPU or memory utilization as a bar graph.\n\n```toml\n[keys.widget]\n  id = \"top\"\n  [keys.widget.config]\n    mode = \"cpu\"\n    color = \"#fefefe\" # optional\n    fillColor = \"#d497de\" # optional\n```\n\nThere are two values for `mode`: `cpu` and `memory`.\n\n#### Command\n\nA widget that displays the output of commands.\n\n```toml\n[keys.widget]\n  id = \"command\"\n  [keys.widget.config]\n    command = \"echo 'Files:'; ls -a ~ | wc -l\"\n    font = \"regular;bold\" # optional\n    color = \"#fefefe\" # optional\n    layout = \"0x0+72x20;0x20+72x52\" # optional\n```\n\n#### Weather\n\nA widget that displays the weather condition and temperature.\n\n```toml\n[keys.widget]\n  id = \"weather\"\n  [keys.widget.config]\n    location = \"MyCity\" # optional\n    unit = \"celsius\" # optional\n    color = \"#fefefe\" # optional\n    flatten = true # optional\n    theme = \"openmoji\" # optional\n```\n\nThe supported location types can be found [here](http://wttr.in/:help). The unit\nhas to be either `celsius` or `fahrenheit`. If `flatten` is `true` all opaque\npixels of the condition icon will have the color `color`. In case `theme` is set\ncorresponding icons with correct names need to be placed in\n`~/.local/share/deckmaster/themes/[theme]`. The default icons with their\nrespective names can be found [here](https://github.com/muesli/deckmaster/tree/master/assets/weather).\n\n### Actions\n\nYou can hook up any key with several actions. A regular keypress will trigger\nthe widget's configured `keys.action`, while holding the key will trigger\n`keys.action_hold`.\n\n#### Switch deck\n\n```toml\n[keys.action]\n  deck = \"relative/path/to/another.deck\"\n```\n\n#### Run a command\n\n```toml\n[keys.action]\n  exec = \"some_command --with-parameters\"\n```\n\n#### Emulate key-presses\n\n```toml\n[keys.action]\n  keycode = \"Leftctrl-C\"\n```\n\nEmulate a series of key-presses with delay in between:\n\n```toml\n[keys.action]\n  keycode = \"Leftctrl-X+500 / Leftctrl-V / Num1\"\n```\n\nA list of available `keycodes` can be found here: [keycodes](https://github.com/muesli/deckmaster/blob/master/keycodes.go)\n\n#### Paste to clipboard\n\n```toml\n[keys.action]\n  paste = \"some text\"\n```\n\n#### Trigger a dbus call\n\n```toml\n[keys.action]\n  [dbus]\n    object = \"object\"\n    path = \"path\"\n    method = \"method\"\n    value = \"value\"\n```\n\n#### Device actions\n\nIncrease the brightness. If no value is specified, it will be increased by 10%:\n\n```toml\n[keys.action]\n  device = \"brightness+5\"\n```\n\nDecrease the brightness. If no value is specified, it will be decreased by 10%:\n\n```toml\n[keys.action]\n  device = \"brightness-5\"\n```\n\nSet the brightness to a specific value between 0 and 100:\n\n```toml\n[keys.action]\n  device = \"brightness=50\"\n```\n\nPut the device into sleep mode, blanking the screen until the next key gets\npressed:\n\n```toml\n[keys.action]\n  device = \"sleep\"\n```\n\n### Background Image\n\nYou can configure each deck to display an individual wallpaper behind its\nwidgets:\n\n```toml\nbackground = \"/some/image.png\"\n```\n\n### Re-using another deck's configuration\n\nIf you specify a `parent` inside a deck's configuration, it will inherit all\nof the parent's settings that are not overwritten by the deck's own settings.\nThis even works recursively:\n\n```toml\nparent = \"another.deck\"\n```\n\n## More Decks!\n\n* [deckmaster-emojis](https://github.com/muesli/deckmaster-emojis), an Emoji keyboard deck\n* [deckmaster-helldivers2](https://github.com/boj/deckmaster-helldivers2), a deck for calling down Helldivers 2 game stratagems\n\nMade your own useful decks? Submit a pull request!\n\n## Feedback\n\nGot some feedback or suggestions? Please open an issue or drop me a note!\n\n* [Twitter](https://twitter.com/mueslix)\n* [The Fediverse](https://mastodon.social/@fribbledom)\n","funding_links":["https://github.com/sponsors/muesli"],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuesli%2Fdeckmaster","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuesli%2Fdeckmaster","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuesli%2Fdeckmaster/lists"}