In this post, I walk through B.L.O.O.M. (Bridging Local Observations, Openly Mapped), an offline cyberdeck built on the Arduino UNO Q that helps naturalists capture field notes, identify birdsong with Edge Impulse, and generate vintage field sketches with Cloudinary's image generation API. It stores everything locally and syncs to a community site only when you choose.
##What you'll learn How to wire an Arduino UNO Q cyberdeck with a USB hub, camera, mic and HDMI screen How to run a local Gemma LLM and an audio classifier with Arduino App Lab bricks How to retrain an Edge Impulse birdsong model with balanced data How to sync SQLite entries to GitHub pull requests from a Netlify Function How to generate style-matched images with Cloudinary's imagetoimage API with reference images
Cyberdecks are back. The 80s sci-fi dream of a portable, hackable computer rig has been picked back up, especially by nature-loving corners of the internet that want tech that works offline, respects privacy, and looks cool doing it. The one I built for this project lives in a $10 vintage makeup train case and creates Grinnell style field notes as you tiptoe through the tulips.
This post covers the hardware-to-cloud pipeline, with the most detail on the part where Cloudinary comes in. The full build (wiring, enclosure, every step) is on Hackster.
Nothing leaves the device unless you press Sync to Cloud. That was a hard requirement, as this project is affiliated as well with the nonprofit I founded, Her AI Studio, where we talk a lot about data governance, security, and privacy, working primarily with local AI on device.
Hardware: the Arduino UNO Q parts list Arduino UNO Q (4 GB) 5" HDMI screen + 6" HDMI cable USB 5-in-1 hub USB camera USB microphone Power bank + USB-A to Micro-USB cable Bluetooth keyboard with built-in mouse pad Vintage train case (or the enclosure you like best! This is the fun part)
The Arduino UNO Q runs everything. The 4 GB variant can run a small language model and an audio classifier fully offline, which is what makes the device useful on a forest trail with no signal...and to explore offline, local AI models on hardware!
Because it's a cyberdeck, there are peripherals, and those are all connected to the USB hub: screen, mic, camera and power go into the hub, and the hub's USB-C plug goes into the UNO Q. Pair the keyboard and mouse over Bluetooth in Debian and you get those USB ports back.
The app is built in Arduino App Lab from three "bricks", which are modular code available pre-built for the Arduino Uno Q: Web UI for the interface with camera and sketching interface LLM brick running Gemma, downloaded locally to the board Audio Classification brick for birdsong
The Web UI brick helps you build a tidy interface with a little JS and HTML that runs on your local board via Arduino App Lab. This is how you write your field notes. The LLM brick creates a little space to chat with an LLM and learn more about the flora and fauna photos that you take with the build-in camera.
Side Quest: Fixing Chromium popups on Debian with a kiosk brick On Debian, the stock Web UI brick opened Chromium popups behind other windows. It worked fine on desktop but not on the device. I fixed it with a small custom brick that waits for the local server and then launches Chromium in kiosk mode:
The interface is presented full-screen without desktop chrome, so the screen is just the field notebook, like this:
I wanted to give my cyberdeck some "ears", so I turned to a platform that works well to add local, custom-trained models to Arduino via App Lab: Edge Impulse.
I started from a birdsong classifier in the Edge Impulse community gallery. It had class imbalance and too few samples, so I: Duplicated the project and removed unusable clips Pulled at least 20 recordings each of Blue Jay, Mourning Dove and Northern Cardinal from xeno-canto, a birdsong database Converted everything to WAV, labeled it, and uploaded it Rebalanced the train/test split and retrained Dropped the new model into the App Lab project
When your USB microphone picks up a bird singing, you tap a button, the model classifies the audio, and the result is saved into a field note. The model is public and cloneable if you want to add your local species.
Every observation is stored in a local SQLite database, but maybe you want to showcase your field notes to our public repository. When you choose to share, the device posts the entry to a Netlify Function. Photos and sketches are base64-encoded so the whole entry travels as one JSON payload:
This process makes it easier for the community site to get human moderation: a maintainer reviews the PR, merges it, and Netlify rebuilds the Astro site. You can see the results at community-field-notes.netlify.app.
Generating AI field sketches with Cloudinary's imagetoimage API Naturalists in the Grinnell tradition paired written notes with drawings. I wanted every synced note to come with an illustration in that vintage style, even if the person who wrote it can't draw.
