# Example modules.yaml — copy to ~/.config/streamdeck-go/modules.yaml # # Required Slack token scopes: users.profile:write, users:write, dnd:write # Export your token: export SLACK_TOKEN="xoxp-..." modules: slack: set_status: params: emoji: ":speech_balloon:" text: "In a meeting" expiry: "1h" exec: | curl -s -X POST https://slack.com/api/users.profile.set \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" \ -H "Content-Type: application/json" \ -d '{"profile":{"status_emoji":"{{.emoji}}","status_text":"{{.text}}","status_expiration":{{expiry .expiry}}}}' clear_status: exec: | curl -s -X POST https://slack.com/api/users.profile.set \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" \ -H "Content-Type: application/json" \ -d '{"profile":{"status_emoji":"","status_text":"","status_expiration":0}}' set_presence: params: presence: "away" exec: | curl -s -X POST https://slack.com/api/users.setPresence \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" \ -H "Content-Type: application/json" \ -d '{"presence":"{{.presence}}"}' snooze: params: minutes: "60" exec: | curl -s -X POST https://slack.com/api/dnd.setSnooze \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" \ -H "Content-Type: application/json" \ -d '{"num_minutes":{{.minutes}}}' go_offline: exec: | curl -s -X POST https://slack.com/api/users.setPresence \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" \ -H "Content-Type: application/json" \ -d '{"presence":"away"}' && \ curl -s -X POST https://slack.com/api/users.profile.set \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" \ -H "Content-Type: application/json" \ -d '{"profile":{"status_emoji":":dumpsterfire:","status_text":"Offline","status_expiration":0}}' end_snooze: exec: | curl -s -X POST https://slack.com/api/dnd.endSnooze \ -H "Authorization: Bearer {{env "SLACK_TOKEN"}}" # OBS Studio — media player, streaming, and scene/transition control via obs-cmd # # Requires: obs-cmd (https://github.com/grigio/obs-cmd) # macOS (Intel): brew install grigio/obs-cmd/obs-cmd → /usr/local/bin/obs-cmd # macOS (Apple Silicon): brew install grigio/obs-cmd/obs-cmd → /opt/homebrew/bin/obs-cmd # Linux: cargo install obs-cmd → ~/.cargo/bin/obs-cmd # Linux (binary): download from GitHub releases, e.g. /usr/local/bin/obs-cmd # # OBS WebSocket must be enabled: Tools → WebSocket Server Settings (on by default in OBS 28+) # # Add to ~/.config/streamdeck-go/.env: # OBS_WEBSOCKET_PASSWORD=your-password # OBS_HOST=localhost (optional, default: localhost) # OBS_PORT=4455 (optional, default: 4455) # OBS_CMD=/opt/homebrew/bin/obs-cmd (optional, default: /usr/local/bin/obs-cmd) # set this on Apple Silicon or Linux cargo installs obs: play: params: source: "Media Source" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} media-input play "{{.source}}" pause: params: source: "Media Source" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} media-input pause "{{.source}}" stop: params: source: "Media Source" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} media-input stop "{{.source}}" restart: params: source: "Media Source" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} media-input restart "{{.source}}" toggle_record: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} recording toggle toggle_record_pause: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} recording toggle-pause is_recording_paused: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} recording status toggle_stream: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} streaming toggle scene_switch: params: scene: "Scene 1" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene switch "{{.scene}}" toggle_mute: params: source: "Mic/Aux" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} input toggle-mute "{{.source}}" is_recording: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} recording status is_streaming: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} streaming status # Change the active transition type. Common values: Fade, Cut, Slide, Swipe, Stinger. # Must match a transition that exists in your OBS profile (see Scene Transitions panel). set_transition: params: transition: "Fade" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene transition-set "{{.transition}}" # Set the active transition duration in milliseconds. set_transition_duration: params: duration: "300" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene transition-duration {{.duration}} # Toggle Studio Mode (preview + program with a Transition button). studio_mode_toggle: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene studio-mode-toggle # In Studio Mode, set the scene shown on the preview side. preview_scene: params: scene: "Scene 1" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene preview-set "{{.scene}}" # The Studio Mode "Transition" button — push preview to program using the current transition. take: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene studio-mode-transition # Fire the current transition without changing scenes (e.g. to re-trigger a stinger). transition_trigger: exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene transition-trigger # Switch scene using a specific transition, overriding OBS's current transition for this cut. # Chains set_transition + transition-duration + scene switch in one key press. scene_switch_with_transition: params: scene: "Scene 1" transition: "Fade" duration: "300" exec: | {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene transition-set "{{.transition}}" && \ {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene transition-duration {{.duration}} && \ {{envDefault "OBS_CMD" "/usr/local/bin/obs-cmd"}} --websocket obsws://{{envDefault "OBS_HOST" "localhost"}}:{{envDefault "OBS_PORT" "4455"}}/{{env "OBS_WEBSOCKET_PASSWORD"}} scene switch "{{.scene}}"