Make a cheap but powerful USB Rubber Ducky with a Raspberry Pi Pico
A desktop GUI for flashing pico-ducky on Linux.
Plug in your Pico, hit Start Flash, and it does the rest — wipes, flashes CircuitPython, copies all the files, arms your payload.
No manual steps.
GUI rewrite of pico-flash, originally a bash script. Same workflow, proper interface.
Flashing a Pico for pico-ducky manually means: holding BOOTSEL, copying a nuke file, waiting for remount, copying CircuitPython, waiting again, copying lib files and scripts, then arming a payload. Every time.
pico-flash-gui automates all of it. On first run it downloads every dependency automatically. After that, plug in and flash.
Flash Mode — full wipe and reflash across 5 steps:
- Detect Pico in BOOTSEL mode
- Wipe flash with
flash_nuke.uf2 - Flash CircuitPython firmware (latest stable, auto-fetched)
- Copy pico-ducky project files and Adafruit libraries
- Pick and arm a
.ddpayload — or skip
Setup Mode — manage an already-flashed Pico without wiping it. Bridge GP0 to GND before plugging in to suppress payload execution, then:
- Swap the armed payload
- Download any file off the Pico
- Eject safely
- Trigger a full reflash
The app polls for device status every 2 seconds and shows a live indicator in the sidebar — BOOTSEL, CIRCUITPY, or nothing detected.
Supports: Pico, Pico W, Pico 2, Pico 2 W
# Ubuntu/Debian
sudo apt install nodejs npm unzip
# Arch
sudo pacman -S nodejs npm unzip
# Fedora
sudo dnf install nodejs npm unzipgit clone https://github.com/Umbra-Domini/pico-flash-gui.git
cd pico-flash-gui
npm install
npm startYou may see deprecation warnings during
npm install— these are from electron-builder's dependencies and are harmless. The app is not affected.
The first time you open the app it runs a setup wizard before anything else.
Step 1 — Disclaimer Read and check the box, then click Accept & Continue.
Step 2 — Board & Wi-Fi Pick your Pico variant from the dropdown (Pico, Pico W, Pico 2, or Pico 2 W). If you picked a W variant, enter the SSID and password the Pico will broadcast as a Wi-Fi access point. You can hit Generate for a random password. Click Download & Continue.
Step 3 — Download The app automatically downloads everything it needs:
flash_nuke.uf2— used to wipe the Pico- CircuitPython firmware — latest stable for your board
- pico-ducky source files
- Required Adafruit libraries
This only happens once. Everything is cached and reused after that.
Step 4 — Done Click Open pico-flash to go to the main app.
This is the main screen. It does a full wipe and reflash of your Pico in 5 steps — all automatic except for plugging in the device.
- Click Start Flash
- Hold the BOOTSEL button on your Pico and plug it into USB — then let go
- The app detects it and takes over. Watch the steps tick off:
- 01 Pico detected in BOOTSEL mode
- 02 Flash wiped
- 03 CircuitPython installed
- 04 pico-ducky files copied
- 05 Payload selection
- At step 5 a popup appears — pick a
.ddpayload to arm, or click Skip to leave it empty - The Pico is ejected automatically. Unplug it when done
⚠️ If you armed a payload, do not plug the Pico back into your own machine — it will execute the payload immediately as if it were a keyboard.
Use this when your Pico is already flashed and you want to manage it without wiping it — swap a payload, grab a file off it, or eject it safely.
To enter setup mode, you need to suppress payload execution first — otherwise the Pico will run the payload the moment it's plugged in.
How to enter setup mode:
- Unplug your Pico
- Bridge GP0 to GND with a jumper wire (or a piece of wire) — this tells the Pico not to run the payload
- Plug it in
- Click Setup Mode in the sidebar — the app detects the CIRCUITPY drive and shows four action cards
What you can do:
- Swap Payload — replace the active payload with a different
.ddfile from your library - Download File — pull any file off the Pico and save it to your computer
- Eject — safely unmount the Pico before unplugging
- Full Reflash — wipe everything and go back through Flash Mode
The Payloads panel is where you manage your .dd DuckyScript files.
- Import — pick any
.ddor.txtfile from your computer. It gets copied into the app's payload library (.txtfiles are renamed to.ddautomatically) - Create — opens a text editor inside the app. Give it a name, write your DuckyScript, hit Save
- Edit — opens an existing payload in the editor
- Delete — removes the payload from the library
Payloads are stored locally and are not affected by Reconfigure or reflashing.
You can update the Wi-Fi credentials on an already-flashed Pico W without reflashing it.
- Put the Pico in setup mode (bridge GP0 to GND, plug in)
- Click Wi-Fi Settings in the sidebar
- Enter the new SSID and password, click Save
The new credentials are written directly to the Pico.
Click Reconfigure in the sidebar if you want to switch boards or redownload everything from scratch. It wipes the downloaded files and config and takes you back to the setup wizard. Your .dd payload files are not touched.
Payloads are DuckyScript files with a .dd extension. pico-ducky supports DuckyScript 1.0 with partial 3.0 support.
This tool is intended for use on devices you own. You are solely responsible for how it is used. The author assumes no liability for misuse.
- dbisu/pico-ducky — the pico-ducky project this tool is built around
- Adafruit CircuitPython — firmware and libraries
- Raspberry Pi — Pico hardware




