From unboxing to pushing your first macro — everything you need to know.
Buy one pre-assembled — R1,099 shipped in SA. You get the device in a 3D-printed enclosure, a USB-C cable, and the latest firmware pre-flashed. Available for free local pickup in Newcastle KZN.
Or build your own — source the parts and assemble it yourself:
Total DIY cost: ~R515 + your time. Assembly takes about 10 minutes — slide the CYD into the enclosure, plug in the USB, done.
If you bought a pre-assembled SudoDeck, the latest firmware is already installed — skip to step 3.
For DIY builds: your CYD comes with factory demo software. You need to replace it with SudoDeck by putting the board into flash mode:
Once flashed, the CYD boots into SudoDeck. The display shows a grid of buttons (default 4×3) and a status bar. Leave it plugged into USB — this provides both power and a serial data connection to the config tool.
The reset button (small hole) and USB-C port are on the back. The BOOT button is on the top edge inside the enclosure.
Go to ConfigureInstead of Bluetooth, you can use the CYD as a wired keyboard over USB. The CYD sends keystrokes over the serial connection, and a companion daemon (installed on your computer) injects them as if they came from a physical USB keyboard.
Choose this if your computer doesn't have Bluetooth, you want lower latency, or you prefer a single-cable setup.
You need the wired firmware variant on the CYD:
The daemon is a small background program that reads keystrokes from the CYD over USB and injects them into your OS.
Linux
# Download the latest release curl -L -o sudodeckd https://github.com/sudobreakstuff/sudodeck/releases/latest/download/sudodeckd-linux-amd64 chmod +x sudodeckd # Run it (stays open, Ctrl+C to stop) ./sudodeckd # Install as a systemd user service (auto-start on login) ./sudodeckd --install
Windows
# Run as Administrator (required for SendInput API) sudodeckd-windows-amd64.exe # Install as a Windows service (auto-start on boot, run as Administrator) sudodeckd-windows-amd64.exe --install
macOS
chmod +x sudodeckd-darwin-* # Run it (foreground) ./sudodeckd-darwin-* # Install as a LaunchAgent (auto-start on login) ./sudodeckd-darwin-* --install
macOS will ask for Accessibility permission on first run — grant it in System Settings → Privacy & Security → Accessibility. Without it, keystroke injection is blocked.
Device found: /dev/ttyUSB0 (SudoDeck) or similarYou can still use the config tool to edit buttons while the daemon is running. The tool automatically coordinates with the daemon:
127.0.0.1:8092. The config tool calls POST /release before connecting via Web Serial, and the daemon reconnects after the port is released. No manual intervention needed.Skip this step if you're using Wired Mode — wired and BLE are mutually exclusive. The CYD runs one firmware at a time.
The CYD announces itself as a Bluetooth keyboard. Pair it with your computer, phone, or tablet just like any other Bluetooth device.
Pairing is stored on both sides — you only need to do it once. The CYD will auto-reconnect whenever it's in range and powered on.
Once paired, every button press on the CYD sends the assigned action to the connected device — just like pressing keys on a keyboard.
Each button can be assigned one of six action types. Here's what they do and when to use them:
| Action | What it does | Example | Use case |
|---|---|---|---|
| Single Key | Presses and releases one key | ENTER, F5, MEDIA_PLAY_PAUSE |
Media controls, function keys, shortcuts like ESC |
| Key Combo | One or more modifiers + one key | CTRL+C, ALT+TAB, CTRL+SHIFT+ESC |
Keyboard shortcuts, app commands |
| Text String | Types a string of text character by character | hello@email.com |
Login details, canned responses, code snippets |
| Macro | A sequence of steps — each step can be a key, combo, text string, or delay | CTRL+ALT+T → wait 500ms → type htop → ENTER |
Complex multi-step workflows, automation sequences |
| App Launcher | Opens the OS search/run dialog, types the app name, and presses Enter | Windows → Calculator, macOS → Spotify |
Launch applications hands-free from your deck |
| Delay | Waits a specified time (1-10000ms) before the next action — primarily used inside macros | 500ms |
Waiting for apps to open, page transitions |
Use these exact key names in the config tool:
a through z, 0 through 9
F1 through F24
UP, DOWN, LEFT, RIGHT, PAGE_UP, PAGE_DOWN, HOME, END
ENTER, TAB, ESC, BACKSPACE, DELETE, INSERT, SPACE, CAPS_LOCK, PRINT_SCREEN
MEDIA_PLAY_PAUSE, MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_MUTE, MEDIA_VOLUME_UP, MEDIA_VOLUME_DOWN, MEDIA_STOP
BRIGHTNESS_UP, BRIGHTNESS_DOWN, LOCK_SCREEN
Available modifiers: CTRL, ALT, SHIFT, GUI (Windows key / Cmd), and combinations like CTRL_SHIFT, CTRL_ALT, CTRL_ALT_SHIFT, etc.
CTRL+SHIFT+ESC → delay 1000ms → ALT+T (focus details)The App Launcher uses the OS search function:
Windows → Win key → type app name → Enter
macOS → Cmd+Space (Spotlight) → type app name → Enter
Linux → Super key (GNOME/KDE) → type app name → Enter
Use the exact display name of the app (e.g. "Visual Studio Code" not "code"). The paired device must be at its desktop or home screen — the launcher types into the OS search, not an already-open dialog.
Your button layout is organised as a grid of pages. Each page has a configurable number of columns and rows, and each cell holds one button with a label, color, and action.
Found at the bottom of the config tool:
Click Apply Layout to resize. Existing button data is preserved — when you shrink the grid (e.g. 4×3 → 3×2), extra buttons remain in memory and reappear if you expand again. No content is lost.
The config tool supports exporting and importing your entire layout as a JSON file. The buttons are at the top of the config section:
.json file with your full layout (all pages, buttons, colors, actions, WiFi, and screensaver settings).json file back into the config tool. After importing, you must still click Write to send it to the deviceWhen idle, the CYD displays a screensaver. Three modes are built in:
Configure screensaver timeout, sleep timeout, and mode in the Screensaver section at the bottom of the config tool. Click Set to apply changes (then Write to save to the device).
Add one or more widget sources below the Screensaver section. Each widget has these fields:
| Field | What it does |
|---|---|
| Label | Name shown above the value on the CYD display |
| URL | Any JSON API endpoint (must return valid JSON, no custom auth headers supported) |
| Path | Dot-notation JSON path to extract the value, e.g. btc.usd or current_weather.temperature. Array access with [index] is supported |
| Format | Display template with {value} placeholder, e.g. ${value} or {value}°C |
| Interval | Seconds between data refreshes (30s minimum recommended, max 600s) |
Use the Test button on each widget to verify your URL and path before writing to the device. Widgets cycle every 10 seconds on the CYD display.
https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usdbitcoin.usd Format: ${value}
https://api.open-meteo.com/v1/forecast?latitude=-28.73&longitude=24.77¤t_weather=truecurrent_weather.temperature Format: {value}°C
Automations let you send keystrokes or sequences on a timer or schedule — no button press needed. Configure them in the app under the Automations panel.
Each automation runs one action (key, combo, text, delay, or app launch) — the same set of action types available for buttons.
WiFi is optional but required for live data features (F1 standings, custom widgets). The CYD uses the ESP32's built-in 2.4GHz WiFi.
Updating the firmware is the same process as the initial flash. The firmware tool on the Configure page handles everything.
The Backup Firmware button reads the entire 4MB flash and saves it as a .bin file. This captures both the firmware and your config. To restore it, use the Custom .bin option in the flash tool and select your backup file. This is useful if you want to revert to a previous firmware without re-configuring everything.
Two ways to reset the device to its default 3-page layout (Main, Media, Studio):
Method 1 — Config tool Reset button: Click the red Reset button in the config tool. If connected via WebSerial, it sends a factory reset command to the device (clears the config, resets screensaver settings). Then it reads the fresh default config back into the browser. If not connected, it resets the browser's config to defaults only.
Method 2 — Re-flash firmware: Flashing the firmware .bin at address 0 overwrites the entire flash including the SPIFFS config partition. This gives you a completely clean slate — fresh firmware, default config.
"Could not load firmware list" in the firmware tool
The firmware manifest file couldn't be loaded. Hard-refresh the page (Ctrl+F5 or Cmd+Shift+R) to clear the browser cache. If it persists, open the browser console (F12 > Console tab) and look for the specific error — usually a network or JSON parsing issue.
CYD not detected / serial port not showing up
BLE won't pair / "SudoDeck" not found in Bluetooth list
Config write fails: "IncompleteInput", "HTTP 404", or "oom"
Buttons don't do anything when pressed
Single Key → ENTER and see if it firesScreen is blank / won't turn on
WiFi won't connect / "W:connecting" stays forever
Touchscreen is inaccurate or unresponsive
Daemon not detecting the CYD
dialout group: sudo usermod -a -G dialout $USER — log out and back in/dev/uinput requires write permission: sudo usermod -a -G input $USERKeystrokes arrive doubled or not at all
Display shows garbled / corrupted graphics
| Limit | Value |
|---|---|
| Pages | 18 |
| Columns per page | 1–6 |
| Rows per page | 1–5 |
| Buttons per page | 30 (6×5 max) |
| Total buttons (all pages) | 540 (18 × 30) |
| Custom widgets | 8 max |
| Automations | 20 max |
| Component | Specification |
|---|---|
| SoC | ESP32-D0WD-V3, dual-core Xtensa LX6 @ 240MHz |
| SRAM | 520KB total (~320KB usable after system reserve) |
| Flash | 4MB SPI flash (2MB app + 2MB SPIFFS data) |
| Display | 2.8" TFT LCD, 320×240 pixels, ILI9341 driver, SPI |
| Dimensions | 8.5cm × 5cm × 3.3cm (with enclosure) |
| Touch | Resistive touchscreen, XPT2046 controller, SPI |
| Bluetooth | BLE 4.2 (Bluetooth Low Energy), HID keyboard profile |
| WiFi | 802.11 b/g/n, 2.4GHz only |
| USB | USB-C (USB 2.0 data + power, no alt-mode/PD) |
| USB-serial | CH340C or CP2102 (depending on CYD batch) |
| Power | 5V USB, ~200-300mA draw |
| Battery | None — USB power only. No charging circuit, no battery connector |
| MAC address | Unique per device (printed in firmware info response) |
| Limit | Value |
|---|---|
| Button label length | Truncated with "..." at display width (~12 chars on 4-col grid) |
| Macro steps | No hard limit — practical max ~50 before execution time becomes noticeable |
| Text string length | No hard limit — practical max ~200 chars per button |
| Delay range | 1–10000 milliseconds |
| Screensaver timeout | 5–600 seconds (configurable) |
| Sleep timeout | 0–600 seconds (0 = never sleep) |
| Serial buffer (v2.1.5+) | 131072 bytes (128KB) — enough for full config of all 18 pages |
| BLE range | ~10m open air |
| OS / Platform | BLE HID Support | Daemon (Wired) Support | Web Serial Support |
|---|---|---|---|
| Windows 10+ | Yes | Yes (SendInput) | Yes (Chrome/Edge) |
| macOS 11+ | Yes | Yes (CGEvent, needs Accessibility) | Yes (Chrome/Edge) |
| Linux (BlueZ) | Yes | Yes (/dev/uinput) | Yes (Chrome/Edge) |
| Android 8+ | Yes | No | Yes (Chrome) |
| iOS / iPadOS 13+ | Yes | No | No (Safari only, no Web Serial) |
| ChromeOS | Yes | No (Linux VM may work) | Yes |
firmware.ino:298. The web config tool also caps inputs — entering a value above the max is silently clamped. All limits are open-source and changeable in the source code if you need something different.