DuckyDeck Studio is a native Linux configurator, DSVM v2 bytecode compiler, Wayland Auto-Switcher, and AI Macro Architect for the duckyPad Pro (2024) and duckyPad (2020), crafted with Rust, CXX-Qt, and KDE Plasma 6 Kirigami.

πŸ™ Special Thanks to dekuNukem
A huge thank you to dekuNukem for designing, engineering, and open-sourcing the incredible duckyPad & duckyPad Pro hardware and DuckyScript 3 ecosystem! Get your own duckyPad Pro and accessories from dekuNukem's Official Tindie Store.
duckyPad Pro (0x0483:0xd11d) duckyPad 2020 (0x0483:0xd11c) DuckyDeck Studio FW v1.0.0 DSVM v2 .dsb Bytecode Compiler Profile Templates KDE Plasma 6 Wayland Auto-Switcher Saved & Used RGB Palettes App Launcher & Web API Triggers

⚑ Hardware Portability vs. Host-Dependent Capabilities

DuckyDeck Studio combines standalone hardware configuration (compiled onto your duckyPad's microSD card) with host-assisted Linux desktop automation. Throughout the app, every feature is badged as either βœ… Hardware-Portable or πŸ’» Requires DuckyDeck Studio Running on Host PC so you always know what works when you unplug your duckyPad and move it to another computer.

Capability Portability Requires DuckyDeck Studio Running? Details
Standard duckyScript 3 Macros (keyN.txt β†’ .dsb) βœ… Hardware-Portable No (once synced to SD) Keyboard shortcuts, STRING/STRINGLN, mouse moves, media keys, loops, and GOTO_PROFILE run natively on the duckyPad MCU on any OS.
Key Labels, Static RGB Colors & Key Lighting Scripts (SWCC/SWCF/SWCR) βœ… Hardware-Portable No (once synced to SD) Stored directly in config.txt and .dsb bytecode on the microSD card.
OLED Orientation (0Β°, 90Β°, 180Β°, 270Β°) βœ… Hardware-Portable No (once synced to SD) Saved to config.txt on the microSD card (`270Β°` requires DuckyDeck Studio Firmware v1.0.0).
πŸš€ Launch Application Action (APP badge) ⚠️ Host-Dependent (Not Portable) Yes (must be running on Host PC) Emits a silent _GV31 USB HID trigger or F13–F24 hotkey that DuckyDeck Studio listens for on your Linux PC to spawn local apps.
🌐 Web API / HTTP Webhook Action (API badge) ⚠️ Host-Dependent (Not Portable) Yes (must be running on Host PC) The duckyPad has no Wi-Fi/Ethernet stack; DuckyDeck Studio executes the HTTP request on the host PC when triggered via USB HID.
🌈 Live RGB Ambient Animator (Rainbow Wave / Breathing / Reactive) ⚠️ Host-Dependent (Live USB HID) Yes (must be running on Host PC) Streams 20 FPS RGB frames over USB HID 0x17. Stopping DuckyDeck Studio restores the profile's static SD card colors.
πŸͺŸ Wayland Window Auto-Switcher & Floating OLED Desktop Widget ⚠️ Host-Dependent (KDE Plasma 6) Yes (must be running on Host PC) Uses a KWin Wayland D-Bus hook and USB HID 0x03 to switch profiles when active windows change and render the desktop widget.
πŸ’‘ In-App Portability Indicators
Whenever a key uses a host-dependent capability (πŸš€ Launch App or 🌐 Web API), the Right Key Inspector displays an amber πŸ’» Host-Dependent Action β€” Requires DuckyDeck Studio Running banner, and the dialog headers for Launch App, Web API, Live RGB Animator, and Auto-Switcher clearly state that the feature requires DuckyDeck Studio running in the background or system tray.

🎬 Video Tour & Application Screenshots

Watch the full 1080p walkthrough of DuckyDeck Studio in action across profiles for Dolphin, Google Chrome, VS Code, OBS Studio, KDE Konsole, Blender 3D, Spotify, and the Desktop App Launcher:

πŸŽ₯ DuckyDeck Studio Demo Video (1080p MP4) β€” Showcasing profile editing, custom RGB palettes, Web API triggers, App Launcher, Wayland Auto-Switcher, and System Event Log.

πŸ“¦ 1. Downloading from GitHub, Installation & USB HID Permissions

DuckyDeck Studio is open-source and hosted on GitHub at github.com/russellmilliner/duckydeck-studio. It communicates directly with your duckyPad over USB HID (hidraw) for real-time profile switching, LED color previews, RTC clock sync, and Persistent Global Variables (_GV0.._GV31), and mounts or reads the duckyPad microSD card for profile storage.

Step 1: Download or Clone from GitHub

πŸ™ Option A: Clone with Git (Recommended)

Clone the repository directly so you can easily pull updates with git pull:

git clone https://github.com/russellmilliner/duckydeck-studio.git
cd duckydeck-studio

πŸ“₯ Option B: Download ZIP or Release from GitHub

Visit github.com/russellmilliner/duckydeck-studio and click Code β†’ Download ZIP (or browse GitHub Releases), or download via terminal:

curl -L https://github.com/russellmilliner/duckydeck-studio/archive/refs/heads/master.zip -o duckydeck-studio.zip
unzip duckydeck-studio.zip
cd duckydeck-studio-master

Step 2: Install Build Prerequisites

Step 3: Build & Install DuckyDeck Studio

Compile the optimized release binary and install the executable, desktop launcher, icon, and duckyScript 3 syntax highlighting definition:

# 1. Compile optimized release binary
cargo build --release

# 2. Install binary to ~/.local/bin
install -Dm755 target/release/duckydeck-studio ~/.local/bin/duckydeck-studio

# 3. Install duckyScript 3 syntax highlighting for KDE KSyntaxHighlighting
install -Dm644 data/syntax/duckyscript3.xml \
    ~/.local/share/org.kde.syntax-highlighting/syntax/duckyscript3.xml

# 4. Install desktop entry, icon, and documentation
install -Dm644 data/io.github.duckydeck.Studio.desktop \
    ~/.local/share/applications/io.github.duckydeck.Studio.desktop
install -Dm644 data/icons/io.github.duckydeck.Studio.svg \
    ~/.local/share/icons/hicolor/scalable/apps/io.github.duckydeck.Studio.svg
install -Dm644 docs/user-guide.html \
    ~/.local/share/duckydeck-studio/docs/user-guide.html

# 5. Launch DuckyDeck Studio
~/.local/bin/duckydeck-studio
⚑ Step 4: One-Click Polkit udev Rule Setup
If Linux blocks non-root USB HID access (PermissionDenied on /dev/hidraw*), DuckyDeck Studio automatically displays an inline yellow banner at the top of the window. Click Install Rules to authorize the 70-duckypad.rules installation via Polkit, or run:
sudo ./data/udev/install-udev-rules.sh

Supported Hardware Matrix

Model USB VID:PID Mechanical Keys Rotary Encoders Expansion Channels OLED Display
duckyPad Pro (2024) 0x0483:0xd11d 20 RGB Keys (4Γ—5) 2 Encoders (Slots 21–26) Up to 32 Channels (Slots 27–58) 128Γ—128 Monochrome
duckyPad (2020) 0x0483:0xd11c 15 RGB Keys (3Γ—5) β€” β€” 128Γ—64 Monochrome

πŸ–₯️ 2. The 3-Column Workspace

1️⃣ Left Column: Profiles, Templates & Auto-Switcher

Browse up to 64 hardware profiles, filter by profile name or bound application, create profiles from built-in or user Templates, drag-and-drop the β Ώ handle to reorder profiles, click any profile's color bar to change its default LED color (`BG_COLOR`), and monitor or configure KWin Wayland Auto-Switcher rules.

2️⃣ Center Column: Interactive Hardware Canvas

Interact with the 4Γ—5 RGB key matrix (Keys 1–20), Dual Rotary Encoders (Slots 21–26), live 128Γ—128 OLED screen simulator, and 32 Expansion Module channels (Slots 27–58). Drag and drop keys to swap or shift (`Shift + Drag`) slots.

3️⃣ Right Column: Key Inspector & Script IDE

Opens automatically when you click a key or encoder slot. Edit Line 1 / Line 2 OLED labels (up to 7 characters each), toggle Allow Abort and No Repeat, write `On Press` (`keyN.txt`) and `On Release` (`keyN-release.txt`) scripts, or configure no-code πŸš€ Launch App and 🌐 Web API actions.

β˜• Top Bar & Hamburger Menu (`☰`)

Displays the active application version, active profile badge, quick Default Color button, β˜• Buy Me a Coffee Ko-fi button, and the ☰ Hamburger Menu for SD sync & mounting, profile templates, profile groups, PGV variables, System Event Log, Settings, and About.

πŸ—‚οΈ 3. Profiles, Templates & Profile Groups

The duckyPad Pro supports up to 64 profiles (`profile_1` through `profile_64`). Each profile stores its own default background LED color (`BG_COLOR`), per-key custom colors (`SWCOLOR`), key labels (`zN` / `xN`), OLED & Desktop Widget orientations, and compiled bytecode binaries (`.dsb`).

🎹 4. Interactive Hardware Canvas & OLED Simulator

🎨 5. Key & Profile Color Picker (Saved & Used Palettes)

Open the Color Picker by right-clicking any keycap and choosing Set Key X Color, clicking Key Color in the right inspector, or clicking Default Color in the top bar / center toolbar / profile sidebar.

🌈 Interactive HSV + RGB Controls

  • 2D Saturation / Value Square & Hue Bar: Drag the crosshair to blend shades visually.
  • R / G / B Sliders & SpinBoxes (`0–255`): Dial in exact hardware LED values.
  • Hex Input (`#RRGGBB`) & Old/New Swatch: Paste hex codes directly or click the Old swatch to revert.
  • System Picker...: Launch the native KDE/OS color dialog and screen eyedropper anytime.

πŸ“Œ Saved Colors & Used Colors Palettes

  • Saved Colors Palette: Click + Save Current (`#RRGGBB`) to pin colors to your persistent palette (`~/.config/duckydeck-studio/kwin_rules.json`). Left-click to select, double-click to apply immediately, or right-click a swatch to remove it.
  • Used Colors Palette: Automatically lists every unique color currently used in any profile's `BG_COLOR` or key's `SWCOLOR` across all loaded profiles. Left-click to reuse a color, or right-click a Used Color swatch to add it to your Saved Colors!
  • Reset to Profile Default: When editing a key color, click Reset to Profile Default to remove its custom `SWCOLOR` and inherit the profile's `BG_COLOR`.
Color Picker with Saved and Used Palettes
🎨 Set Key Color Dialog β€” Interactive 2D HSV picker, RGB/Hex controls, persistent Saved Colors palette, and automatic Used Colors in Profiles & Keys palette.

πŸ’Ύ 6. microSD Sync, Mounting & Firmware Manager (`v1.0.0` & Official Catalog)

Edits you make in DuckyDeck Studio are saved immediately to your local profile cache (`~/.local/share/duckydeck-studio/profiles_cache/`) so you never lose work, even when the duckyPad is unplugged.

πŸ”§ What DuckyDeck Studio Firmware v1.0.0 Adds Over Standard duckyPad Pro Firmware (3.3.5)

Capability Standard Official Firmware (3.3.5) DuckyDeck Studio Firmware (1.0.0 β€” DPP_FW_1.0.0_ad2acc81.bin)
1-Bit Monochrome OLED Key Icons ASCII 32..126 text only (? for non-ASCII) βœ… Adaptive 1-bit pixel-art icons: full-cell 16Γ—16 icon when Line 2 is empty, top-line 10Γ—10 icon above a Line 2 text caption, and inline 7Γ—10 / 6Γ—8 icon glyphs mixed with text
UTF-8 Key Labels & Buffer Size 8-byte buffer (KEYNAME_SIZE 8), raw byte truncation at 5 bytes βœ… 24-byte UTF-8 buffer (KEYNAME_SIZE 24) with multi-byte UTF-8 codepoint decoding, glyph-aware truncation (5 glyphs in 0Β°/180Β°, 4 glyphs in 90Β°/270Β°), and dual ui_z<N>/ui_x<N> + ASCII fallback z<N>/x<N> directives
Hardware OLED Screen Orientation 0Β° (Portrait) and 90Β° CW (IS_LANDSCAPE 1) only βœ… Full 4-Way Rotation (0Β°, 90Β°, 180Β°, 270Β°): adds 180Β° Inverted Portrait (IS_LANDSCAPE 2 / OLED_ROTATION 180) and 270Β° Counter-Clockwise Landscape (IS_LANDSCAPE 3 / OLED_ROTATION 270) with automatic CCW 4Γ—5 grid coordinate remapping
USB HID Firmware Identification (0x00) Reports version 3.3.5, no custom capability signature βœ… Reports 1.0.0 + 'D','D','S' signature bytes (offsets 19..21) so DuckyDeck Studio automatically detects custom firmware support
DSVM v2 Bytecode & SD Compatibility DSVM v2 (.dsb) βœ… 100% compatible with all DSVM v2 .dsb scripts and standard microSD profiles

πŸ“œ 7. duckyScript 3 & Built-In DSVM v2 Bytecode Compiler

DuckyDeck Studio includes a full, pure-Rust duckyScript 3 β†’ DSVM v2 (`.dsb`) bytecode compiler with real-time syntax checking and KDE `KSyntaxHighlighting`. Standard duckyScript 3 macros are 100% Hardware-Portable once synced to your microSD card.

πŸš€ 8. Launch Application Builder

πŸ’» Host-Dependent Feature β€” Requires DuckyDeck Studio Running
Launching local desktop applications is not hardware-portable. DuckyDeck Studio must be running on your host PC (in the foreground or minimized to the system tray) to listen for the duckyPad's USB HID trigger and spawn the application.

Turn any duckyPad key into a one-press Linux application launcher without writing shell scripts by hand.

  1. Select a key (1–20) to open the Right Inspector and click the πŸš€ Launch App button in the editor toolbar.
  2. Check Launch Application on Key Press.
  3. Click πŸ“¦ Pick Installed App... to search all installed desktop applications (`.desktop` entries from `/usr/share/applications`, Flatpak exports, and `~/.local/share/applications`) with icons, descriptions, and categoriesβ€”or type any custom command and arguments.
  4. Choose the Trigger Mode:
    • Silent Host Launch (`_GV19`) (Default β€” No Keyboard Shortcut Needed): Pressing the key on the duckyPad writes a unique profile+slot token to `_GV19`. DuckyDeck Studio's background HID listener detects the change and spawns the application directly on your Linux desktop!
    • F13–F24 Global Hotkey (`evdev`): Emits `F13`–`F24` over USB HID keyboard and triggers the launch via DuckyDeck Studio's background `evdev` listener.
  5. Click β–Ά Test Launch anytime to test the command immediately and inspect the result in the System Event Log (`APP_LAUNCH`).
Launch Application Builder
πŸš€ Launch Application Builder β€” Configure desktop apps (Dolphin, Google Chrome, VS Code, OBS Studio, Konsole, Blender, Spotify, GIMP) with APP keycap badges and instant USB HID host launching.

🌐 9. Web API / Webhook Builder & 🏠 Home Assistant Entity Search

πŸ’» Host-Dependent Feature β€” Requires DuckyDeck Studio Running
The duckyPad hardware does not have a network stack. Web API / Webhook keys and Home Assistant entity triggers require DuckyDeck Studio running on your host PC to receive the USB HID trigger and execute the HTTP request over your computer's network connection.

Trigger Home Assistant devices/entities, REST APIs, Miniflux, OBS, or custom HTTP endpoints directly from a duckyPad key:

  1. Select a key and click 🌐 Web API in the inspector toolbar (or open the full Web API / HTTP Webhook configurator window).
  2. 🏠 Search Home Assistant Devices & Entities:
    • Enter your Home Assistant URL (e.g. http://homeassistant.local:8123) and a Long-Lived Access Token (created in Home Assistant under Profile β†’ Security β†’ Long-Lived Access Tokens), then click Save HA Connection.
    • Select a domain filter (All Domains, light, switch, scene, script, automation, button, input_boolean, media_player, cover, fan, climate, lock), type a search query, and click πŸ” Search Entities.
    • Click ⚑ domain.service (or Turn On / Turn Off) next to any entity to automatically populate the HTTP POST endpoint (/api/services/<domain>/<service>), Authorization: Bearer header, JSON {"entity_id": "..."} body, and OLED feedback text for the selected key!
  3. Custom REST / Webhook Endpoints: Configure any HTTP Method (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`), URL, custom headers (`Header: Value` per line), and request body (JSON/text).
  4. Click Test Webhook Now to fire the HTTP request immediately and view status codes, latency, and errors in the System Event Log (`WEB_API`).
Web API Builder in OBS Studio Profile
🌐 Web API / Webhook Builder β€” Triggering a Home Assistant Studio Key Light REST service from Key 17 of the OBS Studio profile with RGB LED status feedback.

πŸͺŸ 10. KDE Plasma 6 Wayland Auto-Switcher & Floating OLED Desktop Widget

πŸ’» Host-Dependent Feature β€” Requires DuckyDeck Studio Running
Automatic window-based profile switching and the Floating OLED Desktop Widget require DuckyDeck Studio running on your KDE Plasma 6 host PC. When DuckyDeck Studio is closed, you can still switch profiles manually using the physical + / - buttons on the duckyPad.

DuckyDeck Studio features a native Rust + `zbus` listener that integrates with KDE Plasma 6's KWin Wayland compositor to automatically switch duckyPad hardware profiles when you focus different windows or browser tabs.

KWin Wayland Auto-Switcher Rules Dialog
πŸͺŸ KWin Wayland Auto-Switcher Rules β€” Map window classes and titles (Dolphin, Google Chrome, VS Code, OBS Studio, Konsole, Blender, Spotify) to hardware profiles with 1-click Window Picking.

πŸ”’ 11. Persistent Global Variables (`_GV0`..`_GV31`)

Open Variables (`_GV`)... from the `☰` menu to inspect and live-edit all 32 32-bit non-volatile Persistent Global Variables (`_GV0` through `_GV31`) over USB HID commands `0x18` (read) and `0x19` (write) in Signed Decimal, Unsigned Decimal, or Hexadecimal format.

Reserved Bridge PGVs (`_GV18`–`_GV20`)
DuckyDeck Studio uses _GV18 for instant Web API triggers, _GV19 for instant Application Launch triggers, and _GV20 for System Actions when using the default Silent USB HID Listener trigger mode.

✨ 12. AI Macro Architect

Click ✨ AI in the Right Inspector header (or AI Macro Architect... in the `☰` menu) to generate duckyScript 3 macros using natural language. DuckyDeck Studio grounds prompts with your local KDE shortcuts (`~/.config/kglobalshortcutsrc`) and validates the generated script with the built-in DSVM v2 compiler.

πŸ“‹ 13. System Event Log

Open System Event Log... from the `☰` menu (or from the About window) to view real-time diagnostic events across all subsystems:

Logs are also persisted on disk at ~/.local/share/duckydeck-studio/logs/system_events.log and can be filtered, copied, or exported to a `.log` file.

System Event Log Dialog
πŸ“‹ System Event Log β€” Live diagnostic log with category & severity pills, keyword search, clipboard copy, and `.log` file export.

βš™οΈ 14. Settings, HTTP REST API Server & Security Implications

⚠️ Security Implications of the HTTP REST API Server β€” Please Read Before Enabling

1. Full Hardware & Host Control: Any client that can reach the HTTP REST API can switch, create, modify, or delete profiles and key scripts, synchronize bytecode to the microSD card, inject DuckyScript keystroke/mouse macros onto the host PC, control RGB LEDs and the OLED display, and execute host actions (APP_LAUNCH, WEB_API, SYS_ACTION) configured on slots.
2. Network Exposure (127.0.0.1 vs 0.0.0.0): The default listen IP 127.0.0.1 (port 28491) restricts access strictly to local processes on your computer. Changing the listen IP to 0.0.0.0 or a LAN IP exposes an unencrypted plain-HTTP server to all devices on your local network.
3. Token Authentication & Remote Access: Keep Require Bearer Token Authentication enabled at all times (clients must send Authorization: Bearer <token> or X-API-Token: <token>). Treat your generated 160-bit ddk_... token like a password, and never expose the plain-HTTP port directly to the public internetβ€”use an HTTPS reverse proxy or SSH/WireGuard tunnel for remote access.

πŸ› οΈ 15. Troubleshooting & FAQ

❓ My Web API or Launch App key didn't trigger on the duckyPad

1. Ensure DuckyDeck Studio is running on your host PC (either open on screen or minimized to the system tray)β€”Launch App (`APP`) and Web API (`API`) actions are host-dependent and require DuckyDeck Studio's USB HID listener.
2. Check the bottom status barβ€”if it says ⚠ Unsynced Changes, click ⬆ Sync to SD so the compiled `.dsb` bytecode is written to the duckyPad's microSD card.
3. Open ☰ β†’ System Event Log and filter by WEB_API or APP_LAUNCH to see the exact trigger event (`_GV31` or `F13–F24`) and any HTTP or process errors.

❓ Auto-Switcher isn't switching profiles right now

Check if the Right Key Inspector is currently openβ€”Auto-Switcher intentionally pauses (`⏸ Paused (Editing Key N)`) while you are editing a key so your active profile doesn't jump away while you switch windows. Close the key editor (`βœ•`) to resume automatic switching.

πŸ™ 16. Special Thanks to dekuNukem & Official duckyPad Links

πŸ¦† Thank You to dekuNukem β€” Creator of duckyPad & duckyPad Pro
DuckyDeck Studio would not exist without the phenomenal open-source hardware, firmware, and DuckyScript 3 / DSVM v2 virtual machine created by dekuNukem (Allen Pan / dekuNukem). Thank you, dekuNukem, for creating the duckyPad and duckyPad Pro and making its documentation, HID protocol, and firmware completely open to the community!

πŸ¦† Official duckyPad & DuckyDeck Studio Websites

Explore official hardware specifications, getting started guides, DuckyScript 3 documentation, and firmware updates:

πŸ›’ Where to Buy β€” dekuNukem's Official Tindie Store

Order an official duckyPad Pro, hot-swappable mechanical macropad kits, rotary encoder modules, and expansion accessories directly from dekuNukem: