<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dipanshu Vishwakarma</title>
    <description>The latest articles on DEV Community by Dipanshu Vishwakarma (@dipanshu_vishwakarma).</description>
    <link>https://dev.to/dipanshu_vishwakarma</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4164073%2Fb5cb0558-2058-42ab-84a6-5fdeabaec2a0.png</url>
      <title>DEV Community: Dipanshu Vishwakarma</title>
      <link>https://dev.to/dipanshu_vishwakarma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dipanshu_vishwakarma"/>
    <language>en</language>
    <item>
      <title>BirdLens AI: Identify Birds Locally, Explore Nature Offline</title>
      <dc:creator>Dipanshu Vishwakarma</dc:creator>
      <pubDate>Sun, 11 Oct 2026 06:29:13 +0000</pubDate>
      <link>https://dev.to/dipanshu_vishwakarma/birdlens-ai-identify-birds-in-your-browser-then-get-back-outside-5ei1</link>
      <guid>https://dev.to/dipanshu_vishwakarma/birdlens-ai-identify-birds-in-your-browser-then-get-back-outside-5ei1</guid>
      <description>&lt;h1&gt;
  
  
  BirdLens AI — An Open-Source AI Bird Identification Companion
&lt;/h1&gt;

&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;BirdLens AI&lt;/strong&gt;, a browser-based bird-identification companion for beginner birdwatchers, curious walkers, and anyone who wants to learn more about the wildlife around them.&lt;/p&gt;

&lt;p&gt;My approach to “Touch Grass” is simple: &lt;strong&gt;use technology to support an outdoor experience, not replace it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The intended flow is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go outside → Notice a bird → Take a photograph → Get a suggested identification → Return to observing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BirdLens AI lets users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload a bird photograph and identify it locally using an open-weight model.&lt;/li&gt;
&lt;li&gt;Review the top five predictions rather than trusting a single answer.&lt;/li&gt;
&lt;li&gt;Read sourced information about the suggested species.&lt;/li&gt;
&lt;li&gt;Save photographs and results in a local discovery journal.&lt;/li&gt;
&lt;li&gt;Track simple outdoor observation challenges.&lt;/li&gt;
&lt;li&gt;Revisit saved discoveries and identify photographs offline after the required assets and model have been cached.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The journal turns individual sightings into a personal record of exploration. The challenges give users a reason to notice more of their surroundings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is to make the screen the shortest part of the experience.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live project:&lt;/strong&gt; &lt;a href="https://birdlens-ai.vercel.app/#home" rel="noopener noreferrer"&gt;Try BirdLens AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fji0cnqash65en6uzes4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fji0cnqash65en6uzes4y.png" alt=" " width="799" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It Yourself
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the app and choose &lt;strong&gt;Identify a bird&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Upload a clear photograph of a bird.&lt;/li&gt;
&lt;li&gt;Wait for the model to load and run inference.&lt;/li&gt;
&lt;li&gt;Review the suggested species, model score, and alternative predictions.&lt;/li&gt;
&lt;li&gt;Save the result and explore &lt;strong&gt;My discoveries&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first identification downloads the model. Later identifications can work offline once the production application and model have been successfully cached, provided the browser retains that storage.&lt;/p&gt;

&lt;p&gt;New online species references may still need an internet connection.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please observe birds from a respectful distance. An identification app is not a reason to approach or disturb wildlife.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Public repository:&lt;/strong&gt; &lt;a href="https://github.com/unknowdeepanshu/birdlens-ai" rel="noopener noreferrer"&gt;View BirdLens AI on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React and TypeScript&lt;/strong&gt; — Interface and application logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; — Development and production builds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — Styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ONNX Runtime Web&lt;/strong&gt; — Browser-based inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IndexedDB&lt;/strong&gt; — Local discovery journal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Worker and Cache Storage&lt;/strong&gt; — Production offline support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no application backend, user account requirement, or paid AI inference API.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  An Open-Weight Model Is the Core, Not an Extra Feature
&lt;/h3&gt;

&lt;p&gt;BirdLens AI uses the &lt;a href="https://huggingface.co/chriamue/bird-species-classifier" rel="noopener noreferrer"&gt;chriamue/bird-species-classifier&lt;/a&gt;, an EfficientNet-B2 model with 525 output classes.&lt;/p&gt;

&lt;p&gt;The publisher declares the model MIT-licensed. Its weights are loaded in ONNX format and executed through ONNX Runtime Web.&lt;/p&gt;

&lt;p&gt;Without that model and the local inference runtime, the application's main identification feature would not work. &lt;strong&gt;Open AI is therefore central to the project.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Running Inference in the Browser
&lt;/h3&gt;

&lt;p&gt;The inference pipeline works as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decode the uploaded photograph.&lt;/li&gt;
&lt;li&gt;Resize and normalize it for the model.&lt;/li&gt;
&lt;li&gt;Run the ONNX classifier using WebAssembly inside a worker.&lt;/li&gt;
&lt;li&gt;Convert the output into ranked model probabilities.&lt;/li&gt;
&lt;li&gt;Display the top five predictions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Running inference in a worker keeps it separate from the main interface.&lt;/p&gt;

&lt;p&gt;Photographs are not sent to a remote AI service for identification. The application does download model assets and may fetch online species references, but image inference happens on the user's device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Showing Uncertainty Honestly
&lt;/h3&gt;

&lt;p&gt;A model prediction is not a confirmed sighting.&lt;/p&gt;

&lt;p&gt;BirdLens AI uses score and prediction-margin heuristics to mark uncertain results as tentative. It also shows alternative candidates so users can compare possibilities.&lt;/p&gt;

&lt;p&gt;There are important limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The model is a closed-set classifier, not a bird detector.&lt;/li&gt;
&lt;li&gt;Unsupported species and non-bird images can produce misleading predictions.&lt;/li&gt;
&lt;li&gt;Poor lighting, small subjects, and similar-looking species can confuse it.&lt;/li&gt;
&lt;li&gt;Model probabilities are not calibrated identification confidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scientifically important observations should be independently verified.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Local Journal and Conditional Offline Support
&lt;/h3&gt;

&lt;p&gt;Saved discoveries are stored in IndexedDB, including the photograph and identification results.&lt;/p&gt;

&lt;p&gt;In production, a service worker caches application assets. The model is cached after loading, enabling subsequent offline identification.&lt;/p&gt;

&lt;p&gt;This is not &lt;strong&gt;offline immediately&lt;/strong&gt;. The application and model must first be loaded and cached. Clearing browser data or storage eviction can remove cached assets and saved discoveries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Development with an AI Coding Assistant
&lt;/h3&gt;

&lt;p&gt;I used an AI coding assistant to help develop the project. The finished application runs a real open-weight classifier locally rather than using mocked predictions or a hosted AI API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying on Vercel
&lt;/h2&gt;

&lt;p&gt;Because BirdLens AI runs in the browser, I deployed it on Vercel without building a backend.&lt;/p&gt;

&lt;p&gt;My deployment settings are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework preset&lt;/td&gt;
&lt;td&gt;Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm run model:download &amp;amp;&amp;amp; npm run build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output directory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dist&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm ci&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model-download step is essential.&lt;/p&gt;

&lt;p&gt;The model weights are ignored by Git. During deployment, &lt;code&gt;npm run model:download&lt;/code&gt; retrieves a pinned model revision and verifies its checksum before saving it to &lt;code&gt;public/models/birds.onnx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The build then includes that model in the deployment so the browser can load it for identification.&lt;/p&gt;

&lt;p&gt;No backend environment variables or AI API keys are required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For BirdLens AI, openness makes privacy, offline use, and model control practical.&lt;/p&gt;

&lt;p&gt;A hosted-only AI API would require sending photographs to a remote service and maintaining a connection for each identification. A redistributable model lets the user's browser perform that work locally.&lt;/p&gt;

&lt;p&gt;That makes several things possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Image Inference on the Device
&lt;/h3&gt;

&lt;p&gt;Users do not need to upload their photographs to a third-party AI service to get a prediction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continue Without a Signal After Setup
&lt;/h3&gt;

&lt;p&gt;Once the necessary application assets and model are cached, identification can work without an internet connection.&lt;/p&gt;

&lt;p&gt;That is useful for a nature-focused application, where connectivity is not always available.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid Per-Request AI Fees
&lt;/h3&gt;

&lt;p&gt;Local inference does not require paid API calls or credentials. Hosting and initial downloads still consume resources, but each identification does not depend on a billable inference request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inspect and Improve the Implementation
&lt;/h3&gt;

&lt;p&gt;Developers can review the labels, preprocessing, model revision, and output handling.&lt;/p&gt;

&lt;p&gt;They can also evaluate a different model and adapt the application without depending on a closed provider's inference endpoint.&lt;/p&gt;

&lt;p&gt;Open weights do not automatically make a model accurate. What they provide here is control over where inference happens and how the system can be inspected, tested, and changed.&lt;/p&gt;

&lt;p&gt;That is the kind of open innovation I wanted to build around: &lt;strong&gt;a small tool that helps people understand the world outside without making them dependent on a remote AI service.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I used an AI coding assistant during development, but I do not currently have a shareable DevRelay recording of the build session.&lt;/p&gt;

&lt;p&gt;I am sharing the implementation through the source repository instead.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
