<?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: pkbhalla</title>
    <description>The latest articles on DEV Community by pkbhalla (@pkbhalla).</description>
    <link>https://dev.to/pkbhalla</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%2F804096%2Fbfea7810-1329-4983-8725-07837755bea0.png</url>
      <title>DEV Community: pkbhalla</title>
      <link>https://dev.to/pkbhalla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pkbhalla"/>
    <language>en</language>
    <item>
      <title>Madras Field Notes — A Fully Offline, In-Browser Field Guide for Chennai's Birds and Plants</title>
      <dc:creator>pkbhalla</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:58:00 +0000</pubDate>
      <link>https://dev.to/pkbhalla/madras-field-notes-a-fully-offline-in-browser-field-guide-for-chennais-birds-and-plants-2bin</link>
      <guid>https://dev.to/pkbhalla/madras-field-notes-a-fully-offline-in-browser-field-guide-for-chennais-birds-and-plants-2bin</guid>
      <description>&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;&lt;strong&gt;Madras Field Notes&lt;/strong&gt; is an installable PWA that turns your phone into a pocket naturalist for Chennai — and it works entirely in airplane mode.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identify:&lt;/strong&gt; Point your camera at a bird or plant. A CLIP zero-shot image classifier — running inside your browser, against a curated list of 15 species common to IIT Madras campus and the Pallikaranai marsh — tells you what you're looking at, with an honest "not sure" state below its confidence threshold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn:&lt;/strong&gt; Every species gets a card from a hand-built knowledge pack: 3 facts, identifying features, and one safety note — in both English and Tamil. No screen time bloat; read the card, look back up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask:&lt;/strong&gt; A Qwen2.5-0.5B open-weight model running locally in the browser tab answers follow-up questions ("Is this bird migratory?") grounded strictly in the species card — it cannot hallucinate edibility or medical advice because it never sees the open internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log:&lt;/strong&gt; Identifications save to an on-device field journal, exportable as JSON for citizen-science projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://madrasfieldnotes.onrender.com" rel="noopener noreferrer"&gt;https://madrasfieldnotes.onrender.com&lt;/a&gt; (open it once online, then switch on airplane mode — everything still works)&lt;br&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/pkbhalla/MadrasFieldNotes" rel="noopener noreferrer"&gt;https://github.com/pkbhalla/MadrasFieldNotes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo flow: load once → airplane mode → identify a rose-ringed parakeet from a photo → read its card in Tamil → ask the local LLM a question → check the field log. Zero network requests after first load.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stack:&lt;/strong&gt; Vite + TypeScript, no backend, no API keys, no analytics. Hugging Face Transformers.js v3 runs both models in Web Workers so the UI never blocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identify:&lt;/strong&gt; Xenova/clip-vit-base-patch32 zero-shot image classification on WASM, against label phrases built from the knowledge pack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat:&lt;/strong&gt; onnx-community/Qwen2.5-0.5B-Instruct at q4 quantization (~300 MB), with the species JSON injected into its system prompt as the only allowed knowledge source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; Service Worker caches the app shell; the Cache API persists model weights; navigator.storage.persist() guards against browser eviction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Open Beat Closed
&lt;/h2&gt;

&lt;p&gt;This project only exists because the models are open — and my biggest failure proves why that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. I could see the real cost.&lt;/strong&gt; Closed APIs hide their footprint behind a spinner. Open weights forced me to confront the physics: my first build loaded a 1B model's fp32 weights (~2 GB) and Chrome killed the tab the moment CLIP and the LLM were resident together. Android caps a browser tab around 1–1.5 GB &lt;em&gt;no matter how much RAM the phone has&lt;/em&gt;. Because the weights were mine to inspect and swap, the fix was a real engineering tradeoff — q4 quantization, a smaller instruct model, identification-first design — not a support ticket. Chat now ships desktop-first, with mobile chat as the honest next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Zero per-query cost means zero reason to stay inside.&lt;/strong&gt; No API bill means the app nags nobody, tracks nobody, and never degrades when a free tier ends. The user "closes" the screen &lt;em&gt;because&lt;/em&gt; using it worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The knowledge pack is the forkable product.&lt;/strong&gt; species.json holds Chennai's birds and plants with Tamil names. Any community — Coimbatore, Colombo, Kuala Lumpur — can fork the repo, swap 15 JSON entries, and ship &lt;em&gt;their&lt;/em&gt; field guide, in &lt;em&gt;their&lt;/em&gt; language, without asking anyone for permission or a bill. That's what "gets people off the screen and into the world" looks like at ecosystem scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Privacy is architectural, not a policy page.&lt;/strong&gt; Photos of what you find on a trail never leave the device, because there is no server to send them to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shard-free sub-500 MB total budget so chat survives mobile tab limits&lt;/li&gt;
&lt;li&gt;Bird-call identification via the open-source BirdNET browser port&lt;/li&gt;
&lt;li&gt;Community-contributed packs (crowdsource species.json per region)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built in ~24 hours for the hackathon. The screen is the shortest part of this experience — by design, and by memory ceiling.&lt;/p&gt;

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