Avian Visitors - Teddy Warner
Skip to content
Initializing search
Birdnet [dot] local
Projects Feed
Avian Visitors
Teddy Warner
| May 2026<br>| 9–11 mins
I was initally planning on leaving this as a ‘true’ personal project of sorts. I love a good project writeup of course, but frankly I thought this was too quick an afternoon project to warrant any more documentation than a tweet. Twitter thought otherwise …
i mounted a tiny microphone on my apartment balcony to listen for any birds passing by and built a site to collage them as they're heard pic.twitter.com/85KrLRL5tu<br>— Teddy (@WarnerTeddy) May 28, 2026
i mounted a tiny microphone on my apartment balcony to listen for any birds passing by and built a site to collage them as they're heard pic.twitter.com/85KrLRL5tu<br>— Teddy (@WarnerTeddy) May 28, 2026
… so I’ve thrown together this short writeup for any of you who want to monitor any avian visitors that may be passing by your own place. It’s short and sweet for now in an attempt to get something out quickly, but this work is part of a longer chain of bird-tangent projects i’ll write something up about soon!
Apartment Birds¶
Avian Visitors is a fork of BirdNET-Pi with a kachō-e collage overlay on top of it. BirdNET-Pi handles the audio capture and the species identification, running Cornell’s BirdNET acoustic classifier against whatever a USB mic on the Pi picks up.
See it running at bird.onethreenine.net:
BOM¶
Building a bird tracking station of your own is easy enough. The full project repo is at github.com/Twarner491/AvianVisitors. Here’s all you need:
Qty<br>Description<br>Price<br>Link
Raspberry Pi (4B / 5 / Zero 2W)<br>~$35-80<br>Raspberry Pi
Micro SD Card (≥32 GB)<br>~$10<br>Amazon
USB lavalier microphone<br>$16.95<br>Amazon
Pi power supply<br>~$10
Total<br>~$80
Show all 5 itemsCollapse
While you’re at it, grab a Gemini API key to restyle illustrations (free-tier is fine), an eBird API key to filter species by region.
Birdnet [dot] local¶
Flash the SD card with Raspberry Pi Imager. Pick Raspberry Pi OS Lite (64-bit). In the customisation dialog set:
Username
WiFi SSID + password
Hostname: birdnet
Enable SSH with password auth
Plug the USB mic into the Pi and place it in a window or mount it outside. I stuck mine to the screen of a small window facing towards my balcony, keeping the Pi inside and away from the elements. Then boot! Once the Pi’s up on your network, SSH in and run the installer:
ssh @birdnet.local<br>curl -s https://raw.githubusercontent.com/Twarner491/AvianVisitors/avian-visitors/newinstaller.sh | bash
This clones the fork, runs BirdNET-Pi’s installer (audio capture, model, web UI, all the things), symlinks the AvianVisitors overlay into the Caddy web root, and reboots itself once everything’s in place. The whole thing takes 20-40 minutes depending on your Pi model and Wi-Fi speed, and when the Pi comes back up, the collage lives at http://birdnet.local/ with the stock BirdNET-Pi UI still reachable at http://birdnet.local/index.php. The menu drawer in the top right opens an admin overlay with native settings, system, log, and tool panels that hit a small JSON facade on the Pi, so you can tune the analyzer, watch services, and tail logs without leaving the collage.
Forward off your LAN (Optional)<br>The default install keeps everything on your LAN, but avian/forwarding/ has three potential alternatives:
Cloudflare Tunnel
This gives you a public HTTPS URL with no port forwarding and no exposed home IP, which is what I’m using for bird.onethreenine.net. Needs a free Cloudflare account and ~5 minutes to set up. Start by installing cloudflared on the Pi:
sudo apt install -y lsb-release<br>curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \<br>| sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null<br>echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" \<br>| sudo tee /etc/apt/sources.list.d/cloudflared.list<br>sudo apt update && sudo apt install -y cloudflared
Then authenticate and create the tunnel, pointing it at a hostname on a domain you own:
cloudflared tunnel login<br>cloudflared tunnel create birds<br>cloudflared tunnel route dns birds birds.your-domain.com
Drop the bundled config into place, point the tunnel: field at the UUID cloudflared tunnel create printed back, then install + start the service:
sudo cp ~/BirdNET-Pi/avian/forwarding/cloudflared.yml /etc/cloudflared/config.yml<br>sudo nano /etc/cloudflared/config.yml<br>sudo cloudflared service install<br>sudo systemctl restart cloudflared
To add a password gate on the public URL, set up Cloudflare Access (free tier covers up to 50 users) and add a policy on the hostname. If you’d rather use HTTP Basic auth via Caddy itself, the caddy-auth.caddy snippet has a working example.
Home Assistant REST sensor
This surfaces the most-recent detection as sensor.latest_bird in Home...