<?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: Sarvesh</title>
    <description>The latest articles on DEV Community by Sarvesh (@sarvesh_3bcf0f427a27e1849).</description>
    <link>https://dev.to/sarvesh_3bcf0f427a27e1849</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%2F4164740%2F23dd0771-3434-4727-9c42-795fdf043c34.jpg</url>
      <title>DEV Community: Sarvesh</title>
      <link>https://dev.to/sarvesh_3bcf0f427a27e1849</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarvesh_3bcf0f427a27e1849"/>
    <language>en</language>
    <item>
      <title>I Built a Travel Agent That Plans With You and Travels Along Virtually</title>
      <dc:creator>Sarvesh</dc:creator>
      <pubDate>Sat, 07 Nov 2026 09:57:02 +0000</pubDate>
      <link>https://dev.to/sarvesh_3bcf0f427a27e1849/i-built-a-travel-agent-that-plans-with-you-and-travels-along-virtually-43ga</link>
      <guid>https://dev.to/sarvesh_3bcf0f427a27e1849/i-built-a-travel-agent-that-plans-with-you-and-travels-along-virtually-43ga</guid>
      <description>&lt;p&gt;&lt;strong&gt;A family group chat is a surprisingly difficult place to put an AI agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One person wants to visit every landmark. Someone else wants less walking. Food preferences appear halfway through the conversation. A ticket screenshot gets buried under twenty messages.&lt;/p&gt;

&lt;p&gt;Then the flight gets delayed.&lt;/p&gt;

&lt;p&gt;Suddenly, “make us an itinerary” becomes a much more interesting problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an assistant understand the conversation, remember who needs what, check real information, explain the trade-offs, and recover when things change?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question became &lt;strong&gt;Trippy&lt;/strong&gt;, my family travel companion built with &lt;strong&gt;Switch, Telegram, and Python&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This was my first time building with Switch. I started with a travel-assistant idea and ended up learning much more about agent coordination, evidence, identity, and failure recovery than I expected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SarveshDujari/Trippy---Travel-Companion" rel="noopener noreferrer"&gt;Explore Trippy on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The family should talk naturally. The system should behave carefully.
&lt;/h2&gt;

&lt;p&gt;I wanted Trippy to work where my family already talks: Telegram.&lt;/p&gt;

&lt;p&gt;A request should sound like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Compare two outings tomorrow, starting from Mecca Masjid and visiting Charminar. Make Chowmahalla Palace an optional extra stop, consider the weather, and show the comparison visually.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The family should not need to know which agent handles weather, which tool calculates routes, or which command opens memory.&lt;/p&gt;

&lt;p&gt;Behind that simple request, however, several things need to happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolve the places and requested date.&lt;/li&gt;
&lt;li&gt;Retrieve walking routes and relevant weather.&lt;/li&gt;
&lt;li&gt;Apply saved preferences and constraints.&lt;/li&gt;
&lt;li&gt;Compare the options.&lt;/li&gt;
&lt;li&gt;Explain missing information.&lt;/li&gt;
&lt;li&gt;Return a readable answer and visual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface stays conversational. The implementation needs structure.&lt;/p&gt;

&lt;p&gt;My central architectural decision was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agents propose. Application code validates and controls execution.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Switch became the backbone
&lt;/h2&gt;

&lt;p&gt;The part I appreciated most about Switch was that it gave the agents a place to collaborate around an actual conversation.&lt;/p&gt;

&lt;p&gt;Trippy uses a Telegram connector for the family-facing chat and a &lt;strong&gt;separate private Switch workroom&lt;/strong&gt; for internal assignments.&lt;/p&gt;

&lt;p&gt;That separation matters. The family gets readable replies instead of a stream of agent JSON, tool requests, and internal commentary.&lt;/p&gt;

&lt;p&gt;The model roles communicate with the Coordinator through structured messages. Switch carries those interactions; my application checks what they mean and whether they are allowed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Family Telegram group
          ↕
       Switch
          ↕
 Python Coordinator ───── SQLite
          ↕
 Private Switch workroom
          ↕
 Planner and specialist roles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a first Switch project, this was a satisfying discovery: I could focus on the travel workflow while using a shared communication layer for Telegram messages, agent assignments, and media.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Switch made the collaboration practical. The Coordinator made it controlled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those responsibilities complement each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six roles, without six agents talking at once
&lt;/h2&gt;

&lt;p&gt;Trippy has &lt;strong&gt;three core roles and three optional specialists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Coordinator is deterministic Python application code. It is not another model improvising what should happen next.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coordinator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Routing, identity checks, state, validation, approvals, and delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Planner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conversation, permitted tool requests, and proposed changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reservation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requests execution of approved simulated reservation changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gathers bounded evidence when a request needs focused research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mediator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Explains compromises between computed options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Watcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Assesses relevant sourced weather events&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The optional specialists join only when useful.&lt;/p&gt;

&lt;p&gt;A weather question can follow the direct Planner-and-tool path. A more involved comparison may benefit from research or mediation.&lt;/p&gt;

&lt;p&gt;Researcher and Mediator handoffs are bounded, and they share the discussion’s tool budget. Delegation does not create an unlimited new allowance or an endless agent conversation.&lt;/p&gt;

&lt;p&gt;The Mediator also cannot make an infeasible option acceptable through persuasive wording. It explains existing computed options; hard constraints remain enforced by code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More roles should mean clearer responsibilities, not more noise.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A recommendation needs evidence behind it
&lt;/h2&gt;

&lt;p&gt;Travel recommendations are easy to make sound convincing.&lt;/p&gt;

&lt;p&gt;“Just walk there—it’s nearby.”&lt;/p&gt;

&lt;p&gt;But nearby for whom? Using which route? Does that include walking inside the venue?&lt;/p&gt;

&lt;p&gt;Trippy integrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Meteo&lt;/strong&gt; for weather.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenStreetMap data&lt;/strong&gt;, through Nominatim and Overpass, for places and available tags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing services&lt;/strong&gt; for mapped journey estimates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tool results are saved as evidence. Model replies declare factual claims against specific fields in that evidence.&lt;/p&gt;

&lt;p&gt;For example, a walking-distance claim can point to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plans/0/walking_m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend checks the declared value against the stored result before rendering the sourced fact.&lt;/p&gt;

&lt;p&gt;Forecast dates matter too. A forecast for today does not answer a question about tomorrow simply because the temperature looks plausible.&lt;/p&gt;

&lt;p&gt;There are deliberate boundaries here. Field-level validation does not prove every sentence true, and an OpenStreetMap accessibility tag is not a guarantee.&lt;/p&gt;

&lt;p&gt;If venue walking, stairs, or current opening status are unknown, the answer should expose that uncertainty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“I don’t have enough evidence” is a useful planning result.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory should remember who said what
&lt;/h2&gt;

&lt;p&gt;Personalization becomes unreliable when an assistant remembers a preference but forgets its owner.&lt;/p&gt;

&lt;p&gt;“Dad prefers less walking” is different from “I prefer less walking.” A nickname is also different from a verified identity.&lt;/p&gt;

&lt;p&gt;Trippy separates those concepts.&lt;/p&gt;

&lt;p&gt;Saved preferences can retain an owner or reporter, source-message evidence, timestamps, importance, and whether the preference is a hard or soft constraint.&lt;/p&gt;

&lt;p&gt;The interaction changes with the consequence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Call me Sarvesh.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A display-name update happens directly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I prefer vegetarian meals.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A clear personal soft preference can save with an undo option.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I must walk at most 800 metres.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A hard limit requires confirmation because it changes which plans are allowed.&lt;/p&gt;

&lt;p&gt;Memory inspection makes stored information visible, and conflicting corrections can show the previous and proposed values.&lt;/p&gt;

&lt;p&gt;Group privacy adds another boundary. Sensitive mobility, health, and expense requests need explicit sharing permission before group processing.&lt;/p&gt;

&lt;p&gt;One lesson from testing: a technically correct privacy rejection can still be a terrible conversation. Trippy now gives clearer guidance instead of exposing a cryptic internal error.&lt;/p&gt;

&lt;h2&gt;
  
  
  A dependency graph, stored in SQLite
&lt;/h2&gt;

&lt;p&gt;I considered whether itinerary relationships needed a graph database.&lt;/p&gt;

&lt;p&gt;For Phase 1, they did not.&lt;/p&gt;

&lt;p&gt;The useful structure is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Flight arrival
      ↓
Airport transfer
      ↓
Hotel check-in
      ↓
Dinner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQLite stores itinerary items and dependency edges in relational tables. A recursive query finds downstream items affected by a disruption.&lt;/p&gt;

&lt;p&gt;Separate tables hold discussions, tool jobs, preferences, proposals, actions, processed events, and outgoing messages.&lt;/p&gt;

&lt;p&gt;This gives the project graph-style traversal alongside ordinary transactions, foreign keys, and versioned Alembic migrations.&lt;/p&gt;

&lt;p&gt;For a single local Coordinator, that is a practical fit. A server database becomes a stronger choice when deployment and concurrency requirements demand it.&lt;/p&gt;

&lt;p&gt;I wanted the architecture to earn its complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disruption recovery has an approval boundary
&lt;/h2&gt;

&lt;p&gt;A simulated flight delay is one of Trippy’s most revealing demonstrations.&lt;/p&gt;

&lt;p&gt;The disruption identifies affected dependencies and starts repair planning. The proposal shows the intended changes, including timings, cost differences, alternatives, and expiry.&lt;/p&gt;

&lt;p&gt;Then the family reviews it.&lt;/p&gt;

&lt;p&gt;Execution requires the exact proposal approval from an authorized linked account. The application checks identity, scope, expiry, and replay protection.&lt;/p&gt;

&lt;p&gt;A friendly “sounds good” does not become permission to spend money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reservation actions are currently simulated. No real supplier booking or payment occurs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That boundary lets me demonstrate the workflow honestly while building the fundamentals needed before introducing higher-consequence integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most useful debugging lesson: good data can still produce a bad experience
&lt;/h2&gt;

&lt;p&gt;One outing request successfully fetched routes and weather—and still failed.&lt;/p&gt;

&lt;p&gt;The weather was nested inside the comparison result. The reply validator expected it through the weather contract and could not see it.&lt;/p&gt;

&lt;p&gt;To the user, the assistant looked broken. Underneath, the provider calls had succeeded.&lt;/p&gt;

&lt;p&gt;The fix was to expose the exact stored forecast through the same dated evidence contract used by a standalone weather request.&lt;/p&gt;

&lt;p&gt;Testing also revealed that “show comparison &lt;strong&gt;visually&lt;/strong&gt;” was being missed by the visual-request check.&lt;/p&gt;

&lt;p&gt;These were integration failures between otherwise working components.&lt;/p&gt;

&lt;p&gt;I added a recovery path: when the computed comparison exists but the extra narration fails or times out, Trippy can deliver that request’s saved comparison and requested schematic, with limitations visible.&lt;/p&gt;

&lt;p&gt;It does not substitute an unrelated fictional plan.&lt;/p&gt;

&lt;p&gt;That became a broader design principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A failure in generated narration should not automatically discard useful computed results.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reliability needs more than a convincing reply
&lt;/h2&gt;

&lt;p&gt;Trippy uses a durable inbox and outbox to separate message processing from delivery.&lt;/p&gt;

&lt;p&gt;Processed event IDs prevent duplicate handling. Unique action keys protect against duplicate local execution. Assignment IDs, trip versions, and deadlines help reject stale results.&lt;/p&gt;

&lt;p&gt;Uncertain delivery is held for review rather than blindly resent.&lt;/p&gt;

&lt;p&gt;I am not claiming exactly-once Telegram delivery. I am making delivery state visible and giving the application a controlled recovery path.&lt;/p&gt;

&lt;p&gt;The latest local suite passed &lt;strong&gt;233 tests&lt;/strong&gt;. The project also includes deterministic scenario checks and a process-crash recovery demonstration.&lt;/p&gt;

&lt;p&gt;Those checks establish application behavior under controlled conditions. They are not a substitute for evaluating realistic family conversations.&lt;/p&gt;

&lt;p&gt;The dashboard helps connect both worlds: itinerary dependencies, evidence, verification records, proposal history, and delivery state can be inspected behind the chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 1 is the foundation
&lt;/h2&gt;

&lt;p&gt;Trippy already brings together conversation, sourced outing comparisons, accountable memory, image understanding, expense bookkeeping, reminders, visual plans, calendar exports, and simulated disruption recovery.&lt;/p&gt;

&lt;p&gt;But this is &lt;strong&gt;Phase 1&lt;/strong&gt;, not the finished product.&lt;/p&gt;

&lt;p&gt;My next priorities are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test more real multi-person conversations, including Hinglish, ambiguous references, and corrections.&lt;/li&gt;
&lt;li&gt;Improve provider fallbacks while preserving source and freshness labels.&lt;/li&gt;
&lt;li&gt;Gather better venue-level accessibility, walking, opening-hour, and rest information.&lt;/li&gt;
&lt;li&gt;Expand deployment monitoring and conversation-quality evaluations.&lt;/li&gt;
&lt;li&gt;Explore real travel-status events and booking handoffs with proper reconciliation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Trying Switch for the first time helped me move beyond “an AI that answers travel questions” toward a system where agents collaborate through explicit workflows.&lt;/p&gt;

&lt;p&gt;That is the part I am proudest of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The family gets one companion to talk to. Underneath, the system keeps track of evidence, ownership, decisions, and what actually happened.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SarveshDujari/Trippy---Travel-Companion" rel="noopener noreferrer"&gt;Check out Trippy’s code, architecture, and setup guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hackathon</category>
      <category>agents</category>
    </item>
    <item>
      <title>I Built an AI Food Scout Because “What Should I Eat?” Is a Surprisingly Hard Question 🍜</title>
      <dc:creator>Sarvesh</dc:creator>
      <pubDate>Sun, 25 Oct 2026 12:44:32 +0000</pubDate>
      <link>https://dev.to/sarvesh_3bcf0f427a27e1849/i-built-an-ai-food-scout-because-what-should-i-eat-is-a-surprisingly-hard-question-30of</link>
      <guid>https://dev.to/sarvesh_3bcf0f427a27e1849/i-built-an-ai-food-scout-because-what-should-i-eat-is-a-surprisingly-hard-question-30of</guid>
      <description>&lt;p&gt;This is a submission for the "Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady" (&lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;https://dev.to/challenges/hacktoberfest-week3-2026-10-19&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;You know the drill.&lt;/p&gt;

&lt;p&gt;You're hungry. You have a budget. Maybe you're trying to hit a protein target, stay under a calorie limit, or just eat something other than the same three meals you've been ordering for weeks.&lt;/p&gt;

&lt;p&gt;You open a food delivery app and start scrolling.Twenty minutes later, you've seen 47 dishes, opened six restaurant pages, and still have absolutely no idea what to order.&lt;/p&gt;

&lt;p&gt;The problem isn't a lack of food choices. It's having to do all the work of finding the right ones.&lt;/p&gt;

&lt;p&gt;That's why I built CraveCode, an AI-assisted food discovery system that searches for meals around your preferences, filters unsuitable options, and ranks the remaining choices.&lt;/p&gt;

&lt;p&gt;The goal? Less scrolling, less guesswork, and more time enjoying the food.&lt;/p&gt;

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

&lt;p&gt;CraveCode helps answer a deceptively difficult question:&lt;/p&gt;

&lt;p&gt;What can I eat that fits my goals, preferences, and budget?&lt;/p&gt;

&lt;p&gt;Instead of starting with a restaurant catalogue, you start with a meal brief.&lt;/p&gt;

&lt;p&gt;You can specify your dietary preference, protein target, calorie ceiling, budget, preferred cuisine, meal timing, and the kind of food you're craving.&lt;/p&gt;

&lt;p&gt;CraveCode then discovers candidates, filters them against your requirements, ranks them, and diversifies the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it different?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adaptive discovery: It starts with two menu queries in &lt;strong&gt;parallel&lt;/strong&gt; and can expand to a maximum of four initial discovery queries when the results lack sufficient variety or coverage.&lt;/li&gt;
&lt;li&gt;Constraint-aware filtering: It &lt;strong&gt;filters known unsuitable options&lt;/strong&gt;, including incompatible dietary flags, explicit exclusions, and items priced above your budget.&lt;/li&gt;
&lt;li&gt;Ranking beyond relevance: It considers factors such as query relevance, dish-family matches, price, stock status, and available restaurant feedback.&lt;/li&gt;
&lt;li&gt;Less repetitive recommendations: It removes duplicate items from the same restaurant and penalizes repetitive choices to encourage variety.&lt;/li&gt;
&lt;li&gt;Explore more: An, locally served Gemma model suggests additional dish-search terms when you want to discover beyond the initial results.&lt;/li&gt;
&lt;li&gt;Evidence over guesswork: Public web results are treated as discovery leads, not verified live menu items. Uncertain prices and broad nutrition estimates are not presented as confirmed facts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system can return up to 15 ranked options, with the actual number depending on the candidates available.&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%2Foglg2juh6az6k9vnlmto.jpg" 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%2Foglg2juh6az6k9vnlmto.jpg" alt="carvecode front" width="799" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interesting part isn't simply that an AI recommends food. It's that the application combines search, explicit constraints, deterministic ranking, and optional AI exploration rather than asking a language model to invent the entire answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try it: "CraveCode live preview" (&lt;a href="https://cravecode.onrender.com" rel="noopener noreferrer"&gt;https://cravecode.onrender.com&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Watch the demo: &lt;a href="https://youtu.be/DoDybTKEgkY?si=wDeZN4zPQzU3ZKSR" rel="noopener noreferrer"&gt;yt demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note about the render preview&lt;/strong&gt;: The public Render preview uses SerpApi for public web discovery. The richer signed-in Swiggy menu-search experience is supported through the local setup(As it requires swiggy production access which is under process). These are different discovery modes, and a public search result does not guarantee current availability or a verified menu price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quickest way to understand CraveCode is to see a complete search:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Enter a meal brief with a budget and nutrition goals.&lt;/li&gt;
&lt;li&gt;Watch the system discover and rank relevant options.&lt;/li&gt;
&lt;li&gt;Inspect the returned dishes, prices, and evidence labels.&lt;/li&gt;
&lt;li&gt;Use Explore more to look for additional dishes.&lt;/li&gt;
&lt;/ol&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%2F11ameqkm0pxffbbmjtct.jpg" 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%2F11ameqkm0pxffbbmjtct.jpg" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;br&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%2Fevl4cy7odktqhyyxyx68.jpg" 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%2Fevl4cy7odktqhyyxyx68.jpg" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;GitHub repository: "SarveshDujari/CraveCode" (&lt;a href="https://github.com/SarveshDujari/CraveCode" rel="noopener noreferrer"&gt;https://github.com/SarveshDujari/CraveCode&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;CraveCode is built with React, Vite, Node.js, TypeScript, and Mastra, with integrations for Gemma, MongoDB Atlas, SerpApi, and Render.&lt;/p&gt;

&lt;p&gt;Explore the repository to see how the search workflow, candidate filtering, ranking logic, and optional AI-powered dish expansion fit together.&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%2Fw38jc5ww5gj2rkttty86.jpg" 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%2Fw38jc5ww5gj2rkttty86.jpg" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I didn't want CraveCode to be a chatbot that returns a convincing paragraph about food and leaves the user to verify everything.&lt;/p&gt;

&lt;p&gt;I wanted a system that actually searches for candidates, applies rules, and explains what it knows.&lt;/p&gt;

&lt;p&gt;Here's the simplified architecture:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Meal brief
                 |
                 v
         React + Vite UI
                 |
                 v
      Node.js / TypeScript API
                 |
                 v
          Mastra workflow
      Plan -&amp;gt; Discover -&amp;gt; Verify
                 |
         +-------+-------+
         |               |
         v               v
     Swiggy MCP        SerpApi
   Local menu search   Public discovery
         |               |
         +-------+-------+
                 |
                 v
        Normalize candidates
                 |
                 v
       Filter -&amp;gt; Score -&amp;gt; Diversify
                 |
                 v
         Ranked recommendations

      Extra integration:local Gemma, MongoDB Atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mastra&lt;/strong&gt;: orchestrating the discovery workflow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mastra provides the workflow structure for planning discovery, retrieving candidates, and processing the results.&lt;/p&gt;

&lt;p&gt;The key design decision is that orchestration doesn't own every business rule. The workflow connects the discovery stages, while the application code handles important eligibility checks and ranking decisions.&lt;/p&gt;

&lt;p&gt;That makes the system easier to inspect, debug, and improve than a single prompt responsible for the entire process.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Swiggy MCP&lt;/strong&gt;: searching actual menus&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The signed-in local setup can use Swiggy MCP to search menus associated with a saved delivery address.&lt;/p&gt;

&lt;p&gt;This enables a richer discovery experience using returned menu information, including prices and availability-related signals where provided.&lt;/p&gt;

&lt;p&gt;I keep this distinct from the hosted preview. The existence of a restaurant page is not equivalent to a confirmed, currently orderable menu item.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SerpApi&lt;/strong&gt;: a public discovery fallback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Render preview uses SerpApi to find relevant, city-specific Swiggy pages.&lt;/p&gt;

&lt;p&gt;The application checks query relevance, retains suitable delivery-page URLs, and removes duplicates and generic results.&lt;/p&gt;

&lt;p&gt;These results are treated as leads for discovery, not as verified menu data. That distinction matters because a search engine cannot guarantee a dish's current price, stock, nutrition, or delivery eligibility.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt;: an local AI feature&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CraveCode uses a locally served Gemma model for the Explore more dishes feature.&lt;/p&gt;

&lt;p&gt;Instead of asking the model to rank every item or decide whether a meal satisfies every hard constraint, I use it for a focused task: proposing additional dish-search terms.&lt;/p&gt;

&lt;p&gt;The application validates those suggestions against an allowlist and structured-output requirements. If the output is malformed or unsuitable, deterministic fallback choices are available.&lt;/p&gt;

&lt;p&gt;This keeps the AI feature useful without making the entire application dependent on a model endpoint.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas&lt;/strong&gt;: persistence and usage controls&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MongoDB Atlas supports persistence for completed searches, candidates, and shared usage-budget counters.&lt;/p&gt;

&lt;p&gt;Those counters are especially important when the public preview relies on an external search service. If the hosted budget store is unavailable, paid SerpApi requests are stopped rather than proceeding without the intended shared budget protection.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt;: making the project accessible&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Render hosts the public preview, so people can try the interface without setting up the full local environment.&lt;/p&gt;

&lt;p&gt;The deployment has its own limitations, particularly around signed-in menu access. Documenting those limitations makes the demo more honest and helps developers understand what they need to reproduce the richer local experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering principle tying it together
&lt;/h2&gt;

&lt;p&gt;The model proposes. The application checks. The evidence determines what can be claimed.&lt;/p&gt;

&lt;p&gt;For example, a model-generated dish idea still needs to pass through the discovery pipeline. A public search result doesn't become a verified menu item just because it looks relevant. And a broad nutrition estimate doesn't become a restaurant-specific nutritional fact.&lt;/p&gt;

&lt;p&gt;That separation is the core of how I approached the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Didn't Let AI Decide Everything
&lt;/h2&gt;

&lt;p&gt;An LLM can suggest the perfect meal, but it can't guarantee that the dish is available, affordable, or nutritionally accurate.&lt;/p&gt;

&lt;p&gt;So I split the responsibilities: Gemma explores new dishes, search discovers candidates, and deterministic code handles filtering and ranking. Uncertain prices and nutrition estimates remain just that: estimates.&lt;/p&gt;

&lt;p&gt;This made CraveCode easier to debug and gave me more control over its recommendations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd improve next
&lt;/h2&gt;

&lt;p&gt;Nutrition is the biggest opportunity.&lt;br&gt;
CraveCode currently uses broad, hand-authored nutrition ranges for supported dish types. They are estimates, not verified values for a particular restaurant's recipe or serving.&lt;/p&gt;

&lt;p&gt;I'd like to improve that with more reliable item-level nutrition data, stronger evaluation of live discovery, and clearer verification of final payable prices and availability.&lt;/p&gt;

&lt;p&gt;Also would like to add the swiggy integration to render after getting approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The intended payoff is straightforward: less manual searching, less repetitive scrolling, and fewer unsuitable choices to inspect.&lt;/p&gt;

&lt;p&gt;Instead of separately browsing restaurant pages, checking every dish against a budget, and comparing a long list of similar items, a user can start with their constraints and receive a filtered, ranked shortlist.&lt;/p&gt;

&lt;p&gt;The right way to measure this would be to compare the time needed to find a suitable meal manually against the time needed with CraveCode, across several realistic meal briefs.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Render: the deployed public preview.&lt;/li&gt;
&lt;li&gt;Best Use of Gemma: optional local model inference for additional dish discovery.&lt;/li&gt;
&lt;li&gt;Best Use of Mastra: the structured discovery workflow.&lt;/li&gt;
&lt;li&gt;Best Use of MongoDB Atlas: persistence and shared search-usage controls.&lt;/li&gt;
&lt;li&gt;Best Use of SerpApi: public web discovery for the hosted preview.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Try CraveCode&lt;/p&gt;

&lt;p&gt;Live preview: &lt;a href="https://cravecode.onrender.com" rel="noopener noreferrer"&gt;https://cravecode.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/SarveshDujari/CraveCode" rel="noopener noreferrer"&gt;https://github.com/SarveshDujari/CraveCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo video: [&lt;a href="https://youtu.be/DoDybTKEgkY?si=wDeZN4zPQzU3ZKSR" rel="noopener noreferrer"&gt;https://youtu.be/DoDybTKEgkY?si=wDeZN4zPQzU3ZKSR&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The inspection machine was working. The order was still late. So I built FactoryGraph.</title>
      <dc:creator>Sarvesh</dc:creator>
      <pubDate>Sun, 18 Oct 2026 14:27:06 +0000</pubDate>
      <link>https://dev.to/sarvesh_3bcf0f427a27e1849/the-inspection-machine-was-working-the-order-was-still-late-so-i-built-factorygraph-1ion</link>
      <guid>https://dev.to/sarvesh_3bcf0f427a27e1849/the-inspection-machine-was-working-the-order-was-still-late-so-i-built-factorygraph-1ion</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A machine breaks down at eight in the morning.&lt;/p&gt;

&lt;p&gt;There is another machine in the workshop. The inspection bench is working. People are available.&lt;/p&gt;

&lt;p&gt;So why might the customer’s order still arrive late?&lt;/p&gt;

&lt;p&gt;Because those facts, individually, don’t tell you whether recovery is possible. The replacement machine might already be booked. The available worker might not be qualified to use it. Inspection might be waiting for parts that haven’t been made yet.&lt;/p&gt;

&lt;p&gt;That connected problem is what I wanted to explore with &lt;strong&gt;FactoryGraph&lt;/strong&gt;, a factory operations copilot for small manufacturers.&lt;/p&gt;

&lt;p&gt;An operator configures the factory, reports a breakdown, and gets a traceable view of the consequences. FactoryGraph compares feasible recovery options, estimates their operational costs, and shows the assignments that would change.&lt;/p&gt;

&lt;p&gt;The operator reviews and approves the response. After the repair, its actual outcome becomes evidence for future planning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FalkorDB connects the factory. Deterministic rules calculate the options. Local Gemma helps explain them. The operator approves the changes.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&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%2Fe4s2jg9wxi301ii3frmk.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%2Fe4s2jg9wxi301ii3frmk.png" alt="Exposure Recovery Comparion" width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: Waiting and recovery are compared using the same configured factory assumptions. The proposed assignments remain unchanged until approval.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Who would pay for this?
&lt;/h3&gt;

&lt;p&gt;My starting audience would be owners and production supervisors at small machining or fabrication workshops: businesses with a few connected production stages, qualified operators, and customer deadlines to protect.&lt;/p&gt;

&lt;p&gt;The service I would offer is &lt;strong&gt;factory setup plus ongoing planning support&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The initial work would involve mapping their machines, dependencies, shifts and cost assumptions. The recurring value would come from helping them evaluate disruptions and retain useful repair and supplier history.&lt;/p&gt;

&lt;p&gt;A pricing experiment I would test is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Offering&lt;/th&gt;
&lt;th&gt;Proposed price&lt;/th&gt;
&lt;th&gt;What the customer receives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Assisted setup&lt;/td&gt;
&lt;td&gt;₹4,999 or $53 once&lt;/td&gt;
&lt;td&gt;Help configuring one workshop and validating its initial assumptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop plan&lt;/td&gt;
&lt;td&gt;₹1,499 or $16/month&lt;/td&gt;
&lt;td&gt;Application updates, support and periodic configuration reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration work&lt;/td&gt;
&lt;td&gt;Quoted separately&lt;/td&gt;
&lt;td&gt;Future imports or connections to existing operational systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are hypotheses, not validated prices. I haven’t established willingness to pay, and there is no billing integration in the current application.&lt;/p&gt;

&lt;p&gt;Before adding checkout, I would want a workshop to use the product and answer a more important question: &lt;strong&gt;does this make their next recovery decision easier?&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;The recording starts with the guided walkthrough, then moves into the full operational workspace.&lt;/p&gt;

&lt;p&gt;The example is deliberately small enough to follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CNC One stops at 8 AM.&lt;/li&gt;
&lt;li&gt;The estimated repair takes two hours.&lt;/li&gt;
&lt;li&gt;Cutting affects inspection.&lt;/li&gt;
&lt;li&gt;The customer needs the brackets by 2 PM.&lt;/li&gt;
&lt;li&gt;Waiting projects a 3 PM finish.&lt;/li&gt;
&lt;li&gt;The demonstrated recovery projects completion by 2 PM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this synthetic configuration, the waiting baseline is &lt;strong&gt;₹4,000&lt;/strong&gt;, compared with &lt;strong&gt;₹3,750&lt;/strong&gt; for the selected recovery: &lt;strong&gt;₹250 in estimated cost avoided&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is a result from configured demonstration rates, not measured savings from a real factory. The customer order’s ₹40,000 value is also separate from the estimated operational loss.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I added a Guide
&lt;/h3&gt;

&lt;p&gt;While preparing the demo, I realised I needed help explaining my own interface.&lt;/p&gt;

&lt;p&gt;The application had the pieces, but moving between screens didn’t automatically explain how those pieces belonged together.&lt;/p&gt;

&lt;p&gt;That led to the eight-step Guide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Factory → Breakdown → Impact → Recovery → Approval → Repair → Restoration → Memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It uses the actual application APIs and saved proposals in a separate practice factory. The walkthrough is another way to use the workflow, rather than an animation showing a predetermined success.&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%2Fbof0ewgflms191ld3tcn.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%2Fbof0ewgflms191ld3tcn.png" alt="Guide’s production dependency chain" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: Inspection needs finished parts. Showing that dependency first makes the later disruption easier to understand.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The full workspace separates the operational responsibilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;The question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exposure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How is this factory configured, what could the disruption cost, and which recovery should we review?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Floor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What work is assigned to each machine, and when?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Which connected stages and customer orders are affected?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Materials&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Are stock availability or supplier deliveries constraining recovery?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What happened previously that could inform the next estimate?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;FactoryGraph currently runs locally. The video demonstrates the application with synthetic factory data; live machinery integration is future work.&lt;/p&gt;

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

&lt;p&gt;The implementation, setup instructions, architecture and tests are available here:&lt;/p&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/SarveshDujari" rel="noopener noreferrer"&gt;
        SarveshDujari
      &lt;/a&gt; / &lt;a href="https://github.com/SarveshDujari/FactoryGraph" rel="noopener noreferrer"&gt;
        FactoryGraph
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;FactoryGraph&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;When a machine stops, understand the impact before making the next move.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;FactoryGraph is a factory operations copilot for small manufacturers. It connects machines, production stages, qualified workers, materials and customer orders in &lt;strong&gt;FalkorDB&lt;/strong&gt;, traces the consequences of a breakdown, calculates feasible recovery options and estimated financial exposure, and lets an operator approve the response.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Connected factory context · Deterministic planning · Human approval · Sourced memory · Local Gemma briefings&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This repository contains a working local demonstration with synthetic factory data. Financial results are estimates from configured rates. Machine-health readings are explicitly simulated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#the-problem" rel="noopener noreferrer"&gt;The problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#what-factorygraph-does" rel="noopener noreferrer"&gt;What FactoryGraph does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#screenshots" rel="noopener noreferrer"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#technology-stack" rel="noopener noreferrer"&gt;Technology stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#graph-data-model" rel="noopener noreferrer"&gt;Graph data model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#recovery-workflow" rel="noopener noreferrer"&gt;Recovery workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#scheduling-and-financial-calculations" rel="noopener noreferrer"&gt;Scheduling and financial calculations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#gemma-and-the-ai-boundary" rel="noopener noreferrer"&gt;Gemma and the AI boundary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#memory-maintenance-and-procurement" rel="noopener noreferrer"&gt;Memory, maintenance and procurement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#configuration" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#complete-demo-walkthrough" rel="noopener noreferrer"&gt;Complete demo walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#interface-guide" rel="noopener noreferrer"&gt;Interface guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#api-reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#command-line-tools" rel="noopener noreferrer"&gt;Command-line tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#repository-structure" rel="noopener noreferrer"&gt;Repository structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#testing-and-verification" rel="noopener noreferrer"&gt;Testing and verification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#persistence-and-shop-isolation" rel="noopener noreferrer"&gt;Persistence and shop isolation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph#current-limits" rel="noopener noreferrer"&gt;Current limits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The problem&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;A…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/SarveshDujari/FactoryGraph" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/SarveshDujari/FactoryGraph" rel="noopener noreferrer"&gt;Browse the FactoryGraph repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the most interesting implementation details, start with the &lt;a href="https://github.com/SarveshDujari/FactoryGraph/blob/main/src/factory_graph/briefing.py" rel="noopener noreferrer"&gt;grounded Gemma briefing&lt;/a&gt;, the &lt;a href="https://github.com/SarveshDujari/FactoryGraph/blob/main/src/factory_graph/static/guided-demo.js" rel="noopener noreferrer"&gt;guided workflow&lt;/a&gt;, and the &lt;a href="https://github.com/SarveshDujari/FactoryGraph#architecture" rel="noopener noreferrer"&gt;architecture documentation in the README&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Represent the relationships before asking for recommendations
&lt;/h3&gt;

&lt;p&gt;The factory is represented in FalkorDB through connected operational entities: machines, jobs, operators, materials and customer orders.&lt;/p&gt;

&lt;p&gt;Those relationships let the application follow a disruption beyond its immediate location.&lt;/p&gt;

&lt;p&gt;A machine failure affects a production stage. That stage may block another stage. Those stages contribute to a customer order.&lt;/p&gt;

&lt;p&gt;This makes the impact inspectable. An operator can follow the path behind an affected order instead of accepting an unexplained warning.&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%2Fe1yjafjv4350kf02h5xd.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%2Fe1yjafjv4350kf02h5xd.png" alt="Falkordb_graph" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: The affected customer order is connected to the failed machine through recorded production dependencies.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep scheduling and money in deterministic code
&lt;/h3&gt;

&lt;p&gt;I wanted the AI boundary to be clear.&lt;/p&gt;

&lt;p&gt;The planner checks machine suitability, operator qualifications, existing bookings, shifts, permitted overtime, dependencies and material readiness.&lt;/p&gt;

&lt;p&gt;The financial calculation uses configured rates for components such as equipment downtime, waiting labour, changeovers, repair labour and order delay penalties.&lt;/p&gt;

&lt;p&gt;Money is stored as integer paise.&lt;/p&gt;

&lt;p&gt;This also exposes trade-offs that an optimistic summary could miss. Moving production elsewhere may protect a deadline, but it does not erase the broken machine’s downtime cost. A changeover can add cost even when the overall recovery is preferable.&lt;/p&gt;

&lt;p&gt;The planner is bounded and designed around small modeled factories. It does not claim industrial-scale optimal scheduling.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Give Gemma a useful, restricted responsibility
&lt;/h3&gt;

&lt;p&gt;FactoryGraph uses &lt;strong&gt;Gemma 3 4B locally through Ollama&lt;/strong&gt; for the recovery briefing.&lt;/p&gt;

&lt;p&gt;Its responsibility is to help a beginner notice the important facts in an already calculated proposal.&lt;/p&gt;

&lt;p&gt;The application prepares a set of supported facts. Gemma selects identifiers for the summary, trade-offs and review checks. The server validates those identifiers and renders the corresponding text.&lt;/p&gt;

&lt;p&gt;That means the recovery briefing cannot introduce an invented rupee amount or a new machine assignment.&lt;/p&gt;

&lt;p&gt;The application also always includes the cost comparison and the reminder that approval belongs to the operator. Those essential details do not depend on the model remembering to mention them.&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%2F9ys30o3gxr74heqvndh3.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%2F9ys30o3gxr74heqvndh3.png" alt="gemma" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caption: Gemma selects relevant points from calculated evidence. It has no production mutation or approval tools.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Treat model failure as an expected condition
&lt;/h3&gt;

&lt;p&gt;During development, the briefing sometimes showed a rule-based fallback. That was a useful reminder that connecting a model is only part of the job.&lt;/p&gt;

&lt;p&gt;A local model can be unavailable, take too long to load, or return an unsupported response.&lt;/p&gt;

&lt;p&gt;The briefing now uses a constrained selection schema, validates its output, and distinguishes failure reasons such as an unreachable service, missing model, timeout or invalid response.&lt;/p&gt;

&lt;p&gt;If generation fails, the application identifies the fallback and keeps the recovery workflow available.&lt;/p&gt;

&lt;p&gt;I would rather show an honest, limited explanation than make a model’s availability a requirement for reviewing a calculated plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Approve the exact proposal that was reviewed
&lt;/h3&gt;

&lt;p&gt;A recommendation is useful only if the approval refers to the same recommendation.&lt;/p&gt;

&lt;p&gt;The server creates a canonical hash for a proposal. Approval submits that hash, and the application checks ownership, proposal status, revision and current planning context.&lt;/p&gt;

&lt;p&gt;If the context changes, the operator must reanalyse rather than apply an old proposal.&lt;/p&gt;

&lt;p&gt;Repair completion is separate, too. Recording that a machine is available does not silently move work back. Restoration gets its own review.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the pieces fit together
&lt;/h3&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%2Fh4y9sd053l2trk5srydz.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%2Fh4y9sd053l2trk5srydz.png" alt="full architecture" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Suggested diagram: Browser → FastAPI → FalkorDB and planning logic; FastAPI → Ollama/Gemma for read-only briefings; LangGraph → saved day-based workflow checkpoints.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The browser interface is built with HTML, CSS and JavaScript. FastAPI handles the application endpoints. FalkorDB stores connected factory context and operational records.&lt;/p&gt;

&lt;p&gt;LangGraph manages the separate day-based recovery workflow with saved checkpoints. The hourly breakdown workflow shown in the Guide uses its own saved reviews and approval endpoints; it is not simply one long language-model conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I verified
&lt;/h3&gt;

&lt;p&gt;The latest local verification included &lt;strong&gt;61 passing backend tests&lt;/strong&gt;, &lt;strong&gt;five frontend tests&lt;/strong&gt;, and a packaged Linux smoke check.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Evidence checked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can approval apply an altered or outdated proposal?&lt;/td&gt;
&lt;td&gt;Tests cover proposal tampering and stale planning context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can another workspace’s data leak into the Guide?&lt;/td&gt;
&lt;td&gt;Frontend checks cover scope boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does clicking through explanatory screens change production?&lt;/td&gt;
&lt;td&gt;Navigation is checked separately from mutation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can the workflow continue without Gemma?&lt;/td&gt;
&lt;td&gt;Briefing failure and deterministic fallback are tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does the complete example work through the interface?&lt;/td&gt;
&lt;td&gt;Browser walkthrough covers recovery, repair, restoration and memory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These checks establish behavior in the demonstrated environment. They do not establish real-world savings, factory-scale performance or production readiness.&lt;/p&gt;

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

&lt;p&gt;A factory’s order deadlines, operating rates and recovery choices can be sensitive business information.&lt;/p&gt;

&lt;p&gt;Running Gemma locally means the briefing does not require sending that factory context to an external model API. After the model and dependencies are installed, the local inference path does not need a hosted inference service.&lt;/p&gt;

&lt;p&gt;It also gives me control over the model, schema and failure handling. I can change the briefing behavior without rewriting the scheduling rules or tying the product to one provider’s inference pricing.&lt;/p&gt;

&lt;p&gt;There are still costs: hardware, electricity, setup and support. A cold model can also take time to load. Local inference makes those trade-offs mine to manage; it does not make them disappear.&lt;/p&gt;

&lt;p&gt;Open-source frameworks matter beyond inference as well. LangGraph provides inspectable workflow machinery, while the surrounding application can preserve explicit boundaries between reading context, proposing work and approving changes.&lt;/p&gt;

&lt;p&gt;A hosted API could support a similar design. The advantage here is being able to offer the local deployment model and control that this particular customer might value.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I would build next
&lt;/h3&gt;

&lt;p&gt;Before adding more AI features, I would prioritise:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A workshop pilot:&lt;/strong&gt; validate the configuration against actual scheduling habits and recorded breakdowns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier onboarding:&lt;/strong&gt; import existing machine, order and shift data instead of entering everything manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A paid-service foundation:&lt;/strong&gt; accounts, subscriptions, backups and support tooling once the pilot establishes value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Live telemetry is another direction, but the current machine-health readings are simulated. I would not describe them as failure prediction.&lt;/p&gt;

&lt;p&gt;The next milestone I care about is a workshop supervisor being able to inspect a recovery and say, “Yes, that matches how our floor works.”&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FactoryGraph runs Gemma 3 4B locally through Ollama to select useful briefing points from calculated factory facts. Its output is validated, its operational permissions are restricted, and the workflow remains available when inference fails.&lt;/p&gt;




&lt;p&gt;Building FactoryGraph made me appreciate how much happens between “a machine stopped” and “we know what to do.”&lt;/p&gt;

&lt;p&gt;The schedule, the dependencies, the customer promise, the cost assumptions and the repair history all have to meet somewhere.&lt;/p&gt;

&lt;p&gt;That is the product I want to keep building: a place where a small workshop can bring those facts together and make its next decision with more confidence.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>showdev</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I Built a Pokédex for My Neighbourhood - Because “Go Outside” Needed Better Instructions</title>
      <dc:creator>Sarvesh</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:29:49 +0000</pubDate>
      <link>https://dev.to/sarvesh_3bcf0f427a27e1849/i-built-a-pokedex-for-my-neighbourhood-because-go-outside-needed-better-instructions-2d6l</link>
      <guid>https://dev.to/sarvesh_3bcf0f427a27e1849/i-built-a-pokedex-for-my-neighbourhood-because-go-outside-needed-better-instructions-2d6l</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;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%2F45w62hxy8y1uhviltc3z.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%2F45w62hxy8y1uhviltc3z.png" alt="Login page" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;“Okay, I should go outside.”&lt;/p&gt;

&lt;p&gt;Then comes the surprisingly difficult follow-up:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And do what?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the problem isn’t that going outside sounds bad. It’s that staying home already has a plan. Open an app. Scroll. Watch something. Somehow, an hour disappears.&lt;/p&gt;

&lt;p&gt;Outside has possibilities, but no obvious starting point.&lt;/p&gt;

&lt;p&gt;I wanted to make that starting point a little more interesting.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;NeighbourDex&lt;/strong&gt;, a web app that turns a neighbourhood into a small, collectible adventure. Think Pokédex, except your next discovery might be a snack, a park, a landmark, or an interesting texture on a wall.&lt;/p&gt;

&lt;p&gt;The collection fills up with photographs you take while exploring.&lt;/p&gt;

&lt;h3&gt;
  
  
  A smaller adventure felt like a better adventure
&lt;/h3&gt;

&lt;p&gt;My first idea was to generate a guide for an entire city.&lt;/p&gt;

&lt;p&gt;But “explore Tokyo” is a big assignment. “Find something interesting around Shibuya” feels like something you could actually do this afternoon.&lt;/p&gt;

&lt;p&gt;That became the scope: pick a neighbourhood, get a manageable collection, and choose one thing to try.&lt;/p&gt;

&lt;p&gt;After creating an account, you can add multiple neighbourhood adventures. Enter the locality and city, confirm the suggested starting point, and choose a three- or five-kilometre search radius.&lt;/p&gt;

&lt;p&gt;A standard collection contains &lt;strong&gt;10–12 cards&lt;/strong&gt;, covering food, landmarks, nature, and two discovery prompts. If the area has fewer suitable results, you can explicitly allow a smaller guide.&lt;/p&gt;

&lt;p&gt;No imaginary park gets added just to make the numbers look good.&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%2Flpmemc1mkraqyklnlmog.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%2Flpmemc1mkraqyklnlmog.png" alt="neighbourhood panel showing locality confirmation, radius, and compact-guide option" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Your neighbourhood gets side quests
&lt;/h3&gt;

&lt;p&gt;Each card gives you a small mission, an estimated duration, and instructions about what to photograph.&lt;/p&gt;

&lt;p&gt;You might photograph food or a drink at a nearby spot, look for greenery in a park, or capture a recognizable feature of a landmark. The discovery cards ask you to notice things such as surface textures and the sky.&lt;/p&gt;

&lt;p&gt;Those last two matter to me. Exploring shouldn’t always require buying something or finding a famous attraction. Sometimes a worthwhile discovery is already on the street you walk down every day.&lt;/p&gt;

&lt;p&gt;You can filter the cards by category or collection status, switch to a map, open a numbered pin, check a place’s source, and get directions.&lt;/p&gt;

&lt;p&gt;Pick a quest. Put the screen away. Give the neighbourhood a chance.&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%2Fjpshdwuqwqbefhgj4xaa.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%2Fjpshdwuqwqbefhgj4xaa.png" alt="card grid with different categories" width="757" height="680"&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%2Fcsbshoi37kn0pdtnuobp.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%2Fcsbshoi37kn0pdtnuobp.png" alt="Map view" width="799" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The reward is a memory you made
&lt;/h3&gt;

&lt;p&gt;When you take or upload a photo, Gemma reviews the visible evidence against the card’s requirements.&lt;/p&gt;

&lt;p&gt;A matching photo unlocks the card and becomes its artwork. You can add a short memory note, and your progress earns explorer stamps.&lt;/p&gt;

&lt;p&gt;An uncertain or unrelated photo leaves the card undiscovered, with feedback so you can try again.&lt;/p&gt;

&lt;p&gt;There’s an important boundary here: a photograph can show food, greenery, or a recognizable landmark. It cannot reliably prove where you were or when you visited. NeighbourDex treats this as a playful collection, rather than a location-verification system.&lt;br&gt;
Once you have collected a few cards, you can create a postcard: choose up to four photographs, optionally include your username, preview it, and download the image.Nothing gets posted automatically. You decide which memories leave the app.&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%2Fe3n7trooedmc1pxmgx6m.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%2Fe3n7trooedmc1pxmgx6m.png" alt="collected card with its photograph" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://youtu.be/9pbhOmn5MLU" rel="noopener noreferrer"&gt;youtube demo video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo follows the complete journey:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an account → add a neighbourhood → generate a guide → explore a card → submit a photo → collect it → make a postcard.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The current version runs locally, with Ollama running on the same computer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/SarveshDujari/NeighbourDex" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project includes an MIT license and setup instructions in the README.&lt;/p&gt;

&lt;p&gt;To run it locally, you need Node.js 24 or later, a SerpApi key, and Ollama with &lt;code&gt;gemma3:4b&lt;/code&gt; installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;ollama pull gemma3:4b
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure the SerpApi key in the server’s &lt;code&gt;.env&lt;/code&gt; file, keep Ollama running, and open &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;I used a small stack: &lt;strong&gt;HTML, CSS, JavaScript, Node.js, SQLite, SerpApi, and Gemma 3 4B through Ollama&lt;/strong&gt;. Leaflet provides the map interface, and Sharp processes uploaded images.&lt;/p&gt;

&lt;p&gt;The interface has a field-guide feel: numbered entries, soft colours, category badges, and photographs that gradually replace the empty card artwork.&lt;/p&gt;

&lt;p&gt;I wanted opening the app to feel like unfolding a little adventure booklet.&lt;/p&gt;

&lt;h3&gt;
  
  
  The architecture
&lt;/h3&gt;

&lt;p&gt;There are two main paths through the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create an adventure
Browser → Node.js → SerpApi place searches
                  → Filter nearby places
                  → Local Gemma writes titles
                  → SQLite saves the collection

Collect a card
Photo → Node.js → Normalize image
               → Local Gemma observes and compares
               → Save review and collection progress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SerpApi supplies the place data.&lt;/strong&gt; Its Google Maps results help resolve the neighbourhood and find nearby food spots, landmarks, and nature locations. The server removes duplicates, excludes places outside the chosen radius, and retains source links and coordinates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma supplies the language and visual review.&lt;/strong&gt; During generation, it writes playful titles for the sourced entries. During photo review, it first describes the image without seeing the quest, then compares those observations with the required evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The application code sets the rules.&lt;/strong&gt; Place identities, missions, evidence requirements, and collection updates are controlled and validated by the server.&lt;/p&gt;

&lt;p&gt;SQLite stores accounts, sessions, collections, notes, reviews, caches, and queued jobs. Photos stay in private server storage and are available only to their owning account.&lt;/p&gt;

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

&lt;p&gt;For NeighbourDex, running an open-weight model locally changed what I could experiment with.&lt;/p&gt;

&lt;p&gt;I could adjust prompts, test bad outputs, and refine the photo-review flow without paying for every model request. Uploaded photos go to my configured local Ollama instance rather than a hosted AI service. It also leaves room to change the model. The app defaults to &lt;code&gt;gemma3:4b&lt;/code&gt;, but the inference configuration can point to another compatible model as the hardware or project evolves.This doesn’t make the whole application offline. SerpApi searches and map tiles still need internet access. The local model specifically gives me control over the inference step.&lt;/p&gt;

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

&lt;p&gt;I built and refined NeighbourDex with help from AI Tools, working through the account system, place-search pipeline, local inference, photo reviews, and interface improvements.&lt;/p&gt;

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

&lt;p&gt;I’m entering these categories from the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;challenge’s category list&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Local Gemma 3 4B powers quest-title generation and photo-evidence review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi:&lt;/strong&gt; Google Maps searches ground the adventures in nearby places, with coordinates and source links.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I started with a simple frustration: wanting to go outside, but having no particular reason to leave.&lt;/p&gt;

&lt;p&gt;NeighbourDex gives that moment a small next step.&lt;/p&gt;

&lt;p&gt;A place to try. Something to notice. A photograph to keep.&lt;/p&gt;

&lt;p&gt;And, hopefully, an afternoon that doesn’t disappear into the scroll. Cheers!&lt;/p&gt;

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