{"id":48891532,"url":"https://github.com/penguinztech/twitch-opendeck","last_synced_at":"2026-04-16T08:05:43.575Z","repository":{"id":350609447,"uuid":"1204925036","full_name":"PenguinzTech/twitch-opendeck","owner":"PenguinzTech","description":"OpenDeck plugin for Twitch stream control — chat, ads, clips, markers, Shield Mode, and more","archived":false,"fork":false,"pushed_at":"2026-04-11T05:59:08.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-11T07:24:51.085Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PenguinzTech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-08T13:17:40.000Z","updated_at":"2026-04-11T05:59:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/PenguinzTech/twitch-opendeck","commit_stats":null,"previous_names":["penguinztech/twitch-opendeck"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/PenguinzTech/twitch-opendeck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PenguinzTech%2Ftwitch-opendeck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PenguinzTech%2Ftwitch-opendeck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PenguinzTech%2Ftwitch-opendeck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PenguinzTech%2Ftwitch-opendeck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PenguinzTech","download_url":"https://codeload.github.com/PenguinzTech/twitch-opendeck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PenguinzTech%2Ftwitch-opendeck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31876860,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T07:36:03.521Z","status":"ssl_error","status_checked_at":"2026-04-16T07:35:53.576Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2026-04-16T08:04:54.841Z","updated_at":"2026-04-16T08:05:43.570Z","avatar_url":"https://github.com/PenguinzTech.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Twitch Stream Control for OpenDeck\n\nAn open-source Rust plugin for OpenDeck that lets streamers control Twitch chat and stream features directly from their deck hardware. Uses the Twitch Helix API with OAuth2 Device Code Flow for secure authentication.\n\n## Features\n\nControl 11 Twitch actions from your OpenDeck device:\n\n- **Chat Message** — Send preset messages to chat\n- **Clear Chat** — Instantly clear the chat\n- **Emote Only Chat** — Toggle emote-only mode\n- **Followers Only Chat** — Toggle followers-only mode (configurable minimum follow time)\n- **Subscribers Only Chat** — Toggle subscribers-only mode\n- **Slow Mode Chat** — Toggle slow mode (configurable delay in seconds)\n- **Play Ad** — Run an advertisement (30-180s, Partner/Affiliate status required)\n- **Stream Marker** — Create a marker at the current stream timestamp\n- **Create Clip** — Generate a clip from the current broadcast\n- **Viewer Count** — Display live viewer count (updates every 30 seconds)\n- **Shield Mode** — Toggle Twitch Shield Mode for spam/harassment protection\n\n## Setup\n\n### 1. Create a Twitch Application\n\n1. Go to [Twitch Developer Console](https://dev.twitch.tv/console/apps)\n2. Create a new application\n   - **Application Name**: OpenDeck Twitch Plugin\n   - **Application Category**: Choose appropriate category (e.g., \"Other\")\n   - **Redirect URI**: `http://localhost`\n3. Accept the Developer Agreement and click **Create**\n4. Copy your **Client ID** (you'll need this in step 4)\n\n### 2. Install OpenDeck\n\nFollow the [OpenDeck installation guide](https://opendeck.io/wiki/software/) for your operating system.\n\n### 3. Install the Plugin\n\n```bash\n# Clone or download this repository\ngit clone https://github.com/penguintechinc/twitch-opendeck.git\ncd twitch-opendeck\n\n# Install the plugin\nmake install\n```\n\nThis copies the plugin to:\n- **macOS/Linux**: `~/.config/opendeck/plugins/dev.penguin.twitch.sdPlugin/`\n- **Windows**: `%APPDATA%\\Elgato\\StreamDeck\\Plugins\\dev.penguin.twitch.sdPlugin\\`\n\n### 4. Add a Twitch Action to Your Deck\n\n1. Open OpenDeck\n2. Add any Twitch action to a button (Chat Message, Viewer Count, etc.)\n3. The Property Inspector appears on the right\n4. Enter your **Client ID** in the Client ID field\n5. Click **Login with Twitch**\n\n### 5. Authenticate with Twitch\n\n1. A popup window displays a device code and authorization URL\n2. Visit the URL in your browser\n3. Enter the device code when prompted\n4. Authorize the plugin to access your Twitch account\n5. Return to OpenDeck — authentication is complete\n\n### Done\n\nYour OpenDeck device is now authenticated with Twitch. Actions will execute immediately when pressed.\n\n## Building from Source\n\n### Prerequisites\n\n- Rust 1.70 or later\n- OpenDeck (installed)\n\n### Install Rust\n\n```bash\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nsource $HOME/.cargo/env\n```\n\n### Build and Install\n\n```bash\ngit clone https://github.com/penguintechinc/twitch-opendeck.git\ncd twitch-opendeck\n\n# Build and install the plugin\nmake install\n\n# Or build only\nmake build\n\n# Or develop with live reload\nmake dev\n```\n\n## Important Notes\n\n### Permissions \u0026 Restrictions\n\n- **Moderation Actions** (Clear Chat, Emote Only, Followers Only, Subscribers Only, Slow Mode, Shield Mode) require you to be:\n  - The channel broadcaster, OR\n  - A moderator in the channel\n  \n- **Play Ad** requires:\n  - Partner or Affiliate status on your Twitch channel\n\n- **Create Clip** requires:\n  - The channel to be live at the time you press the button\n\n- **Viewer Count** works with any authentication but displays 0 if the channel is offline\n\n### Token Management\n\nTokens are automatically:\n- Persisted in OpenDeck's global settings (encrypted)\n- Refreshed before expiration\n- Validated on each button press\n\nYou can revoke access at any time from your [Twitch Security Settings](https://www.twitch.tv/settings/connections).\n\n## Configuration Per Action\n\nSome actions support customization via the Property Inspector:\n\n| Action | Configurable Fields |\n|--------|-------------------|\n| Chat Message | Preset message text |\n| Followers Only Chat | Minimum follow time (minutes) |\n| Slow Mode Chat | Delay duration (seconds, 0-120) |\n| Play Ad | Duration (30, 60, 90, 120, 180 seconds) |\n\n## Troubleshooting\n\n**\"Plugin not found\"** — Run `make install` again to ensure the plugin directory structure is correct.\n\n**\"Login failed\"** — Verify your Client ID is correct. Check that the Redirect URI in your Twitch app is exactly `http://localhost`.\n\n**\"Action failed: Not authorized\"** — Ensure you are a moderator in the channel or the channel broadcaster.\n\n**\"Viewer count shows 0\"** — The channel may be offline. Viewer count only displays for live streams.\n\n## Development\n\n### Project Structure\n\n```\ntwitch-opendeck/\n├── src/\n│   ├── main.rs              # Plugin entry point and message dispatcher\n│   ├── auth.rs              # OAuth2 Device Code Flow implementation\n│   ├── settings.rs          # OpenDeck property persistence\n│   ├── twitch_api.rs        # Helix API client\n│   ├── global_handler.rs    # Global plugin state and initialization\n│   └── actions/             # Individual action implementations\n│       ├── chat_message.rs\n│       ├── clear_chat.rs\n│       ├── emote_chat.rs\n│       └── ... (other actions)\n├── Cargo.toml               # Rust dependencies\n├── Makefile                 # Build and install targets\n└── README.md                # This file\n```\n\n### Running Tests\n\n```bash\nmake test\n```\n\n## License\n\nThis plugin is open source. See LICENSE file for details.\n\n## Support\n\nFor issues, feature requests, or contributions, visit the [GitHub Issues](https://github.com/penguintechinc/twitch-opendeck/issues) page.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpenguinztech%2Ftwitch-opendeck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpenguinztech%2Ftwitch-opendeck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpenguinztech%2Ftwitch-opendeck/lists"}