<?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: Pallavi</title>
    <description>The latest articles on DEV Community by Pallavi (@wrotecode).</description>
    <link>https://dev.to/wrotecode</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%2F4169358%2Fce37f5b8-2d77-4f8e-bbef-30da7aafd58f.jpg</url>
      <title>DEV Community: Pallavi</title>
      <link>https://dev.to/wrotecode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wrotecode"/>
    <language>en</language>
    <item>
      <title>WingLog</title>
      <dc:creator>Pallavi</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:15:36 +0000</pubDate>
      <link>https://dev.to/wrotecode/winglog-73c</link>
      <guid>https://dev.to/wrotecode/winglog-73c</guid>
      <description>&lt;p&gt;&lt;em&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;/em&gt;&lt;/p&gt;

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

&lt;p&gt;WingLog is a mobile-first bird watching journal that runs entirely in your browser no backend, no cloud, no API keys. Take a photo of a bird on the trail, drop it into WingLog, and a local AI vision model (LLaVA, running via Ollama) identifies the species, fills in the latin name, writes a field description, and saves the sighting to your life list.&lt;/p&gt;

&lt;p&gt;The whole thing is a single HTML file. Open it once, and it works forever even with airplane mode on.&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wrotecode" rel="noopener noreferrer"&gt;
        wrotecode
      &lt;/a&gt; / &lt;a href="https://github.com/wrotecode/winlog" rel="noopener noreferrer"&gt;
        winlog
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      dev_1
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The Idea&lt;br&gt;
The best birding spots have no signal. Every closed AI API is useless there.&lt;/p&gt;

&lt;p&gt;So I built WingLog — snap a photo of a bird, drop it in, get an ID in 5 seconds. No cloud, no API key, no internet. Single HTML file. Works forever offline.&lt;/p&gt;

&lt;p&gt;The Stack&lt;br&gt;
Ollama  Runs open-weight models locally via a simple REST API&lt;br&gt;
LLaVA (7B)  Vision model that looks at images and describes what it sees&lt;br&gt;
Vanilla HTML/CSS/JS Zero build step — double-click and it works&lt;br&gt;
localStorage    All data stays on your device&lt;br&gt;
How the AI ID Works&lt;br&gt;
javascript&lt;br&gt;
&lt;code&gt;&lt;br&gt;
// 1. Photo → base64&lt;br&gt;
const photob64 = dataUrl.split(',')[1];&lt;br&gt;
// 2. Send to local Ollama&lt;br&gt;
const resp = await fetch('http://localhost:11434/api/generate', {&lt;br&gt;
  method: 'POST',&lt;br&gt;
  body: JSON.stringify({&lt;br&gt;
    model: 'llava',&lt;br&gt;
    prompt: 'Identify this bird. Return JSON: {"species":"...","latin":"...","confidence":"...","description":"..."}',&lt;br&gt;
    images: [photob64],  // never leaves your machine&lt;br&gt;
    stream: false,&lt;br&gt;
    format: 'json'       // forces structured output — game changer&lt;br&gt;
  })&lt;br&gt;
});&lt;br&gt;
// 3. Auto-fill the form&lt;br&gt;
const result = JSON.parse((await resp.json()).response);&lt;br&gt;
document.getElementById('species-input').value = result.species;&lt;br&gt;
The key trick: format: "json" in the Ollama request. Without it you're parsing markdown. With it, the output is clean JSON every time.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The One Gotcha&lt;br&gt;
If Ollama blocks your browser request, run it with:&lt;/p&gt;

&lt;p&gt;`bash&lt;/p&gt;

&lt;p&gt;OLLAMA_ORIGINS=* ollama serve`&lt;br&gt;
That's the #1 setup issue. I put a step-by-step guide inside the app's  modal so users don't have to Google it.&lt;/p&gt;

&lt;p&gt;Why Open-Source AI Made This Better&lt;br&gt;
A closed API would have made this worse — not just more expensive:&lt;/p&gt;

&lt;p&gt;No signal on the trail → closed API fails completely&lt;br&gt;
 Photos go to a server → privacy problem for sensitive habitats&lt;br&gt;
 Usage costs → I'd have to hide the AI behind limits&lt;br&gt;
 Ollama + LLaVA → offline, private, free, swappable&lt;/p&gt;

&lt;p&gt;What Surprised Me!!&lt;br&gt;
LLaVA is genuinely good at birds. It nailed a Peregrine Falcon in flight and a Ruby-throated Hummingbird silhouette. It failed on a blurry sparrow — which is fair, I couldn't ID it either.&lt;/p&gt;

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

&lt;p&gt;Open innovation mattered here because the use case required it. An AI that only works when you have internet is useless on the trail. An AI that sends your photos to a server is a privacy problem in the field. LLaVA on Ollama is offline, private, free, and swappable — closed AI is none of those things. This isn't "open-source as philosophy." It's open-source as the only technically correct choice for this problem.&lt;/p&gt;

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