This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
birdjournal is an offline bird-call field journal. You record birds on a walk with your phone, put the phone away, and listen. Later it names the species from sound and writes a short journal entry about the walk.
The screen is the shortest part of the experience: record, go outside, look up, and check the journal afterwards. It's for beginner birdwatchers and anyone who hears a bird and wants to know what it is, with or without a signal. It can write the journal in English, Hindi or Punjabi.
Demo
I tested it on a 46-second recording of a Coppersmith Barbet from Sikar, Rajasthan, taken from Xeno-canto (recordist: Dipendra Maharshi, XC123456, licensed CC BY-NC-SA 4.0; used unmodified as a test input, not redistributed). Real output:
Species heard: 1 Coppersmith Barbet x16 best 100% first at 0s BirdNET detected the barbet at 100% confidence in all 16 of its 3-second windows, with the location filter set to Sikar.
Outdoor test: I haven't done a full field walk yet. The next step is a sunrise recording near Patiala to see how it handles real background noise.
Code
🐦 birdjournal
An offline bird-call field journal. Record birds on a walk, put the phone away, and let open-source AI tell you who was singing, with no internet, no account and no cloud.
Built for the Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass.
$ python main.py barbet.wav --place "Sikar, Rajasthan" --lat 27.6 --lon 75.14 --out test.md Species heard: 1 Coppersmith Barbet x16 best 100% first at 0s How it works
phone recording (.wav/.mp3) | v BirdNET (open source) ---- geo filter (lat/lon) removes species that don't live nearby | v species list + confidence | v local LLM via Ollama (open weights) | v short field-journal entry (English / Hindi / Punjabi ...) The idea is that the screen is the shortest part of the experience. You go outside, record, and listen. The tool does its work afterwards.
Open-source pieces
Released under the MIT License.
How I Built It
- BirdNET is an open-source bird-sound classifier. I used its
litertbackend, so TensorFlow isn't needed and it can run on a Raspberry Pi. Its geo model takes your latitude and longitude and drops species that don't live near you. - An open-weight LLM through Ollama writes the journal. The default is Qwen2.5 3B, and
--modelswaps it for any other local model. - Python glue:
detector.pyruns BirdNET and groups detections by species,journal.pyprompts the local LLM, andmain.pyis the command-line tool. If Ollama isn't running, it still prints the species list and a plain summary.
What went wrong: My first prompt let the small model invent facts that weren't in the detections, such as calling the barbet "colorful and melodious" (its call is closer to a steady "tuk-tuk-tuk"). It also said "heard 16 times" when it meant 16 three-second windows. I tightened the prompt to three first-person sentences using only the listed facts.
I also ran the whole pipeline with Gemma 3 4B locally through Ollama, using the same code and one flag:
python main.py barbet.wav --place "Sikar, Rajasthan" --lat 27.6 --lon 75.14 --model gemma3:4b --out test_gemma.md My first Gemma run had two bugs: it wrote a literal "N" instead of a number, and it called a 100% detection "uncertain". I moved the confident/uncertain decision into code and tightened the prompt. The second run was clean, with one slip: it says "16 Coppersmith Barbets" when it means 16 three-second windows of audio. A 4B model can follow rules but still blurs this kind of detail, which is why I treat the journal as a rewrite of BirdNET's output and not as the source of truth.
Why Does Open Innovation Matter?
- Works with no signal. The models are about 77 MB and 46 MB, downloaded once and cached. After that, the trail needs no internet. A cloud bird-ID app can't do that.
- Your recordings stay on your machine. No audio is uploaded anywhere.
- Free to run. There are no per-call API fees, so you can record all morning without worrying about cost.
- I could fix it myself. When the journal model started making things up, I changed the prompt and could swap the model with one flag. With a closed API, I'd be stuck with whatever it gave me.
Limits: BirdNET is trained on more data from Europe and North America than South Asia, so expect misses. One loud, clean clip is an easy test, not a measure of accuracy. The journal only rewrites BirdNET's output, so check it against what you actually saw.
Prize Categories
Best Use of Gemma

