Posted in

I built a clipboard server on the Arduino Uno Q, and it replaced a workflow I…

The topic I built a clipboard server on the Arduino Uno Q, and it replaced a workflow I… is currently the subject of lively discussion — readers and analysts are keeping a close eye on developments.

This is taking place in a dynamic environment: companies’ decisions and competitors’ reactions can quickly change the picture.

If you work across multiple devices, you’ve almost certainly emailed yourself a link, pasted something into a notes app just to open it on another machine, or maybe even typed out a URL by hand because you couldn’t be bothered to find a better way. Clipboard sync between devices is a largely solved problem by now, but sometimes it’s nice to just have a simple way to quickly and easily copy text between two devices without any additional software. Sure, Apple has Universal Clipboard, Windows has its own clipboard sync, and third-party tools like ClipCascade let you self-host something, but none of them felt right for the level of simplicity that I wanted

I’ve been spending a lot of time with the Arduino Uno Q just to have a bit of fun. I’ve talked about what makes it such a weird and interesting board, and I also turned it into a Bluetooth streaming server for my speakers. This time, I wanted to try something more practical: a network-attached clipboard that any device on my local network could push to and pull from, no cloud involved.

The result is a small Flask app I’m calling ClipDrop, and it ended up being one of the most genuinely useful things I’ve built on the Uno Q so far. It’s basic and simple, but it does exactly what I want it to.

The Arduino Uno Q’s dual-processor setup is what makes a project like this possible in the first place. The Qualcomm QRB2210 side runs Debian Linux, so you can run a full Python web server on it. The STM32U585 microcontroller handles real-time tasks and has direct access to the onboard hardware, including the 8×13 LED matrix. The two sides talk to each other through what Arduino calls the Bridge, and that’s what holds ClipDrop together.

Arduino’s official way to build and deploy apps to the Uno Q is through App Lab, a rather simple IDE that handles both the Python and C++ sides. It works, and for a lot of projects it’s fine, but plugging the Uno Q into a dock and using it with a display is slow. The whole desktop experience is quite painful, which makes sense, as Arduino recommends using the 4GB RAM variant for desktop usage. As a result, I ended up doing most of the development and deployment over SSH instead. I just use SCP to copy the project folder onto the board, SSH in, and use the arduino-app-cli to start and stop the app from the terminal. It’s faster, more predictable, and honestly just more comfortable if you’re used to working in a terminal anyway.

The project structure itself follows the same pattern as Arduino’s own example apps. If you look at the official examples on GitHub, like the blink demo in Arduino’s app-bricks-examples repo, you’ll see the same layout: an app.yaml manifest, a python/ folder with a main.py for the Linux side, and a sketch/ folder with a .ino file for the STM32. ClipDrop follows that structure exactly, just with a Flask server and a web UI bolted on top of it. Having that template to work from made the initial setup a lot easier, because the Bridge wiring between Python and the sketch is quite an abstract concept.

ClipDrop is a Flask server that serves a single-page web app. You open it in a browser on any device connected to your network, and you get a text box and a file drop zone. Paste some text, hit “Push,” and it’s stored on the Uno Q. Pick up your phone, open the same page, and the text is there. You can also drag and drop files up to 50 MB, download them from another device, and delete them when you’re done. It’s not doing anything particularly clever on the software side, and that’s kind of the point. The Flask server handles the API, a single HTML file handles the UI, and the Bridge connects it all to the STM32 for a bit of physical feedback.

That physical feedback is my favorite part of the whole thing. Whenever you push text to the clipboard, the LED matrix flashes a “C” for three seconds. Upload a file, and it flashes an “F” instead. It turns what would otherwise be a completely invisible network service into something you can actually see working. The STM32 sketch defines those letter shapes as bit arrays and uses the Bridge to listen for calls from the Python side. When the Flask server receives new data, it calls a function to flash the clipboard or file image. It’s simple, but it’s neat to see on my desk when I’m using it.

I didn’t build ClipDrop expecting it to become part of my daily routine, but here we are. I’ll copy a URL on my laptop, push it to ClipDrop, and pull it on my phone when I’m heading out. I’ll find an interesting piece of information on my phone while reading something online, push it to ClipDrop, and pull it up on my desktop when I sit back down. The file transfer is handy too, especially for moving screenshots or small documents between computers without hunting for a cable or opening yet another app. PairDrop somewhat works for this, but this tool removes any barriers that remained.

Of course, in a production context, this isn’t necessarily the most useful application. There’s no authentication, so anyone on your network can read and write to it. The text clipboard lives in memory and resets when the app restarts, so it’s not persistent storage. Also, there’s no encryption, no versioning, and no conflict resolution. If two people push text at the same time, the last one wins.

For my use case, none of that matters. This runs on my home network behind my router’s firewall. I’m the only one using it, and I don’t need clipboard history or encrypted channels for the kinds of things I’m copying; links, text snippets, the occasional config file, and the like. If you wanted to make it more secure, you could add basic authentication to the Flask routes or put it behind a reverse proxy, but that felt like overengineering for a clipboard on a microcontroller.

The 50 MB file size limit is there as a safety net for the Uno Q’s limited storage, but in practice, I’ve never come close to hitting it. Most of what I transfer is text or small files. If you need to move large files between machines, there are better tools for that. ClipDrop is for the small everyday transfers that you’d otherwise solve by emailing yourself or dropping a link in a chat app just so you can tap it on another device. This is also what makes it more powerful than an ESP32 used for the same purpose: for most ESP32 devices, you can’t store a 50MB file.

I started ClipDrop off as a silly project to get some use out of the Arduino Uno Q, but I’ve actually left it running over the past week, and I’ve been using it more than I thought I would. Is it a niche use case? For sure, but I’m getting some surprising value out of it. If you want to give it a try, I’ve published it over on GitHub.