# Eyes Up: an offline bird-call companion that wants you to put the phone away

> Source: <https://dev.to/kishore_p_e1fbd59e95a81f6/eyes-up-an-offline-bird-call-companion-that-wants-you-to-put-the-phone-away-4n64>
> Published: 2026-10-06 18:41:06+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass](https://dev.to/challenges/hacktoberfest-week1-2026-10-05)*

I love birding, but I despise modern birding apps.

The moment you open most wildlife apps on a trail, they demand your full visual attention. You get feeds, social leaderboards, uncompressed photo galleries, and notifications begging you to log into an account. Before you know it, you're standing under a 100-year-old oak tree staring at blue light instead of looking up at the bird singing directly above you.

I built **Eyes Up** to solve that problem. It is an offline, privacy-first bird-call companion built specifically for the "Touch Grass" challenge.

The entire interface is designed around a single constraint: **the screen should be the shortest part of the experience.**

You tap one big button—"Record (30s)"—and drop your phone into your jacket pocket. The app records the acoustic environment, runs Cornell's BirdNET classifier locally on your device's CPU, prompts an on-device Gemma 2 model via Ollama to generate a strictly grounded two-sentence field tip, and speaks the result aloud via Text-to-Speech:

*"Heard American Robin, 91% match. New species! Look for a warm brick-red breast on lawns and listen for a cheerful caroling song."*

Then it dims the screen to pitch black.

There is no infinite scroll. There are no friend feeds. There is only a single result card, an offline life list, and a **Touch Grass Score** that tracks how many minutes you spent outdoors versus how many minutes you spent looking at the glass.

Here is the one-screen workflow in action:

`#0b0f12`) optimized for sunlight visibility. A single 130px record button and a Touch Grass ratio meter.
The complete source code is open-source under the MIT license:

To run it locally in one command:

```
git clone https://github.com/kishorekrrish3/Eyes-Up.git
cd Eyes-Up
python -m venv .venv
source .venv/bin/activate  # On Windows: .\.venv\Scripts\activate
pip install -r requirements.txt
python run.py
```

I kept the stack lean, fast, and completely free of cloud subscriptions.

Mobile browsers record audio in WebM/Opus (Android) or AAC/MP4 (iOS). Decoding those on a lightweight local server usually requires dragging in heavy `ffmpeg` binaries. Instead, I wrote a 40-line client-side audio encoder in `app/static/app.js` using the Web Audio API. The phone samples the raw Float32 microphone data and compiles an uncompressed 16-bit PCM WAV directly in browser memory before uploading. It works identically across mobile Safari and mobile Chrome with zero server codec friction.

For acoustic classification, Eyes Up uses the official BirdNET V2.4 model (`BirdNET_GLOBAL_6K_V2.4_Model_FP32.tflite`).

I used Gemma 2 (2B) through Ollama (`http://localhost:11434`) with strict bounding instructions:

The backend logs outings in a local SQLite database (`data/eyes_up.db`). While an outing is active, the frontend monitors the browser `document.visibilityState`. If your phone screen is on, screen seconds accumulate. If the phone is locked or in your pocket, screen time stops while outdoor outing time ticks forward.

If you spent 45 minutes walking through the woods and only looked at your phone for 2 minutes to confirm two sightings, your score is **22.5x (96% Eyes Up)**.

During this build, the contrast between open-source edge AI and proprietary closed cloud APIs could not have been starker.

`.env` (`OLLAMA_MODEL=gemma2:9b`). No vendor lock-in.
*View interactive session transcript on DEV:* [Eyes Up: Building an Offline Bird-Call Companion with BirdNET & Gemma](https://dev.to/agent_sessions/eyes-up-building-an-offline-bird-call-companion-with-birdnet-gemma-dmbxhi)

I built Eyes Up using the **Antigravity** coding assistant.

The agentic pairing workflow excelled at eliminating the boilerplate that usually slows down hackathons:

`tflite-runtime` wheels were missing for Windows, the agent diagnosed the dependency tree and wired Google's modern `ai-edge-litert` package as a clean, transparent shim for `birdnetlib`.` ffmpeg` installations, the agent implemented the browser PCM WAV encoder from first principles, ensuring portable mobile recording.`app/tts_service.py` for users desiring hyper-realistic cloud voices, but the app defaults to 100% offline local TTS to honor the Touch Grass ethos.
