<?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: Shubham Hagawane</title>
    <description>The latest articles on DEV Community by Shubham Hagawane (@shubham_hagawane_e0537f48).</description>
    <link>https://dev.to/shubham_hagawane_e0537f48</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%2F4169714%2F0565ef6e-bacb-41ee-b9ca-1f7170da1c56.jpeg</url>
      <title>DEV Community: Shubham Hagawane</title>
      <link>https://dev.to/shubham_hagawane_e0537f48</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubham_hagawane_e0537f48"/>
    <language>en</language>
    <item>
      <title>Terminal Déjà Vu: I Got Tired of Solving the Same Error Twice, So My Terminal Now Remembers</title>
      <dc:creator>Shubham Hagawane</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:58:20 +0000</pubDate>
      <link>https://dev.to/shubham_hagawane_e0537f48/terminal-deja-vu-i-got-tired-of-solving-the-same-error-twice-so-my-terminal-now-remembers-1fcj</link>
      <guid>https://dev.to/shubham_hagawane_e0537f48/terminal-deja-vu-i-got-tired-of-solving-the-same-error-twice-so-my-terminal-now-remembers-1fcj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
Every developer has the same quiet ritual: a command fails, you paste the error into a search engine, you land on a familiar answer, and you think I have definitely fixed this before. You did. You just don't remember where.&lt;br&gt;
Terminal Déjà Vu is a local-first CLI tool that remembers for you. When a command fails, it searches your own past fixes and tells you: "You solved something like this on [date]. Here's what worked." If it has never seen the error, it falls back to a local model that explains the failure in plain language.&lt;br&gt;
No cloud API. No account. Nothing leaves your machine.&lt;/p&gt;

&lt;p&gt;Who It's For&lt;br&gt;
Anyone who lives in a terminal and keeps rediscovering the same fixes: port already in use, npm dependency conflicts, git detached HEAD, permission denied, MongoDB connection refused. That is most of us, and especially students and juniors who haven't yet built up muscle memory.&lt;/p&gt;

&lt;p&gt;Demo&lt;br&gt;
The flow in about 30 seconds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A command fails: node server.js throws EADDRINUSE.&lt;/li&gt;
&lt;li&gt;I run dejavu why.&lt;/li&gt;
&lt;li&gt;It answers: "You solved something like this on [date]: lsof -i :3000, then kill the process." It also adds one line adapting the fix to the current port.&lt;/li&gt;
&lt;li&gt;A brand new error gets a clearly labeled "no past fix found" explanation from a local Gemma model.&lt;/li&gt;
&lt;li&gt;After I fix it, dejavu save stores the fix, so next time it's instant.
Code: [&lt;a href="https://github.com/ShubhamHagawane/Terminal-D-j-Vu.git" rel="noopener noreferrer"&gt;https://github.com/ShubhamHagawane/Terminal-D-j-Vu.git&lt;/a&gt;]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Sloth Angle&lt;br&gt;
The theme was building something that does the work so you don't have to, so I made the tool lazy in the right ways:&lt;br&gt;
• You do nothing to capture data. A tiny shell hook records failures in the background, and the prompt never slows down.&lt;br&gt;
• It indexes lazily. A "sloth mode" indexer embeds new items in small batches, sleeps between them, and backs off when the laptop is on battery or busy.&lt;br&gt;
• It saves effort on repeat. Solve a problem once and you never really solve it again.&lt;/p&gt;

&lt;p&gt;How I Built It&lt;br&gt;
The design decisions that mattered most:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Normalize before embedding. Error messages are full of paths, ports, line numbers, and hashes. I strip those out first, so "same error, different project" still matches. This single step improved retrieval more than any model change.&lt;/li&gt;
&lt;li&gt;Redact before storing. Shell history is full of tokens, passwords, and API keys. A redaction step masks likely secrets before anything touches disk, and it has its own tests.&lt;/li&gt;
&lt;li&gt;Keep the model on a short leash. When a past fix is found, the prompt contains only that fix and the current error, and tells Gemma not to invent extra steps. The model adapts your answer; it doesn't replace it.&lt;/li&gt;
&lt;li&gt;Degrade gracefully. If Ollama isn't running, the tool falls back to keyword search and says so, instead of failing.
I built this in four parts (foundation, retrieval, the Gemma layer, then stats and polish) and tested each one before starting the next.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why Open Innovation Matters Here&lt;br&gt;
This project only makes sense with open models.&lt;br&gt;
Privacy is the whole point. Your shell history contains hostnames, file paths, internal project names, and sometimes secrets you pasted by accident. A tool that sends that to a cloud API is a liability. Running Gemma and the embedding model locally means the data physically cannot leave your machine.&lt;br&gt;
It works offline. I turned Wi-Fi off and ran the same demo. Nothing changed, because nothing was ever online. A closed API would have stopped working the moment I lost connection, which is exactly when I'm most likely to be debugging on a train or in a dorm with bad Wi-Fi.&lt;br&gt;
It costs nothing to run. A tool that runs on every failed command would be expensive per call with a paid API. Locally, it's free forever, so I can run it as often as I like.&lt;br&gt;
I can see inside it. Because the models and the code are open, I could inspect exactly what gets sent to the model and tighten the prompt. With a hosted model, that's a black box.&lt;/p&gt;

&lt;p&gt;Prize Category&lt;br&gt;
Best Use of Gemma: Gemma generates the plain-language explanations and adapts a saved fix to the current error, all running locally through Ollama. [CONFIRM WHICH GEMMA VARIANT YOU USED AND WHY.]&lt;br&gt;
What I'd Build Next&lt;br&gt;
• Mining shell history to suggest fixes automatically, by spotting a failed command followed by a successful variation&lt;br&gt;
• PowerShell and fish support&lt;br&gt;
• Sharing a fix library with a teammate through an opt-in, redacted export&lt;br&gt;
Try It&lt;br&gt;
git clone [&lt;a href="https://github.com/ShubhamHagawane/Terminal-D-j-Vu.git" rel="noopener noreferrer"&gt;https://github.com/ShubhamHagawane/Terminal-D-j-Vu.git&lt;/a&gt;]&lt;br&gt;
cd terminal-deja-vu&lt;br&gt;
npm install&lt;br&gt;
ollama pull nomic-embed-text &amp;amp;&amp;amp; ollama pull [gemma2:2b]&lt;br&gt;
node demo/seed.js        # optional: load sample fixes&lt;br&gt;
dejavu init --shell zsh  # follow the printed instructions&lt;br&gt;
If it saves you from solving the same error twice, that's the whole job done. Thanks for reading, and happy Hacktoberfest!&lt;br&gt;
Built for the Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>PrivateDesk: Ask Your Office PDFs Anything, Answered Locally With Page Citations</title>
      <dc:creator>Shubham Hagawane</dc:creator>
      <pubDate>Sat, 17 Oct 2026 19:04:17 +0000</pubDate>
      <link>https://dev.to/shubham_hagawane_e0537f48/privatedesk-ask-your-office-pdfs-anything-answered-locally-with-page-citations-2d6c</link>
      <guid>https://dev.to/shubham_hagawane_e0537f48/privatedesk-ask-your-office-pdfs-anything-answered-locally-with-page-citations-2d6c</guid>
      <description>&lt;p&gt;What I Built&lt;/p&gt;

&lt;p&gt;PrivateDesk is a local document Q&amp;amp;A app for small professional offices: accountants, clinics, and small law firms.&lt;/p&gt;

&lt;p&gt;These offices sit on piles of PDFs (contracts, invoices, intake forms, policies) that they often cannot upload to a cloud AI tool because of client confidentiality. So they either skip AI completely or paste sensitive files into a service they don't control.&lt;/p&gt;

&lt;p&gt;PrivateDesk fixes that. You drop in your PDFs, ask a question in plain language ("What are the termination terms in the Sharma contract?"), and get an answer with the exact file name and page number it came from. A language model, embeddings, and the database all run on the office's own computer. It works with the Wi-Fi turned off.&lt;/p&gt;

&lt;p&gt;Who would pay: a three-person accounting or law office that wants AI help but can't risk client data leaving the building. The business model is simple: one-time setup plus support. I install it on their machine, load their documents, and handle updates. No per-seat subscription, no per-token bill, no vendor holding their data.&lt;/p&gt;

&lt;p&gt;Demo&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%2Fi6p7368qcs07zavfifh7.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%2Fi6p7368qcs07zavfifh7.png" alt=" " width="800" height="380"&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%2Fo4a88crqq36jka6lcwo2.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%2Fo4a88crqq36jka6lcwo2.png" alt=" " width="800" height="377"&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%2Frs7tvpl8j691uw1g71ah.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%2Frs7tvpl8j691uw1g71ah.png" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All documents in the demo are fake, with invented names and data.&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://github.com/ShubhamHagawane/PrivateDesk" rel="noopener noreferrer"&gt;https://github.com/ShubhamHagawane/PrivateDesk&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;Everything at runtime is open source and local:&lt;/p&gt;

&lt;p&gt;Model: a small open-weight Gemma model running through Ollama (default gemma3:4b, configurable). It answers questions using only the excerpts retrieved from the user's documents.&lt;br&gt;
Embeddings: nomic-embed-text, also served locally through Ollama, to turn document chunks and questions into vectors.&lt;br&gt;
Ingestion: PDFs are parsed page by page with pdfjs-dist, then split into overlapping chunks within each page, so every chunk keeps an exact page number.&lt;br&gt;
Storage and retrieval: chunks and embeddings are stored in MongoDB. For a small office's document set, cosine similarity over the stored vectors is fast enough, so I kept the architecture simple.&lt;br&gt;
Answering: the top matching chunks go into a strict prompt: answer only from the excerpts, cite [file, page N] for every claim, and reply "I couldn't find that in the uploaded documents" when the answer isn't there. Tokens stream to the UI as they're generated.&lt;br&gt;
App: Node/Express backend and a React (Vite) front end with an upload sidebar, a chat panel, and clickable source chips that show the retrieved excerpt.&lt;/p&gt;

&lt;p&gt;The design choice that matters most: citations are not decoration. A wrong answer from a legal or clinical document is worse than no answer, so the app always shows where an answer came from and refuses to guess.&lt;/p&gt;

&lt;p&gt;Limits right now (honest version): text-based PDFs only (no OCR for scans yet), and a small local model can miss nuance on long or complex clauses, which is why the source excerpt is always one click away.&lt;/p&gt;

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

&lt;p&gt;This product only works because the model is open.&lt;/p&gt;

&lt;p&gt;Privacy is the product. The whole pitch is that files never leave the machine. With a closed API, that sentence would be false, and the customers I'm targeting couldn't legally or ethically use the tool.&lt;br&gt;
Cost makes the business work. A hosted API charges per token, forever, and a document-heavy office would run up a bill every month. A local model has no per-query cost, so I can sell a one-time setup with support. &amp;lt;!-- Add your own numbers if you measure them, e.g. "Indexing 1,000 pages cost $0 and took X minutes on a laptop." --&amp;gt;&lt;br&gt;
No lock-in. The model is a setting (CHAT_MODEL), not a dependency on one vendor's pricing or policy changes. If a better open model appears, the office upgrades without rebuilding anything.&lt;br&gt;
It works offline. In the demo, I turn Wi-Fi off and it still answers, which is something no closed API can do.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;/p&gt;

&lt;p&gt;Best Use of Gemma: the whole answering step runs on a locally served Gemma model through Ollama.&lt;br&gt;
Best Use of Entire: I shared the agent sessions behind this project (link above).&lt;br&gt;
Best Use of GitHub Copilot: [DESCRIBE HOW YOU USED IT, OR DELETE]&lt;br&gt;
Best Use of a .tech Domain: [ADD YOUR .tech LINK, OR DELETE]&lt;br&gt;
Best Use of MongoDB Atlas: [KEEP ONLY IF YOU ACTUALLY USED ATLAS OR ATLAS LOCAL, E.G. WITH VECTOR SEARCH. DELETE IF YOU USED PLAIN LOCAL MONGODB]&lt;br&gt;
Best Use of Sentry Agent Tracing: [KEEP ONLY IF YOU ADD TRACES AND SCREENSHOTS, OR DELETE]&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>gemma</category>
    </item>
    <item>
      <title>NatureQuest AI: Touch Grass with Local Gemma AI 🌿</title>
      <dc:creator>Shubham Hagawane</dc:creator>
      <pubDate>Sun, 11 Oct 2026 11:17:12 +0000</pubDate>
      <link>https://dev.to/shubham_hagawane_e0537f48/naturequest-ai-touch-grass-with-local-gemma-ai-4l3d</link>
      <guid>https://dev.to/shubham_hagawane_e0537f48/naturequest-ai-touch-grass-with-local-gemma-ai-4l3d</guid>
      <description>&lt;p&gt;I built NatureQuest AI, a web application that uses a locally running open-weight AI model to encourage people to spend more time outdoors and notice the natural world.&lt;/p&gt;

&lt;p&gt;Users can choose an activity such as walking, birdwatching, gardening, cycling, or nature observation, select a duration and difficulty, and generate a personalized outdoor quest.&lt;/p&gt;

&lt;p&gt;The application also provides a reflection prompt so users can record their experience after completing a quest.&lt;/p&gt;

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

&lt;p&gt;The application runs locally on my computer.&lt;/p&gt;

&lt;p&gt;Screenshots: Add real screenshots of:&lt;/p&gt;

&lt;p&gt;The NatureQuest AI home page.&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%2F4i332q4jdswd5hxhsi7o.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%2F4i332q4jdswd5hxhsi7o.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The quest creation form.&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%2F1us3unbg5ud060u84c8h.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%2F1us3unbg5ud060u84c8h.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The local Gemma model running through Ollama.&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%2Flmfurh2pol3xsyrj89da.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%2Flmfurh2pol3xsyrj89da.png" alt=" " width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;GitHub repository: &lt;a href="https://github.com/ShubhamHagawane/NatureQuest-AI" rel="noopener noreferrer"&gt;https://github.com/ShubhamHagawane/NatureQuest-AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the React frontend, Express backend, local AI integration, and setup instructions.&lt;/p&gt;

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

&lt;p&gt;I built the frontend using React, Vite, and CSS. The backend uses Node.js and Express to handle quest-generation requests.&lt;/p&gt;

&lt;p&gt;For AI generation, I integrated Gemma 2 2B through Ollama, allowing the model to run locally rather than relying on a paid hosted inference API.&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;/p&gt;

&lt;p&gt;The user chooses an activity, duration, and difficulty.&lt;/p&gt;

&lt;p&gt;The React frontend sends the preferences to the Express API.&lt;/p&gt;

&lt;p&gt;The backend sends a prompt to the local Gemma model through Ollama.&lt;/p&gt;

&lt;p&gt;The response is validated and returned as a structured quest.&lt;/p&gt;

&lt;p&gt;The user can complete the quest and save a reflection in browser storage.&lt;/p&gt;

&lt;p&gt;I also included sample quests for situations where the local model is unavailable.&lt;/p&gt;

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

&lt;p&gt;Open innovation makes AI experimentation more accessible to students, independent developers, and communities that may not have access to expensive cloud infrastructure.&lt;/p&gt;

&lt;p&gt;Using an open-weight model locally gave me an opportunity to learn how to integrate AI into a real application while keeping inference on my own computer after the model is downloaded.&lt;/p&gt;

&lt;p&gt;NatureQuest AI explores a simple idea: AI doesn't always need to keep us staring at a screen. It can help us plan an activity that encourages us to step away from technology and experience the world around us.&lt;/p&gt;

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

&lt;p&gt;I used ChatGPT as a development assistant while building and debugging the application&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;/p&gt;

&lt;p&gt;My project is submitted for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.&lt;/p&gt;

&lt;p&gt;The project combines a locally running open-weight AI model with an application designed to encourage outdoor activities and real-world engagement.&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #hf26challengease pick one member to publish the submission and credit teammates by listing their DEV usernames directly in the body of the post. --&amp;gt;
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>NatureQuest AI: Touch Grass with Local Gemma AI 🌿</title>
      <dc:creator>Shubham Hagawane</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:57:36 +0000</pubDate>
      <link>https://dev.to/shubham_hagawane_e0537f48/naturequest-ai-touch-grass-with-local-gemma-ai-205o</link>
      <guid>https://dev.to/shubham_hagawane_e0537f48/naturequest-ai-touch-grass-with-local-gemma-ai-205o</guid>
      <description>&lt;p&gt;The idea&lt;/p&gt;

&lt;p&gt;We spend a lot of time looking at screens, even when there are interesting things to discover outside. I wanted to build something that encourages people to take a break from their screens and explore the natural world.&lt;/p&gt;

&lt;p&gt;That's why I built NatureQuest AI, an AI-powered outdoor adventure companion that generates personalized nature quests based on a user's activity, available time, and difficulty level.&lt;/p&gt;

&lt;p&gt;This project is my contribution to the Hacktoberfest 2026 Open-Source AI Challenge — Week 1: Touch Grass.&lt;/p&gt;

&lt;p&gt;What can NatureQuest AI do?&lt;/p&gt;

&lt;p&gt;Users can choose activities such as:&lt;/p&gt;

&lt;p&gt;🚶 Walking&lt;/p&gt;

&lt;p&gt;🚲 Cycling&lt;/p&gt;

&lt;p&gt;🌱 Gardening&lt;/p&gt;

&lt;p&gt;🐦 Birdwatching&lt;/p&gt;

&lt;p&gt;🔎 Nature observation&lt;/p&gt;

&lt;p&gt;The application generates a short outdoor quest with instructions, a time limit, a difficulty level, and a reflection prompt. Users can then go outside, complete the quest, and record their experience.&lt;/p&gt;

&lt;p&gt;The goal is simple: make the screen the starting point for an outdoor experience, not the destination.&lt;/p&gt;

&lt;p&gt;How I built it&lt;/p&gt;

&lt;p&gt;The project uses the following technologies:&lt;/p&gt;

&lt;p&gt;React + Vite: Frontend interface&lt;/p&gt;

&lt;p&gt;Tailwind CSS: Styling&lt;/p&gt;

&lt;p&gt;Node.js + Express: Backend API&lt;/p&gt;

&lt;p&gt;Ollama: Local model runtime&lt;/p&gt;

&lt;p&gt;Gemma 2 2B: Open-weight language model&lt;/p&gt;

&lt;p&gt;Browser local storage: Saving quest history locally&lt;/p&gt;

&lt;p&gt;Why local AI?&lt;/p&gt;

&lt;p&gt;I initially explored hosted inference through Hugging Face Inference Providers, but I ran out of available inference credits.&lt;/p&gt;

&lt;p&gt;Instead of stopping there, I switched to running Gemma locally through Ollama.&lt;/p&gt;

&lt;p&gt;This gave the project several advantages:&lt;/p&gt;

&lt;p&gt;Quest generation does not require paid Hugging Face inference credits.&lt;/p&gt;

&lt;p&gt;Once the model is downloaded, generation can work without an internet connection.&lt;/p&gt;

&lt;p&gt;User prompts can be processed locally rather than sent to a hosted inference service.&lt;/p&gt;

&lt;p&gt;I can experiment with the model and change the AI integration as the project evolves.&lt;/p&gt;

&lt;p&gt;Local inference still requires a capable device, sufficient memory, and Ollama running. The initial model download also requires an internet connection.&lt;/p&gt;

&lt;p&gt;How it works&lt;/p&gt;

&lt;p&gt;A user chooses an outdoor activity and preferences.&lt;/p&gt;

&lt;p&gt;The React frontend sends the request to the Express backend.&lt;/p&gt;

&lt;p&gt;The backend sends the prompt to the locally running Gemma model through Ollama.&lt;/p&gt;

&lt;p&gt;Gemma generates a structured nature quest.&lt;/p&gt;

&lt;p&gt;The application displays the quest so the user can head outside and complete it.&lt;/p&gt;

&lt;p&gt;Screenshots and demo&lt;/p&gt;

&lt;p&gt;Homepage&lt;/p&gt;

&lt;p&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%2Fczr2z1ljao568jtchz7y.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%2Fczr2z1ljao568jtchz7y.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;AI-generated quest&lt;/p&gt;

&lt;p&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%2F097qflt35uwr96e9wmbq.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%2F097qflt35uwr96e9wmbq.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Local model running&lt;/p&gt;

&lt;p&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%2Faj8icjbhpxbsj84ld12j.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%2Faj8icjbhpxbsj84ld12j.png" alt=" " width="800" height="591"&gt;&lt;/a&gt;&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;What I learned&lt;/p&gt;

&lt;p&gt;This project helped me understand how to connect an open-weight language model to a full-stack web application.&lt;/p&gt;

&lt;p&gt;I also learned that AI integration isn't only about sending a prompt. The application needs structured responses, validation, error handling, and a fallback experience when generation fails.&lt;/p&gt;

&lt;p&gt;Most importantly, I learned that switching from a hosted model API to local inference can make a project more independent of external inference credits.&lt;/p&gt;

&lt;p&gt;What's next?&lt;/p&gt;

&lt;p&gt;I'd like to improve NatureQuest AI with better outdoor activity recommendations, richer quest history, and additional ways to document discoveries while keeping the experience focused on spending time outside.&lt;/p&gt;

&lt;p&gt;Try the project&lt;/p&gt;

&lt;p&gt;GitHub repository: [&lt;a href="https://github.com/ShubhamHagawane/NatureQuest-AI" rel="noopener noreferrer"&gt;https://github.com/ShubhamHagawane/NatureQuest-AI&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;If you try NatureQuest AI, I'd love to hear which outdoor quest you completed!&lt;/p&gt;

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