Introduction
Tucson has more birds than you’d expect—practically overrun with them. Luckily, I love birds.
For months, I sat in the backyard with my iPhone using the Merlin Bird ID app to identify whatever I could spot. That could’ve been the end of it.
But I’m a software engineer, so naturally I turned it into a 24/7 system with observability and a web interface. Let’s dig in.
The Ingredients
Power
You’ll need some sort of solar and battery setup. In my case, I have an Enphase SolarI’ve been really happy with our Enphase system. We purchased it with our house and when I went to set up our account, Enphase informed me there’s a $200 setup fee. After writing to the CEO, I got a call from an executive VP who waived the fee. Pretty wild customer service. system that powers the whole houseYou don’t need to power your entire house. A small solar panel, inverter, and battery setup could handle just the compute, though you’d likely want a lower-power machine like a Raspberry Pi.. Tucson’s intense sunlight makes this an easy win.
Compute
For compute, I’m using an M1 Mac Mini I had lying around. It’s quiet, powerful, and relatively efficient. It runs Docker and hosts a BirdNET-GoBirdNET-Go is a Go application for running a robust bird identification model locally. As a contributor, I can vouch for its readability and architecture. container that processes audio and identifies species.
Microphone
In an ideal world, I’d use a sexy dedicated field recorder—something like a Sony PCM-D100—for high-fidelity audio. Instead, I’m using an RTSP stream from a UniFi security camera. It’s not perfect, but it works.
Networking
To expose BirdNET-Go endpoints to the internet, I’m using a Cloudflare TunnelCloudflare Tunnel lets you securely expose local services through Cloudflare’s edge network. It’s a great tool—once you get past the somewhat confusing dashboard. that proxies requests to a Caddy instance running on the Mac Mini.
That’s the core setup. If you’re more visual, here’s a diagram:
For some, this would be enough, especially considering BirdNET-Go integrates into BirdWeather out of the box. Not for me—I wanted a custom interface to explore the data in a way that felt fun.
Dashboard

The dashboard is publicly available at birds.alec.is.
It includes, all in real time:
- Weather
- Audio level meter
- Spectrogram player
- Species photos
- Species notes
- Top sightings
- Recent sightings
- Particle system
- Auto playAutomatically plays the most recently identified bird call. I considered calling this ‘cat mode’—our cat is a big fan.
Using the proxied /api/v2/** endpoints, I built a dashboard that’s both functional and enjoyable to use. It’s just plain HTML, CSS, and JavaScript—nothing fancy. If I add one more feature, though, I’ll probably rewrite it in Vue 3.
Wrapping Up
That’s the project. I’m happy with how it turned out—and so is our cat.
I like to keep the dashboard open while I work, listening to the birds in the background. It’s already made me much better at identifying them.