DEV Community

Fiza Naaz
Fiza Naaz

Posted on

Trail Notebook: Birding Offline with BirdNET and Gemma

Hacktoberfest: Maintainer Spotlight

Description

A local-first birding journal that turns trail recordings into BirdNET detections and AI-written notes, without uploading your audio.

Post Content

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.

What I Built

Trail Notebook is an offline field journal for people who want to remember the sounds of a walk without spending the walk looking at a screen.

The idea is simple: record birdsong while outside, put the phone away, and analyze the recording afterward. BirdNET identifies candidate bird calls. Then a local language model turns those detections into a short journal entry, saved as Markdown with a species table, confidence scores, and timestamps.

Demo

The video walkthrough is in the project README.

How It Works

  • BirdNET, through birdnetlib, analyzes the selected recording locally.
  • Ollama runs the journal-writing model locally. The default is gemma3:4b.
  • The prompt grounds the journal in the species BirdNET detected instead of asking the model to invent observations.
  • Recordings can be selected from a file picker, chosen from the Recordings folder, or passed in batches. Journals are saved as Markdown files named from their recordings.

Why Open Innovation Matters

Bird recordings and location details can be personal. Processing them locally means I don’t have to upload them to a service I don’t control. After setup, the workflow can run without an internet connection or per-request API charges.

Using an open-weight model also gives me control over the writing step: I can change the model or prompt without replacing the bird-detection pipeline. The model helps organize the results; it does not determine what was actually present.

Limitations

BirdNET can misidentify calls, especially in noisy recordings. Confidence scores are useful context, not proof, so detections should be checked against the recording and the generated journal should be reviewed. The built-in demo uses sample detections to show the output format; they are not real field observations.

Try It

The setup instructions and source code are in the GitHub repository. To try the sample journal:

python trail_notebook.py --demo --no-llm
Enter fullscreen mode Exit fullscreen mode

To choose a local recording:

python trail_notebook.py --browse
Enter fullscreen mode Exit fullscreen mode

Tags: devchallenge, hf26challenge

Top comments (1)

Collapse
 
ahmetozel profile image
Ahmet Özel •

Saving timestamps alongside the species table gives the journal a useful verification path. I would retain the underlying detection identifier with each generated observation, so editing the prose cannot detach a claim from the exact audio segment that prompted it.

A second field worth preserving is whether the recording was actually analysed or came from the built-in sample detections. That provenance should survive batch naming and model swaps, rather than relying on a reader remembering the demo flag. Overlapping calls are a useful fixture too: the journal should preserve competing candidates instead of smoothing them into one confident narrative.