cd /news/artificial-intelligence/eyes-up-an-offline-bird-call-compani… · home › topics › artificial-intelligence › article
[ARTICLE · art-146270] src=dev.to ↗ pub= topic=artificial-intelligence verified=true sentiment=↑ positive

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

A developer built Eyes Up, an offline, privacy-first bird-call companion that records 30 seconds of ambient audio, classifies it on-device with Cornell's BirdNET V2.4 TFLite model, and generates a grounded two-sentence field tip via a local Gemma 2 model served through Ollama before speaking it aloud with text-to-speech. The app avoids cloud APIs and server-side codec dependencies by encoding raw microphone data into 16-bit PCM WAV in the browser with a 40-line Web Audio API encoder, and it tracks a "Touch Grass Score" comparing outdoor minutes to screen time in a local SQLite database.

by read3 min views1 publishedOct 6, 2026

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

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 up. 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

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.

── more in #artificial-intelligence 4 stories · sorted by recency
── more on @eyes up 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/eyes-up-an-offline-b…] indexed:0 read:3min 2026-10-06 · —