DEV Community

Cover image for I Got Tired of Flashing My Pico Manually, So I Built a GUI
Manraaj Singh
Manraaj Singh

Posted on

I Got Tired of Flashing My Pico Manually, So I Built a GUI

If you've ever set up a pico-ducky — a Raspberry Pi Pico turned into a USB Rubber Ducky — you know the process. Hold BOOTSEL, plug in, copy a nuke file, wait for it to remount, copy CircuitPython, wait again, copy all the project files and libraries, then arm a payload. Every. Single. Time.

It's not hard. It's just annoying.

I was doing this enough that I wrote a bash script to automate it. That helped. But then I started wanting a payload manager, a built-in editor, a live device indicator — and at that point a bash script wasn't cutting it anymore. So I rewrote the whole thing as a desktop app.

That's pico-flash-gui.


What it does

First-time Setup

It's an Electron app for Linux that automates the full pico-ducky flash workflow. You click Start Flash, hold BOOTSEL on your Pico and plug it in, and the app takes over:

  1. Detects the Pico in BOOTSEL mode
  2. Wipes the flash with flash_nuke.uf2
  3. Flashes the latest stable CircuitPython for your board
  4. Copies all pico-ducky project files and Adafruit libraries
  5. Asks you to pick a payload to arm — or skip

The whole thing runs unattended. You don't touch anything between steps 2 and 5.

On first launch it also downloads every dependency automatically — CircuitPython firmware, pico-ducky source files, Adafruit libraries. Everything is cached so subsequent flashes are instant.

Automatic Dependency Download

Supports Pico, Pico W, Pico 2, and Pico 2 W.


Setup Mode

Flash Mode is for when you want to wipe and reflash. But sometimes you just want to swap the armed payload, or grab a file off the device without nuking it.

That's what Setup Mode is for. Bridge GP0 to GND before plugging in (this suppresses payload execution so the Pico mounts as a normal drive), and the app detects the CIRCUITPY volume and gives you four options:

Flash Mode

  • Swap Payload — replace the active .dd file
  • Download File — pull any file off the Pico to your computer
  • Eject — safely unmount before unplugging
  • Full Reflash — go back through Flash Mode

Payload management

Payload Management

There's a full payload panel built into the app. You can import .dd or .txt files, write payloads from scratch in a built-in editor, edit existing ones, and delete them. The armed payload is tracked across sessions.

Payload Editor

For Pico W boards there's also a Wi-Fi settings panel — you can update the SSID and password on an already-flashed device without reflashing it.


How it's built

It's Electron with plain HTML/CSS/JS — no frontend framework. The backend (main process) handles all the hardware interaction: file copies, shell commands for mounting/unmounting, polling for device status every 2 seconds.

The Electron security setup is done properly — contextIsolation: true, nodeIntegration: false, and a contextBridge preload that only exposes specific named functions to the renderer. No raw IPC access from the frontend.

One thing I'm reasonably happy with is how clean the flash sequence ended up. The flasher waits for mounts and unmounts using a polling loop rather than arbitrary timeouts, so it actually adapts to how long the hardware takes rather than just hoping a fixed delay is long enough.


Try it

git clone https://github.com/Umbra-Domini/pico-flash-gui.git
cd pico-flash-gui
npm install
npm start
Enter fullscreen mode Exit fullscreen mode

Requires Linux, Node.js v18+, and unzip. Tested on Ubuntu 22.04 and 24.04.

An AppImage build is coming soon so you won't need Node at all.

This tool is for use on devices you own.

GitHub: Umbra-Domini/pico-flash-gui


Built because I was tired of doing it by hand. Happy to hear feedback or answer questions in the comments.

Top comments (0)