<?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: Farhan Ahmad</title>
    <description>The latest articles on DEV Community by Farhan Ahmad (@farhan989800).</description>
    <link>https://dev.to/farhan989800</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%2F4153692%2F1ae310c2-66fc-4e70-b9c8-2222512612be.jpg</url>
      <title>DEV Community: Farhan Ahmad</title>
      <link>https://dev.to/farhan989800</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farhan989800"/>
    <language>en</language>
    <item>
      <title>NaturalDex: Building an Offline-First Nature Collection Game During Hacktoberfest 2026</title>
      <dc:creator>Farhan Ahmad</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:04:09 +0000</pubDate>
      <link>https://dev.to/farhan989800/naturaldex-building-an-offline-first-nature-collection-game-during-hacktoberfest-2026-3mgn</link>
      <guid>https://dev.to/farhan989800/naturaldex-building-an-offline-first-nature-collection-game-during-hacktoberfest-2026-3mgn</guid>
      <description>&lt;p&gt;Have you ever wanted to step outside, connect with nature, and explore beyond your comfort zone?&lt;/p&gt;

&lt;p&gt;I did. And instead of just thinking about it, I decided to build something to make it happen.&lt;/p&gt;

&lt;p&gt;This is the story of how I built &lt;strong&gt;NaturalDex&lt;/strong&gt; — the problem I wanted to solve, how I approached the architecture, the technology stack I chose, the technical hurdles I faced along the way, and what I learned from the process.&lt;/p&gt;

&lt;p&gt;This project is part of my journey through &lt;strong&gt;Hacktoberfest 2026&lt;/strong&gt;, where I explored how to turn an outdoor exploration concept into a fully functional, privacy-first application.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Modern screen addiction and constant doomscrolling diminish attention spans and keep people indoors. With the "Touch Grass" mindset in mind, I wanted to build an application that minimizes screen time while fostering genuine curiosity about the natural world.&lt;/p&gt;

&lt;p&gt;The goal was to make outdoor exploration exciting by encouraging users to step out of their comfort zone, explore their local environment, identify real species, and gain field knowledge in a rewarding way.&lt;/p&gt;

&lt;p&gt;That became the founding vision for NaturalDex.&lt;/p&gt;




&lt;h2&gt;
  
  
  Here It Is in Action 🎬
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/LeT_yH5muxI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🎥 &lt;em&gt;Click the preview above to watch the project demonstration on YouTube.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explore the code&lt;/strong&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/KevinForsgren" rel="noopener noreferrer"&gt;
        KevinForsgren
      &lt;/a&gt; / &lt;a href="https://github.com/KevinForsgren/NaturalDex" rel="noopener noreferrer"&gt;
        NaturalDex
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A field journal and outdoor collection game that encourages nature exploration through species identification and collection. Built with a privacy-first, offline-capable architecture.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NaturalDex&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A field journal and outdoor collection game that encourages nature exploration through species identification and collection. Built with a privacy-first, offline-capable architecture.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;NaturalDex turns outdoor observation into a collection game. Users capture three photos of a plant, animal, or fungus in the field, submit them for local AI identification via a paired home base (laptop running Ollama), and build a personal field journal with discovered species cards.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: FastAPI + SQLAlchemy 2.0 + Pydantic v2 (Python 3.14+)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React 18 + Vite 6 + TailwindCSS v4 + React Router 6&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: SQLite (local file)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: Local inference via Ollama on a paired home base (no cloud dependency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth&lt;/strong&gt;: JWT in HttpOnly cookies + Argon2 password hashing&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily field tasks&lt;/strong&gt; — Three personalized tasks per day (flora/fauna/fungi categories)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three-photo discovery flow&lt;/strong&gt; — Capture multiple angles for accurate ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local AI identification&lt;/strong&gt; —…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/KevinForsgren/NaturalDex" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Mobile UI
&lt;/h2&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%2Fm7esm4nutaxbxbzz9z01.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%2Fm7esm4nutaxbxbzz9z01.png" alt="Explore Page preview on android" width="800" height="600"&gt;&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%2Fmfey7vpkhz7r36lzswbn.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%2Fmfey7vpkhz7r36lzswbn.png" alt="User profile page preview on andriod" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Features &amp;amp; Experience
&lt;/h2&gt;

&lt;p&gt;The goal was simple: build a working prototype that demonstrates gamified nature discovery without relying on cloud privacy compromises or overly complicated setups.&lt;/p&gt;

&lt;p&gt;Here is what the application currently delivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily Field Tasks&lt;/strong&gt;: Receives three personalized tasks per day (covering flora, fauna, and fungi categories) that encourage users to step outside and observe local biodiversity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-Photo Discovery Flow&lt;/strong&gt;: Users capture three angles of a plant, animal, or fungus in the field to feed into a local vision AI for accurate species identification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pokédex-Style Field Journal &amp;amp; XP&lt;/strong&gt;: Discovered species unlock collectible cards with stable URLs, adding new entries to a personal Field Journal with leveling and XP progression.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-First Local AI&lt;/strong&gt;: Operates offline without external cloud dependencies. Image classification runs directly on the user's home laptop using Ollama.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;At its core, &lt;strong&gt;NaturalDex&lt;/strong&gt; is a mobile-first web application powered by local AI and self-hosted architecture, designed to turn outdoor walks into a personal natural history expedition.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Nature Card Collection
&lt;/h3&gt;

&lt;p&gt;Users collect species cards by identifying surrounding flora, fauna, and fungi. Each card displays the common and scientific names, location recorded, species summary, and interesting biological facts.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Player XP &amp;amp; Progression System
&lt;/h3&gt;

&lt;p&gt;To encourage long-term outdoor habits, NaturalDex incorporates player XP mechanics. Users earn XP by completing daily tasks and logging new species observations, turning nature walks into a rewarding progression loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Thoughtful User Experience
&lt;/h3&gt;

&lt;p&gt;A great concept requires an intuitive interface. Key UX design choices include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Mobile-First UI&lt;/strong&gt;: Optimized for handheld camera capture on mobile while remaining accessible on desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless Home Base Pairing&lt;/strong&gt;: QR code pairing connects mobile browser clients to a home base Ollama instance over LAN or ngrok tunnels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear Feedback&lt;/strong&gt;: Informative states during multi-photo upload, vision AI inference, and card generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cohesive Aesthetic&lt;/strong&gt;: A clean, natural visual language designed with TailwindCSS v4.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;React 18 &amp;amp; Vite 6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend framework and fast build toolchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TailwindCSS v4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Utility-first styling and responsive layouts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FastAPI &amp;amp; Pydantic v2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-performance Python 3.14+ API backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQLAlchemy 2.0 &amp;amp; SQLite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local database ORM and persistent storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama (Local LLM/Vision)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privacy-first local vision AI inference (e.g., &lt;code&gt;llava-phi3&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JWT &amp;amp; Argon2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secure authentication stored in HttpOnly cookies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  The Frontend Structure
&lt;/h3&gt;

&lt;p&gt;The frontend is organized around key user flows—Discover, Collection, Journal, and Profile—ensuring clear separation of concerns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;frontend/src/
├── App.jsx
├── components/
│   ├── BottomNav.jsx
│   ├── Modal.jsx
│   ├── QRScanner.jsx
│   └── Toast.jsx
├── hooks/
│   └── useCamera.js
├── lib/
│   ├── api.js
│   ├── data.js
│   └── icons.jsx
├── pages/
│   ├── CardDetail.jsx
│   ├── Collection.jsx
│   ├── Discover.jsx
│   ├── Home.jsx
│   ├── Journal.jsx
│   ├── Login.jsx
│   ├── PairingPage.jsx
│   └── Profile.jsx
└── state/
└── AuthContext.jsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Backend &amp;amp; Discovery Data Pipeline
&lt;/h3&gt;

&lt;p&gt;The backend orchestrates photo submission, vision inference, rejection/policy validation, database updates, and XP awarding.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  Phone      │────▶│  Backend    │────▶│  Ollama     │────▶│  Backend    │
│  (3 photos) │     │  (queue)    │     │  (vision)   │     │  (persist)  │
└─────────────┘     └─────────────┘     └─────────────┘     └─────────────┘
       │                                        │
       │                                        ▼
┌──────┴──────┐                        ┌──────────────────┐
│  Validation │                        │  Database Ops    │
│  (policy)   │                        │  • species       │
└─────────────┘                        │  • collection    │
                                       │  • observations  │
                                       │  • XP events     │
                                       │  • journal       │
                                       │  • daily tasks   │
                                       └──────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Dedicated API Client Pattern
&lt;/h4&gt;

&lt;p&gt;To maintain a clean frontend architecture, backend communication is centralized in dedicated API utility modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getCollection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/collection`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to fetch collection&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Photo Vision AI Identification
&lt;/h3&gt;

&lt;p&gt;Integrating Ollama vision models required structured JSON outputs to extract common names, scientific names, confidence levels, and quality checks. Handling non-vision fallback errors when users ran incompatible models (such as text-only models) required strict validation policies in &lt;code&gt;services/vision.py&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Home Base QR Pairing Across Networks
&lt;/h3&gt;

&lt;p&gt;Allowing a mobile phone browser to talk to an Ollama instance running on a paired laptop required a lightweight pairing protocol. I designed a challenge-response QR code pairing flow (&lt;code&gt;/api/home-base/pairing-challenge&lt;/code&gt;) supported by ngrok tunneling so phones on cellular networks could pair with laptops on local Wi-Fi.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Idempotency &amp;amp; XP Integrity
&lt;/h3&gt;

&lt;p&gt;To prevent duplicate collection entries when uploading photos, the backend uses unique observation linking (&lt;code&gt;collection_card_observations&lt;/code&gt;) to ensure card counts, XP events, and daily task updates remain strictly idempotent.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Managing Scope
&lt;/h3&gt;

&lt;p&gt;Rather than attempting to launch a full native mobile app immediately, I focused on building an offline-capable, responsive Web App (PWA architecture) to perfect the core identification and collection loop first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing and Reliability
&lt;/h2&gt;

&lt;p&gt;To ensure backend stability and reliability, testing was implemented using Pytest across key service layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API Endpoint Testing&lt;/strong&gt;: Automated routes validation for &lt;code&gt;/api/auth&lt;/code&gt;, &lt;code&gt;/api/discoveries&lt;/code&gt;, &lt;code&gt;/api/collection&lt;/code&gt;, &lt;code&gt;/api/daily-tasks&lt;/code&gt;, and &lt;code&gt;/api/home-base&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vision Policy Checks&lt;/strong&gt;: Verified backend rejection filters for low-quality or non-matching multi-photo submissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database &amp;amp; ORM Verification&lt;/strong&gt;: Model relationship testing between users, cards, species, and XP event tables with SQLite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual Cross-Device UX Checks&lt;/strong&gt;: Validated camera feeds, mobile viewports, and QR scan mechanics on handheld devices.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running It Locally
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Python 3.14+&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node.js 18+&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ollama (with a vision model like &lt;code&gt;llava-phi3&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Clone the Repository
&lt;/h3&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="o"&gt;[&lt;/span&gt;https://github.com/KevinForsgren/NaturalDex.git]&lt;span class="o"&gt;(&lt;/span&gt;https://github.com/KevinForsgren/NaturalDex.git&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;NaturalDex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Backend Setup
&lt;/h3&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[dev]"&lt;/span&gt;
&lt;span class="c"&gt;# or using uv:&lt;/span&gt;
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--extra&lt;/span&gt; dev
uv run uvicorn src.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Frontend Setup
&lt;/h3&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Configure Ollama Vision AI
&lt;/h3&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install and serve Ollama&lt;/span&gt;
ollama pull llava-phi3
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy &lt;code&gt;.env.template&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt; in the root directory:&lt;/p&gt;

&lt;p&gt;Code snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt;=./&lt;span class="n"&gt;Database&lt;/span&gt;/&lt;span class="n"&gt;naturedex&lt;/span&gt;.&lt;span class="n"&gt;db&lt;/span&gt;
&lt;span class="n"&gt;VISION_PROVIDER&lt;/span&gt;=&lt;span class="n"&gt;ollama&lt;/span&gt;
&lt;span class="n"&gt;OLLAMA_BASE_URL&lt;/span&gt;=&lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;localhost&lt;/span&gt;:&lt;span class="m"&gt;11434&lt;/span&gt;
&lt;span class="n"&gt;OLLAMA_MODEL&lt;/span&gt;=&lt;span class="n"&gt;llava&lt;/span&gt;-&lt;span class="n"&gt;phi3&lt;/span&gt;
&lt;span class="n"&gt;SECRET_KEY&lt;/span&gt;=&lt;span class="n"&gt;your&lt;/span&gt;-&lt;span class="n"&gt;secret&lt;/span&gt;-&lt;span class="n"&gt;key&lt;/span&gt;-&lt;span class="n"&gt;here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I Would Improve Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[ ] Convert the frontend into a native React Native / Expo application for improved mobile camera control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Add offline queueing for photo submissions when cellular reception drops in deep outdoor areas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Expand unit test coverage across frontend hooks and state contexts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Add community card sharing features while preserving user location privacy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Building NaturalDex highlighted that developing an AI application is far more than wrapping an API call. It requires orchestrating local hardware constraints, robust data validation, user privacy, and effective state management.&lt;/p&gt;

&lt;p&gt;Working with AI coding agents also taught me the importance of detailed prompting—guiding models like an engineering manager with explicit contextual constraints yields vastly superior architecture and cleaner code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://www.google.com/url?sa=E&amp;amp;source=gmail&amp;amp;q=https://github.com/KevinForsgren/NaturalDex" rel="noopener noreferrer"&gt;KevinForsgren/NaturalDex&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social / Contact&lt;/strong&gt;: &lt;a href="https://www.google.com/search?q=https://x.com/Kevin_Forsgren" rel="noopener noreferrer"&gt;X (@Kevin_Forsgren)&lt;/a&gt; | &lt;a href="https://www.google.com/search?q=https://github.com/KevinForsgren" rel="noopener noreferrer"&gt;GitHub Profile&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;License&lt;/strong&gt;: &lt;a href="https://github.com/KevinForsgren/NaturalDex?tab=GPL-3.0-1-ov-file" rel="noopener noreferrer"&gt;GPL-3.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;General&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>StudyLoop: An AI powered productivity planner built for my friend</title>
      <dc:creator>Farhan Ahmad</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:45:39 +0000</pubDate>
      <link>https://dev.to/farhan989800/studyloop-an-ai-powered-productivity-planner-built-for-my-friend-1plg</link>
      <guid>https://dev.to/farhan989800/studyloop-an-ai-powered-productivity-planner-built-for-my-friend-1plg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built StudyLoop, a locally hosted, open-weight-model-powered productivity and planning web app designed to help my friend stay consistent with his work and goals, while also boosting his motivation with AI-generated reports and charts.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/fMiWJQoABIM" rel="noopener noreferrer"&gt;Watch the demo on YouTube&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/KevinForsgren/StudyLoop" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;StudyLoop uses a locally hosted open-weight LLM (Gemma 3 4B) for AI-powered planning, report generation, and conversational features. The core logic of the app is separated into two parts: the frontend and backend.&lt;/p&gt;

&lt;p&gt;The backend is built with Python and FastAPI and handles AI interactions, task management, persistence, and user authentication. The frontend manages the UI and user interactions.&lt;/p&gt;

&lt;p&gt;Both parts can be run using a single shell script, making it easier for users to locally host and run the web app.&lt;/p&gt;

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

&lt;p&gt;Open source has been a big part of my life for a long time. Even before getting into tech, I was using GitHub and open-source projects to tinker with games and experiment with different things.&lt;/p&gt;

&lt;p&gt;When I transitioned from a commerce background into tech, open source became even more important to me. A huge part of what I know today came from exploring projects made by people who were willing to share their work with the world. It gave me a way to learn, experiment, and build things that I probably wouldn't have been able to otherwise.&lt;/p&gt;

&lt;p&gt;So open source isn't just a technology philosophy to me; it has genuinely influenced my journey into tech and has had a positive impact on my life.&lt;/p&gt;

&lt;p&gt;For StudyLoop, open innovation made it possible for me to use an open-weight model like Gemma 3 4B locally and build an AI-powered planner around it without relying on a proprietary AI service. I built it to help my friend stay consistent with his goals, keep track of his work, and hopefully become a better version of himself along the way.&lt;/p&gt;

&lt;p&gt;In a small way, I'm using the same open ecosystem that helped me get into tech to build something that can help someone else.&lt;/p&gt;

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

&lt;p&gt;I wasn't able to generate a shareable DevRelay session link, but the project was built with the help of an backboard CLI coding agent during development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gemma (Used Gemma 3 4B as a local LLM for my project)&lt;/li&gt;
&lt;/ul&gt;

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