This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.
What I Built
A bird calls somewhere above you. A plant catches your eye. You take a photo, promise yourself you’ll identify it later, and eventually lose it among hundreds of other pictures.
I built Trail Whisperer to give those small discoveries somewhere to live.
It’s an offline-first trail companion and personal memory book for curious walkers, beginner birders, and anyone who wants to notice more outside.
The workflow is simple:
- Capture a plant or animal photo, or upload a short bird recording.
- Review the AI’s identification suggestion.
- Save the discovery with a trail name and optional notes.
- Keep exploring.
- Revisit your discoveries in your memory book at home.
The memory book includes a discovery timeline, species collection, trip summaries, and encounter statistics. At basecamp, you can search saved encounters by meaning and explore reference links about a species.
My design goal was to make the screen a brief stop during an outing: capture something interesting, save the moment, and return your attention to the world around you.
What “offline” means: a prepared laptop runs the backend and downloaded AI models. A phone connects to that laptop over local Wi-Fi. The network does not need upstream internet, but the laptop must remain reachable. The models do not run directly on the phone.
Demo
The video is an AI-assisted product showcase made using app screenshots.
The retained Squirrel and Kingfisher images are labeled demo photos, not verified trail observations. Species identifications are suggestions to review rather than confirmed sightings.
Trail Whisperer currently runs locally. There is no public hosted website.
After following the setup instructions, open http://localhost:8000 on your laptop, or access the laptop’s LAN address from your phone.
Get the code and follow the local setup instructions
I initially tried hosting basecamp on Render, but discontinued that deployment after encountering hosting costs. The current setup runs on my own machine, with optional connected services available at home.
Code
akshatshahh
/
trail-whisperer
Local-first trail companion with offline BirdNET and Gemma inference, a personal memory book, and optional online basecamp integrations.
Trail Whisperer
A trail ends. The wonder stays. An offline trail companion and a memory book for Hacktoberfest 2026 · Touch Grass.
Act I: listen to a bird or photograph a plant, save the discovery, put the phone away. Act II: at home, revisit a timeline, grow a lifelist, explore species field notes and search your own encounters.
Local application: http://localhost:8000 (after setup) · Source: GitHub · Evidence: VALIDATION.md
There is no public hosted website. GitHub hosts the source code; run the application on your own laptop. For offline trail use, open the laptop's LAN address on your phone as described below. Optional online integrations can run from a local basecamp service when connected.
Technologies and sponsor integrations
-
Gemma:
gemma3nfor trail Q&A, field notes and journal summaries;gemma3:4bfor vision. Ollama serves downloaded open-weight models locally on your laptop. No Google/Gemini API key is used. -
MongoDB Atlas:
sightings…
The repository includes the frontend, backend, model setup scripts, local startup instructions, and regression tests. Credentials, databases, and personal uploads are excluded from Git.
How I Built It
Trail Whisperer has two modes: trail and basecamp. Both can run locally.
On the trail
The React interface communicates with a FastAPI backend. Ollama serves downloaded Gemma models for questions, summaries, and field notes. Gemma 3 4B handles photographs, while BirdNET analyzes short bird recordings.
SQLite stores discoveries, and uploaded media stay in the local data directory.
The request path is:
Phone → local Wi-Fi → laptop → local models → local journal
One implementation detail mattered more than I expected: the installed Gemma 3n build exposed text completion but not vision. I used a separate local vision model for photographs instead of assuming one model could handle everything.
All model assets must be downloaded before leaving home. Identification and journaling then work without a remote inference API.
Back at basecamp
An explicit sync sends records and media to a second local service.
Basecamp uses SQLite without additional credentials, or MongoDB Atlas when configured. Atlas Vector Search uses locally generated nomic-embed-text embeddings to retrieve related encounters.
Optional connected features extend the journal:
- ElevenLabs transcribes saved voice notes through an authenticated basecamp endpoint. Local Gemma summarizes the transcript.
- SerpApi retrieves public species reference links and snippets for sourced field notes.
- Sentry Agent Tracing records model and research workflow timings and statuses, excluding prompts, recordings, location, and credentials from trace payloads.
These integrations remain disabled in trail mode. They require internet at basecamp; the core local workflow does not require their keys or paid web hosting.
What I tested
The latest verification passed 27 automated tests and the production frontend build.
Real-model checks identified a rose photograph and returned a Black-capped Chickadee candidate from a bird recording.
An offline regression blocked external backend network connections while photo identification, bird identification, local questions, saving, and retrieval continued working. Saved records and media survived a backend restart, and the application’s cloud-call counter remained at zero.
I also exercised the photo workflow in a mobile-width browser. That checks layout and browser behavior; it does not substitute for a physical phone-and-hotspot field test. The README includes the manual procedure for that check.
Atlas semantic search, the local ElevenLabs-to-Gemma pipeline, SerpApi research, and Sentry tracing were also exercised.
The tests establish these workflows. They do not establish identification accuracy for every species, photo, or recording.
Why Does Open Innovation Matter?
For Trail Whisperer, where inference runs determines whether the application can help when connectivity disappears.
Downloadable model weights and local inference let a prepared setup identify and journal discoveries without contacting a remote inference API. Photos, recordings, and notes remain on the trail machine until the user chooses to sync.
The modular implementation also gives me room to adapt it. I can replace a vision model, inspect uncertain outputs, change prompts, or improve the bird-recording pipeline without rebuilding the application around one hosted provider.
There are tradeoffs: advance downloads, CPU latency, and a laptop that must remain reachable. Gemma has its own model terms, and BirdNET weights have separate licensing requirements. Those constraints are documented in the repository.
What this approach made possible is a useful local workflow that I can run, inspect, and improve on hardware I control.
My Agent Session
I used Codex during development to help implement the application, troubleshoot deployment, and add regression coverage.
The repository’s incremental commits document the implementation, fixes, and validation work.
Prize Categories
I’m entering the categories for technologies meaningfully used in the current project:
- Best Use of Gemma: local photo identification, questions, summaries, and field notes.
- Best Use of MongoDB Atlas: optional basecamp journal storage and vector search over encounter embeddings.
- Best Use of ElevenLabs: basecamp voice-note transcription.
- Best Use of Sentry Agent Tracing: observability for model and research workflows.
- Best Use of SerpApi: species research with public reference links.
Trail Whisperer is built around a small interaction: notice something, learn a little, save the memory, and keep exploring.
Top comments (0)