DEV Community

Gaurav Kumar
Gaurav Kumar

Posted on

Field Notes: An Offline Birding Companion That Runs on a Laptop, No Signal Needed

What I Built

Field Notes is an offline-first birding companion. You record a short bird-sound clip on a walk, and it tells you which species it heard, writes a short field-journal entry about them, and adds any new species to your personal life list. There's also a weekly goal ("find 5 new species") that gives you a reason to go back outside.

Everything runs on my laptop. No internet, no accounts, no API keys.

I built it around one idea: the screen should be the shortest part of the experience. You record, you put the phone away, and you look up at the trees. The app only matters for a minute at the start and a minute at the end. Most of the time is spent outside.

It's for beginner birders, students, and anyone who has heard a bird and wondered what it was, especially in places where mobile signal is unreliable.

Demo

Youtube Demo Walkthrough - https://youtu.be/re4XDTRqrNE

Demo

Live Web App: https://pumps-sixth-plain-market.trycloudflare.com

Short walkthrough: Open the link on desktop or mobile, upload or record an audio clip (e.g. from the samples/ directory), hit Identify, see the bird cards (with "NEW" badges), read the local AI journal entry, and watch your life list and weekly goals update.

Field Notes Application Interface

Short walkthrough: record or upload a clip, hit Identify, see the bird cards (new species get a "NEW" badge), read the generated journal entry, and watch the life list and weekly goal update.

(You can also run it locally in under a minute with uvicorn main:app and test it in your browser with offline audio capture or local files.)

Code

title Field Notes
emoji 🌿
colorFrom green
colorTo emerald
sdk docker
app_port 7860

🌿 Field Notes: Offline-First Birding Companion

🎃 Hacktoberfest Open Source Contribution: Field Notes is an open-source project created for the DEV Hacktoberfest "Touch Grass" challenge. It demonstrates open-source AI at the core—running 100% offline and locally without cloud dependencies to encourage people to explore nature outdoors. Community contributions, new feature suggestions, and outdoor field tests are warmly welcomed!

Field Notes is an offline-first birding companion built for the DEV Hacktoberfest Touch Grass challenge. It uses open-source AI locally to minimize screen time outdoors: record or upload a bird call, identify the species locally with BirdNET, let a local LLM write a brief field-journal entry, and log new sightings to your personal life list and weekly goal tracker.

Built with a fast, lightweight FastAPI backend and a naturalist-styled, zero-dependency single-page frontend (static/index.html).


Features

  • Local…

The full code is open source on GitHub: saturn-16/FieldNotes

How I Built It

The whole pipeline is open source and runs locally:

BirdNET (open-source bird sound classifier by Cornell & Chemnitz) identifies species from audio using Google's LiteRT runtime on CPU. It includes optional latitude/longitude and week-of-year filtering to narrow results to species plausible for your place and season.
Ollama running llama3.2:3b turns the raw detections into a friendly field-journal entry, a fun fact per bird, and a "listen for this next time" tip.
FastAPI serves a clean local JSON API, and the frontend is a single static HTML page with vanilla JS and inline SVG. There are no CDNs, no external fonts, and no build step, so even the UI works completely offline.
SQLite stores the life list and weekly progress locally.

Design decisions that mattered:

The LLM can only describe what BirdNET detected. The prompt restricts it to the detection list, and I added an automated hallucination check that flags any species name in the journal that wasn't actually detected. A journal that invents a bird defeats the point.
The detector sits behind a clean interface (detect(audio, lat, lon, week, min_confidence)), so the model can be swapped without touching the rest of the app.
Empty results are handled honestly. If nothing is detected, it says so immediately instead of asking the LLM to make something up or wasting CPU/battery cycles.
Testing

I tested in two ways:

Lab benchmark. I ran the automated pipeline on 28 audio clips (7 species from xeno-canto, plus synthetic noisy at 10 dB SNR, quiet at -12 dB, and short 5-second variants):
Species found (any match): 14.3% (distinct calls like Asian Koel achieved 100% recall across clean, noisy, quiet, and short conditions)
Top-1 accuracy: 14.3%
Average false positives per clip: 0.86
Average runtime per clip: 8.85 s on an AMD Ryzen 5 5600H CPU (6 GB RAM)
Journal hallucinations flagged: 0 across tested Ollama entries (0.0% hallucination rate)
Real outdoor walks. I took the setup out for a morning walk around the local neighborhood park at 7:00 AM. Over a 40-minute walk, I recorded 3 real audio clips:

Clip 1 caught the loud, rising call of an Asian Koel perched in a neem tree canopy—detected accurately on the first attempt with 0.94 confidence.

Clip 2 picked up overlapping Common Myna calls near a lawn.

Clip 3 had distant traffic hum mixed with sparrows; the app filtered out the low-rumble noise cleanly.

 Interacting with the laptop/app took less than 2 minutes of the entire 40-minute walk. The rest of the time was spent looking up into the branches.

What I learned: Testing proved that high-pitched, piercing calls (like the Asian Koel) easily survive -12 dB attenuation and 10 dB SNR background noise. However, running detection without geographic coordinates causes BirdNET to match against all 6,000+ species worldwide, which can confuse generic chirps with distant global species—showing why location-aware filtering is so valuable. Most importantly, having an offline app that processes audio in 8 seconds meant I wasn't waiting on a loading spinner or checking social feeds while outdoors.

Why Does Open Innovation Matter?

This project only works because the pieces are open.

It works with no signal. The places where you hear the most birds are often the places with the worst connection. A cloud audio API or hosted LLM would simply stop working there.
Recordings and location stay on my device. Nothing is uploaded to a server I don't control. Sensitive location data about nesting or rare birds remains private.
It costs nothing to run. There are no API keys, no per-call fees, and no rate limits, so I could run hundreds of benchmark clips without thinking about a bill.
I can swap and change the models. I can try a different local LLM, change the journal's tone through the prompt, or replace the detector, because I control every layer. With a closed API, a model update could change my app's behavior overnight.
I can inspect and trust the pipeline. Because I can read how BirdNET and the model are used, I could add checks, like the hallucination flag, instead of hoping the output was right.

A closed approach would have been easier to wire up in an hour. It would also have been unusable on a trail.

My Agent Session

This project was built pair-programming with Antigravity, Google DeepMind's agentic AI coding assistant. The agent assisted in scaffolding the offline FastAPI backend, crafting the sunlight-optimized responsive UI, writing the 20-test pytest suite, and generating the automated xeno-canto robustness benchmark.

Top comments (0)