<?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: Ritik Ahirwar</title>
    <description>The latest articles on DEV Community by Ritik Ahirwar (@ritik_ahirwar_8168).</description>
    <link>https://dev.to/ritik_ahirwar_8168</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%2F4160326%2Ff2c719d4-5ea1-494f-b794-48a071520441.png</url>
      <title>DEV Community: Ritik Ahirwar</title>
      <link>https://dev.to/ritik_ahirwar_8168</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ritik_ahirwar_8168"/>
    <language>en</language>
    <item>
      <title>PriceCraft AI: The 20-Minute eBay Listing, Cut Down to One Click</title>
      <dc:creator>Ritik Ahirwar</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:59:19 +0000</pubDate>
      <link>https://dev.to/ritik_ahirwar_8168/pricecraft-ai-the-20-minute-ebay-listing-cut-down-to-one-click-49n5</link>
      <guid>https://dev.to/ritik_ahirwar_8168/pricecraft-ai-the-20-minute-ebay-listing-cut-down-to-one-click-49n5</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;PriceCraft AI is a one-click appraisal and listing engine for people who flip vintage clothes, watches, refurbished tech, and collectibles on eBay, Etsy, Poshmark, Mercari, and Shopify.&lt;/p&gt;

&lt;p&gt;That person is usually not a “startup.” They are a seller with a phone, a storage tote, and a side income that lives or dies on two numbers: &lt;strong&gt;what to ask&lt;/strong&gt;, and &lt;strong&gt;how long it takes to write the listing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Overprice, and the item sits. Underprice, and you donated margin to a stranger. Write a sloppy title, and search never finds you. Skip the condition note, and you eat a return plus a platform fee you already paid. A careful listing still takes 15–20 minutes: hunt comps, guess a price, squeeze keywords into eBay’s 80-character title, write specs, disclose flaws.&lt;/p&gt;

&lt;p&gt;PriceCraft turns that into a single form: brand, category, condition, sourcing cost, a few attributes. It returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a suggested list price, a quick-sale floor, a patient ceiling, and a 14-day sell-through probability&lt;/li&gt;
&lt;li&gt;live competitor min / average / max (when SerpApi is configured)&lt;/li&gt;
&lt;li&gt;net after a typical marketplace fee blend, so “optimal” is not vanity revenue&lt;/li&gt;
&lt;li&gt;an eBay-length title, an Etsy-style title, markdown specs, and a condition-honest description&lt;/li&gt;
&lt;li&gt;optional 15-second promo narration for TikTok / Reels&lt;/li&gt;
&lt;li&gt;a small inventory catalog and CSV export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Who would pay? Anyone listing more than a handful of items a week. The product is not “AI for shopping.” It is &lt;strong&gt;time and pricing discipline for a resale hustle&lt;/strong&gt;, which is exactly the kind of small, specific, useful software this week asked for.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://pricecraft-ai.onrender.com" rel="noopener noreferrer"&gt;https://pricecraft-ai.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try a preset (vintage Nike windbreaker, etc.), or enter a real item you would actually sell. Appraisal, comps, copy, unit economics, and inventory live in the same dashboard. Health check: &lt;a href="https://pricecraft-ai.onrender.com/api/health" rel="noopener noreferrer"&gt;&lt;code&gt;/api/health&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The public demo runs on Render’s free tier, so the first request after idle can take a moment to wake. That is the honest cost of shipping something judges (and sellers) can click without cloning a repo.&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ritikahirwar8168-dev" rel="noopener noreferrer"&gt;
        ritikahirwar8168-dev
      &lt;/a&gt; / &lt;a href="https://github.com/ritikahirwar8168-dev/pricecraft-ai" rel="noopener noreferrer"&gt;
        pricecraft-ai
      &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;PriceCraft AI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Intelligent resale pricing, live market comps, and listing generation for online sellers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://pricecraft-ai.onrender.com" rel="nofollow noopener noreferrer"&gt;https://pricecraft-ai.onrender.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pricecraft-ai.onrender.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/913ae99961c8d975d33c1db00d9fccd80188092c57df4356c9b4493fbbba71ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f44656d6f2d707269636563726166742d2d61692e6f6e72656e6465722e636f6d2d656d6572616c64" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9833615dcd5c4175da2140bbe363cb42af4faaeffc0624453b6154e68a60d0aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31312b2d626c75652e737667" alt="Python 3.11+"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/de33b94e6c0696ad683da9de83be7bb2f549c5e36a7a5f9b2a76b0d2ec111ae6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d302e3131352b2d3030393638382e737667" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ritikahirwar8168-dev/pricecraft-ai/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for Hacktoberfest 2026 (Week 2 — Side Hustle) with open-source AI at the core.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Solo sellers on eBay, Etsy, Poshmark, Mercari, and Shopify spend too much time on two jobs that should be fast: &lt;strong&gt;pricing&lt;/strong&gt; and &lt;strong&gt;listing copy&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Guessing a price too high leaves inventory sitting. Guessing too low gives away margin.&lt;/li&gt;
&lt;li&gt;Writing an 80-character eBay title, specs, and an honest condition note often takes 15–20 minutes per item.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PriceCraft AI turns item specs and sourcing cost into a valuation, competitor snapshot, marketplace listing, and optional short-form promo voiceover in one request.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tabular valuation (Prior Labs TabPFN)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Suggested list price, quick-sale floor, collector ceiling, and 14-day sell-through probability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Liquidity curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chart.js view of sell probability across price tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Listing copy (Google Gemma 2)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;eBay-length title,&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ritikahirwar8168-dev/pricecraft-ai" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Repo: &lt;a href="https://github.com/ritikahirwar8168-dev/pricecraft-ai" rel="noopener noreferrer"&gt;github.com/ritikahirwar8168-dev/pricecraft-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stack: Python 3.11, FastAPI, SQLite, Tailwind, Chart.js. Blueprint: &lt;code&gt;render.yaml&lt;/code&gt;. Tests: &lt;code&gt;python -m unittest tests/test_pricecraft.py -v&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Every listing follows the same path: seller input in, priced listing out, with Sentry wrapping each engine so latency is measurable instead of guessed.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    Seller["Seller"] --&amp;gt;|"Item specs, condition, sourcing cost"| UI["Dashboard on Render"]
    UI --&amp;gt;|"POST /api/analyze"| API["FastAPI pipeline"]

    subgraph Traced["Sentry-traced agent steps"]
        TabPFN["TabPFN&amp;lt;br/&amp;gt;price, floor, ceiling, 14-day sell-through"]
        SerpApi["SerpApi&amp;lt;br/&amp;gt;live Google Shopping comps"]
        Gemma["Gemma 2&amp;lt;br/&amp;gt;80-char title, specs, description"]
        Econ["Unit economics&amp;lt;br/&amp;gt;fees, shipping, net profit"]
    end

    API --&amp;gt; TabPFN
    API --&amp;gt; SerpApi
    TabPFN --&amp;gt; Gemma
    TabPFN --&amp;gt; Econ
    SerpApi --&amp;gt; Econ
    Gemma --&amp;gt; Out["Priced listing + copy"]
    Econ --&amp;gt; Out
    Out --&amp;gt; UI
    Out --&amp;gt;|"Save / CSV export"| DB["SQLite inventory"]

    UI --&amp;gt;|"POST /api/voiceover"| Voice["ElevenLabs promo clip"]
    Voice --&amp;gt; UI&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The open pieces are not a badge on the README. They are the two jobs a closed chatbot is bad at: &lt;strong&gt;numbers on a small table&lt;/strong&gt;, and &lt;strong&gt;copy that obeys a marketplace rule&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Valuation is TabPFN, not an LLM.&lt;/strong&gt; Prior Labs’ tabular foundation model is trained to do Bayesian-style inference on small tabular sets in a forward pass. Resale data looks like that: condition score, brand tier, rarity, age, demand, original retail, sourcing cost. I fit &lt;code&gt;TabPFNRegressor&lt;/code&gt; on sold price and &lt;code&gt;TabPFNClassifier&lt;/code&gt; on “sold within 14 days,” then score the item. From that I derive floor, ceiling, days-on-market, and a factor breakdown. A general chat model will &lt;em&gt;sound&lt;/em&gt; like it priced the jacket. TabPFN is actually doing tabular prediction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy is Gemma 2.&lt;/strong&gt; Google’s open-weight &lt;code&gt;gemma-2-9b-it&lt;/code&gt; writes the listing: 80-character eBay title, warmer Etsy title, bullets, markdown description, tags, social hook. Inference can go through Groq or Hugging Face; &lt;code&gt;GEMMA_MODEL_ID&lt;/code&gt; is swappable. Temperature is low. The output is JSON, not a paragraph you have to edit twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live comps are SerpApi&lt;/strong&gt; (Google Shopping), so the price is not floating in a vacuum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt; turns the social hook into a short voiceover. Resellers already film phone videos; they should not also write and record a script for every SKU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry agent tracing&lt;/strong&gt; wraps each step (&lt;code&gt;tabular_valuation&lt;/code&gt;, &lt;code&gt;market_comps&lt;/code&gt;, &lt;code&gt;listing_generation&lt;/code&gt;, &lt;code&gt;voiceover_synthesis&lt;/code&gt;) with latency and metadata. The UI has a telemetry tab; the same spans go to Sentry when &lt;code&gt;SENTRY_DSN&lt;/code&gt; is set. For a multi-engine pipeline, “it feels slow” is useless. You need to know whether TabPFN, search, or copy ate the budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render&lt;/strong&gt; is the runtime: FastAPI on &lt;code&gt;0.0.0.0:$PORT&lt;/code&gt;, health check at &lt;code&gt;/api/health&lt;/code&gt;, env keys marked &lt;code&gt;sync: false&lt;/code&gt; in the blueprint. The side hustle only exists if a seller can open a URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fallbacks are intentional.&lt;/strong&gt; Keys are optional. Without them, built-in priors still produce a valuation and listing so the app never dead-ends. That matters more for a $0–small-budget hustle than a demo that 500s when a vendor is down.&lt;/p&gt;

&lt;p&gt;One &lt;code&gt;POST /api/analyze&lt;/code&gt; run: TabPFN valuation → SerpApi comps → Gemma 2 listing → unit economics (price − cost − ~13.25% + $0.30 fee − shipping). Voiceover is a separate &lt;code&gt;POST /api/voiceover&lt;/code&gt; so you do not pay for audio on every appraisal.&lt;/p&gt;

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

&lt;p&gt;A reseller’s margin is thin. If every listing calls a closed frontier API, the tool can cost more than the extra dollars it finds. Open weights change the unit economics of the &lt;em&gt;product&lt;/em&gt;, not just the philosophy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabular work is a poor fit for a closed chat API.&lt;/strong&gt; Pricing is rows and columns: condition, rarity, age, comps. Forcing that through a general LLM is the expensive way to get a confident wrong number, with no real posterior and no cheap way to refit on your own sold-history CSV. TabPFN is built for that shape of data. That is where open innovation is not a slogan; it is the correct model class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma lets me constrain and swap.&lt;/strong&gt; eBay’s title limit is 80 characters. I need a model I can prompt strictly, pin to JSON, and replace (&lt;code&gt;2b&lt;/code&gt; vs &lt;code&gt;9b&lt;/code&gt;, Groq vs Hugging Face vs local later) without rewriting the app or renegotiating a vendor. Closed copy APIs are fine until the price per 1K tokens moves, the model is deprecated, or the policy dislikes “used goods with stains disclosed.” Open weights keep the listing writer under my control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seller data is not abstract.&lt;/strong&gt; Sourcing cost and true margin are the most sensitive fields in this workflow. A hosted closed API means sending that to a third party on every click. Self-hosting FastAPI + TabPFN on CPU, or running Gemma through a provider you chose, is a better default for a hustle that should not leak wholesale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closed tools fail the “would someone pay” test in a different way.&lt;/strong&gt; ChatGPT can draft a description. It will not fit a tabular prior, subtract eBay fees, pull shopping comps, and emit File Exchange-shaped CSV in one path. The open stack is what made it &lt;em&gt;one product&lt;/em&gt; instead of five tabs.&lt;/p&gt;

&lt;p&gt;Open here does not mean “no internet, always.” It means the intelligence that makes the hustle work — tabular valuation and constrained listing copy — is not locked to a single closed SKU. Render hosts it. Partners add live search, voice, and traces. The core still runs with fallbacks if those keys are empty.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — production runtime at &lt;a href="https://pricecraft-ai.onrender.com" rel="noopener noreferrer"&gt;pricecraft-ai.onrender.com&lt;/a&gt;, &lt;code&gt;render.yaml&lt;/code&gt;, &lt;code&gt;/api/health&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN&lt;/strong&gt; — regressor + classifier on resale attributes: price, 14-day sell-through, floor/ceiling, factor breakdown, inside a wider valuation agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 2 as the listing writer (80-char titles, specs, condition copy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt; — per-engine spans (latency, price, title length, competitor count) in-app and via &lt;code&gt;sentry-sdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi&lt;/strong&gt; — live Google Shopping comps grounding the price&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt; — short-form listing promo narration&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>TerraPulse 🌿 — The Screenless Outdoor &amp; Trail Agent</title>
      <dc:creator>Ritik Ahirwar</dc:creator>
      <pubDate>Sun, 11 Oct 2026 05:58:15 +0000</pubDate>
      <link>https://dev.to/ritik_ahirwar_8168/terrapulse-the-screenless-outdoor-trail-agent-4e46</link>
      <guid>https://dev.to/ritik_ahirwar_8168/terrapulse-the-screenless-outdoor-trail-agent-4e46</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Most outdoor and recreation apps encourage users to spend more time looking at screens—reading trail reviews, comparing weather data, and navigating cluttered GPS interfaces before taking a single step outside.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;TerraPulse&lt;/strong&gt; around a simple design philosophy: &lt;strong&gt;the screen should be the shortest part of the experience—ideally under 30 seconds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TerraPulse is an AI-powered field guide for &lt;strong&gt;hikers, trail runners, foragers, and gardeners&lt;/strong&gt;. Instead of studying charts, users can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select an outdoor mission: &lt;em&gt;Hiking, Trail Run, Foraging,&lt;/em&gt; or &lt;em&gt;Gardening&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Explore environmental inputs such as temperature, humidity, soil moisture, elevation, canopy density, and recent rainfall.&lt;/li&gt;
&lt;li&gt;Get a composite &lt;strong&gt;Grass Score (0–100)&lt;/strong&gt;, an assessment of trail traction and frost risk, and a concise spoken field briefing.&lt;/li&gt;
&lt;li&gt;Receive a physical nature micro-quest—for example, observing different fungi growing on shaded tree trunks.&lt;/li&gt;
&lt;li&gt;Listen to the briefing, put the phone away, and focus on the outdoors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is simple: make environmental information useful without keeping people glued to their screens.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://terrapulse-wlci.onrender.com" rel="noopener noreferrer"&gt;TerraPulse on Render&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Interactive API Documentation:&lt;/strong&gt; &lt;a href="https://terrapulse-wlci.onrender.com/docs" rel="noopener noreferrer"&gt;Explore the API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/ritikahirwar8168-dev/terrapulse" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try the live demo by selecting an available trail preset, such as &lt;em&gt;Pine Ridge Trail&lt;/em&gt; or &lt;em&gt;Alpine Ridge&lt;/em&gt;, then using &lt;strong&gt;Synthesize Briefing &amp;amp; Touch Grass&lt;/strong&gt; if that option is available. Listen to the briefing and explore the generated outdoor guidance.&lt;/p&gt;




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

&lt;p&gt;TerraPulse combines environmental data analysis, an AI-guided outdoor experience, audio narration, and observability.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Environmental Analysis with TabPFN
&lt;/h3&gt;

&lt;p&gt;Trail conditions can depend on multiple interacting variables, including temperature, humidity, soil saturation, and time since rainfall.&lt;/p&gt;

&lt;p&gt;I integrated &lt;strong&gt;Prior Labs' TabPFN&lt;/strong&gt; (&lt;code&gt;tabpfn.TabPFNClassifier&lt;/code&gt;) to analyze tabular environmental observations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historical observations are stored in &lt;code&gt;data/trail_microclimate.csv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The analysis supports trail-condition assessments such as dry, muddy or slippery, and frost or ice risk.&lt;/li&gt;
&lt;li&gt;The resulting predictions provide structured input for the outdoor briefing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Outdoor Reasoning with Google Gemma 2
&lt;/h3&gt;

&lt;p&gt;Environmental predictions become more useful when translated into practical, understandable guidance.&lt;/p&gt;

&lt;p&gt;TerraPulse integrates Google's open-weight &lt;strong&gt;Gemma 2&lt;/strong&gt; (&lt;code&gt;gemma-2-9b-it&lt;/code&gt;) as its naturalist-style reasoning agent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It turns environmental analysis into a concise field briefing.&lt;/li&gt;
&lt;li&gt;It can generate a nature micro-quest and a sensory observation prompt.&lt;/li&gt;
&lt;li&gt;The project supports configurable inference paths, including local Ollama integration (&lt;code&gt;USE_LOCAL_GEMMA=true&lt;/code&gt;), Google AI Studio endpoints, and deterministic fallback behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actual model availability and inference requirements depend on the selected runtime and configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Screen-Free Audio with ElevenLabs
&lt;/h3&gt;

&lt;p&gt;TerraPulse supports &lt;strong&gt;ElevenLabs Turbo v2.5&lt;/strong&gt; for spoken narration, helping users listen rather than continually check their screens.&lt;/p&gt;

&lt;p&gt;When the required voice API configuration is unavailable, the frontend can use the browser's native Web Speech API (&lt;code&gt;window.speechSynthesis&lt;/code&gt;) as a fallback.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Observability with Sentry
&lt;/h3&gt;

&lt;p&gt;The project uses &lt;code&gt;sentry-sdk&lt;/code&gt; to instrument parts of the agent pipeline with custom spans, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ai.tabpfn.tabular&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ai.gemma.llm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ai.elevenlabs.tts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface includes an agent-tracing and latency-waterfall view intended to make the processing pipeline easier to inspect.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Deployment with Docker and Render
&lt;/h3&gt;

&lt;p&gt;TerraPulse includes a &lt;code&gt;Dockerfile&lt;/code&gt; and a &lt;code&gt;render.yaml&lt;/code&gt; configuration for deployment on Render.&lt;/p&gt;

&lt;p&gt;The live deployment makes it possible to explore the application through a browser without setting up the project locally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;Outdoor environments often have unreliable connectivity. A useful field tool should be designed with those constraints in mind.&lt;/p&gt;

&lt;p&gt;Open-weight models and flexible deployment options offer several potential benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local inference options:&lt;/strong&gt; Models such as Gemma 2 can be run locally when the required hardware and software are available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More control over data:&lt;/strong&gt; Local processing can reduce the need to send certain inputs to external services, depending on the configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible experimentation:&lt;/strong&gt; Open-weight models and open-source tooling make it easier for developers to inspect, adapt, and extend a system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical fallback behavior:&lt;/strong&gt; Deterministic fallbacks and browser-based speech can help the experience remain useful when optional integrations are unavailable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TerraPulse explores how these approaches can support a more focused, screen-conscious outdoor experience. Cloud-backed features still depend on connectivity, credentials, and service availability.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Agent Development Workflow
&lt;/h2&gt;

&lt;p&gt;TerraPulse was developed with AI-assisted pair programming and an emphasis on making the system easier to inspect.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent tracing and performance spans can be explored through the application's tracing interface, where available.&lt;/li&gt;
&lt;li&gt;The source repository contains the implementation and project history.&lt;/li&gt;
&lt;li&gt;The modular architecture separates environmental analysis, reasoning, voice generation, and observability.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;TerraPulse is intended for consideration in the following challenge and sponsor categories, subject to each category's official eligibility requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Featured Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; The application is deployed on Render, with deployment configuration included in the repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN:&lt;/strong&gt; TabPFN is integrated for tabular environmental analysis and trail-condition assessment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 2 is integrated into the outdoor reasoning workflow to help turn structured information into field guidance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Partner Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; ElevenLabs integration supports spoken outdoor briefings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; Sentry instrumentation supports inspection of the agent pipeline and its performance.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://terrapulse-wlci.onrender.com" rel="noopener noreferrer"&gt;https://terrapulse-wlci.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Documentation:&lt;/strong&gt; &lt;a href="https://terrapulse-wlci.onrender.com/docs" rel="noopener noreferrer"&gt;https://terrapulse-wlci.onrender.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/ritikahirwar8168-dev/terrapulse" rel="noopener noreferrer"&gt;https://github.com/ritikahirwar8168-dev/terrapulse&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Less screen time. More time outdoors. Go touch grass! 🌿&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Campus Copilot — AI Academic Assistant for a College Student</title>
      <dc:creator>Ritik Ahirwar</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:00:02 +0000</pubDate>
      <link>https://dev.to/ritik_ahirwar_8168/campus-copilot-ai-academic-assistant-for-a-college-student-19kc</link>
      <guid>https://dev.to/ritik_ahirwar_8168/campus-copilot-ai-academic-assistant-for-a-college-student-19kc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;College students often have information scattered across attendance, assignments, exams, notes, and to-do lists. A generic chatbot can give advice, but it does not necessarily understand the student's actual academic situation.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Campus Copilot&lt;/strong&gt;, an AI-powered academic assistant designed around that problem.&lt;/p&gt;

&lt;p&gt;It combines deterministic academic logic with an open-weight AI workflow to turn campus context into concrete actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; — attendance ring, warnings, deadlines, and today's recommended actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attendance&lt;/strong&gt; — subject-level attendance, 75% warnings, and skip/attend simulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Academics&lt;/strong&gt; — assignments, exams, and notes CRUD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity&lt;/strong&gt; — tasks and study plans ranked by risk and due dates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistant&lt;/strong&gt; — contextual chat with structured actions such as:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create_task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_study_block&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flag_attendance&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Priorities&lt;/strong&gt; — personalised academic priority planning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarize&lt;/strong&gt; — converts study material into concise bullet points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiz Generator&lt;/strong&gt; — generates interactive MCQs with explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flashcards&lt;/strong&gt; — generates tap-to-flip Q&amp;amp;A cards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Study Plan&lt;/strong&gt; — enhances the deterministic study plan with AI recommendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key idea is simple: instead of saying &lt;em&gt;"study DSA today"&lt;/em&gt;, the assistant can use actual attendance risk, deadlines, tasks, and academic context to recommend what the student should do next.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All AI features have graceful rule-based fallbacks when Ollama is unavailable, so the core application remains functional without a GPU.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;h3&gt;
  
  
  Live Demo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://campus-chatbot-kbkdt49ms-ritikahirwar8168-dev.vercel.app" rel="noopener noreferrer"&gt;https://campus-chatbot-kbkdt49ms-ritikahirwar8168-dev.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend API:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://campus-chatbot-bzk0.onrender.com" rel="noopener noreferrer"&gt;https://campus-chatbot-bzk0.onrender.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Demo Login
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;&lt;code&gt;demo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;&lt;code&gt;campus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The seeded demo student is &lt;strong&gt;Ritik&lt;/strong&gt;, a B.Tech CSE semester 5 student with subjects, assignments, exams, notes, and tasks.&lt;/p&gt;


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

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/ritikahirwar8168-dev/campus-chatbot" rel="noopener noreferrer"&gt;https://github.com/ritikahirwar8168-dev/campus-chatbot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains both the FastAPI backend and React/Vite frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;campus-chatbot/
├── backend/
└── frontend/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Campus Copilot is built around &lt;strong&gt;Gemma 3 4B&lt;/strong&gt;, Google's open-weight model, served locally through &lt;strong&gt;Ollama&lt;/strong&gt; during development.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 4B&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference:&lt;/strong&gt; Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI + SQLAlchemy + SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React 18 + Vite 6 + Tailwind CSS 3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; JWT + bcrypt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Render + Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend keeps the AI integration in a dedicated service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/app/services/ollama_service.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prompt templates are separated into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/app/services/prompts.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The assistant and AI endpoints then use the shared AI service rather than exposing model calls directly to the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deterministic + AI architecture
&lt;/h3&gt;

&lt;p&gt;I deliberately kept academic calculations deterministic.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;attendance calculations are handled by application logic&lt;/li&gt;
&lt;li&gt;deadlines and risk ranking are handled by application logic&lt;/li&gt;
&lt;li&gt;study-plan structure is generated deterministically&lt;/li&gt;
&lt;li&gt;AI is used for contextual language generation, summaries, quizzes, flashcards, priorities, and enhanced recommendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents an LLM from becoming the source of truth for calculations that should be exact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Graceful fallback
&lt;/h3&gt;

&lt;p&gt;The project is designed to work even when the local model is unavailable.&lt;/p&gt;

&lt;p&gt;If Ollama is offline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the assistant can fall back to rule-based responses&lt;/li&gt;
&lt;li&gt;AI tools can return fallback behavior&lt;/li&gt;
&lt;li&gt;attendance, academics, productivity, and other core workflows continue to work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This also makes the application practical to demo without requiring a GPU.&lt;/p&gt;




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

&lt;p&gt;Using an open-weight model made the AI layer more transparent and controllable during development.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Gemma + Ollama&lt;/strong&gt;, I could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run the model locally&lt;/li&gt;
&lt;li&gt;keep the inference architecture under my control&lt;/li&gt;
&lt;li&gt;develop without requiring a hosted proprietary AI endpoint&lt;/li&gt;
&lt;li&gt;isolate the model behind my own FastAPI service&lt;/li&gt;
&lt;li&gt;design deterministic fallbacks instead of making the entire application dependent on an external model API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an academic assistant, this architecture is particularly useful because the application works with structured student context. The AI is an enhancement on top of the application logic rather than the entire application itself.&lt;/p&gt;

&lt;p&gt;The result is a hybrid design:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Student Context
      ↓
Deterministic Academic Logic
      ↓
AI Context + Prompts
      ↓
Gemma via Ollama
      ↓
Personalised Assistance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;blockquote&gt;
&lt;p&gt;Optional: Add your DevRelay / agent session link here if you have one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The project was developed with an AI-assisted coding workflow, while keeping the application architecture, deterministic logic, deployment setup, and integration under project control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend — Vercel
&lt;/h3&gt;

&lt;p&gt;The React/Vite frontend is deployed on Vercel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root directory: &lt;code&gt;frontend&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Framework: Vite&lt;/li&gt;
&lt;li&gt;Environment variable:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_API_URL=https://campus-chatbot-bzk0.onrender.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Live frontend:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://campus-chatbot-kbkdt49ms-ritikahirwar8168-dev.vercel.app" rel="noopener noreferrer"&gt;https://campus-chatbot-kbkdt49ms-ritikahirwar8168-dev.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend — Render
&lt;/h3&gt;

&lt;p&gt;The FastAPI backend is deployed on Render.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root directory: &lt;code&gt;backend&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Start command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn app.main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; &lt;span class="nv"&gt;$PORT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production configuration includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OLLAMA_ENABLED=false
CORS_ORIGINS=https://campus-chatbot-kbkdt49ms-ritikahirwar8168-dev.vercel.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backend:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://campus-chatbot-bzk0.onrender.com" rel="noopener noreferrer"&gt;https://campus-chatbot-bzk0.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Production AI note
&lt;/h3&gt;

&lt;p&gt;The production Render deployment currently has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OLLAMA_ENABLED=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because the deployed Render service does not run a local Ollama/Gemma instance.&lt;/p&gt;

&lt;p&gt;The application therefore uses its graceful fallback behavior in production. Gemma + Ollama is fully supported for local development and is the open-weight AI technology used to build the AI layer.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  🏆 Best Use of Render — $200
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why this project fits:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Campus Copilot uses Render to host the production FastAPI backend.&lt;/p&gt;

&lt;p&gt;The backend is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;student context&lt;/li&gt;
&lt;li&gt;attendance logic&lt;/li&gt;
&lt;li&gt;academic data&lt;/li&gt;
&lt;li&gt;productivity workflows&lt;/li&gt;
&lt;li&gt;assistant actions&lt;/li&gt;
&lt;li&gt;AI endpoints&lt;/li&gt;
&lt;li&gt;fallback behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Render deployment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository: ritikahirwar8168-dev/campus-chatbot
Root Directory: backend
Build: pip install -r requirements.txt
Start: uvicorn app.main:app --host 0.0.0.0 --port $PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Live backend:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://campus-chatbot-bzk0.onrender.com" rel="noopener noreferrer"&gt;https://campus-chatbot-bzk0.onrender.com&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🏆 Best Use of Gemma — $200
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why this project fits:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Campus Copilot uses &lt;strong&gt;Gemma 3 4B&lt;/strong&gt;, Google's open-weight model, as its primary AI model during local development.&lt;/p&gt;

&lt;p&gt;Gemma powers the project's AI-oriented features, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contextual academic assistance&lt;/li&gt;
&lt;li&gt;daily priorities&lt;/li&gt;
&lt;li&gt;summarization&lt;/li&gt;
&lt;li&gt;quiz generation&lt;/li&gt;
&lt;li&gt;flashcard generation&lt;/li&gt;
&lt;li&gt;AI-enhanced study plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model is served through &lt;strong&gt;Ollama&lt;/strong&gt;, with the AI integration isolated in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/app/services/ollama_service.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the model layer replaceable and prevents direct AI calls from the frontend.&lt;/p&gt;

&lt;p&gt;Local setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Local / AI-enabled
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┐        ┌──────────────────────┐
│   React Frontend    │        │    Ollama Server     │
│   Vite + Tailwind   │        │    gemma3:4b         │
└────────┬────────────┘        └──────────┬───────────┘
         │                                │
         │ HTTP                           │ HTTP
         ▼                                │
┌────────────────────────────────────────────────────┐
│                  FastAPI Backend                   │
│                                                    │
│  Routers → Services → ollama_service.py           │
│      │          │                                  │
│      ▼          ▼                                  │
│   Models      Prompts                              │
│      │                                             │
│      ▼                                             │
│   SQLite                                           │
└────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Production
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────┐
│     Vercel Frontend      │
│     React + Vite         │
└────────────┬─────────────┘
             │ HTTPS
             ▼
┌──────────────────────────┐
│     Render Backend       │
│     FastAPI + SQLite     │
│                          │
│  Deterministic logic    │
│  + AI fallback logic    │
└──────────────────────────┘
             │
             └── OLLAMA_ENABLED=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI calls are &lt;strong&gt;never exposed directly to the frontend&lt;/strong&gt; — they go through the backend.&lt;/li&gt;
&lt;li&gt;Ollama configuration lives in &lt;strong&gt;environment variables&lt;/strong&gt;, not hard-coded application logic.&lt;/li&gt;
&lt;li&gt;The AI provider is isolated in &lt;strong&gt;&lt;code&gt;ollama_service.py&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Deterministic logic such as attendance calculations and deadlines is &lt;strong&gt;never delegated to AI&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Every AI endpoint has a &lt;strong&gt;graceful fallback&lt;/strong&gt; when Ollama is offline.&lt;/li&gt;
&lt;li&gt;The application remains usable for core academic workflows &lt;strong&gt;without a GPU&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Frontend and backend are deployed separately using &lt;strong&gt;Vercel&lt;/strong&gt; and &lt;strong&gt;Render&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  API Highlights
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/auth/login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login and JWT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attendance&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/attendance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Subject attendance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attendance&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/attendance/simulate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What-if simulator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboard&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/dashboard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Academic dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Academics&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/academics/assignments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assignments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/productivity/study-plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Study plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assistant&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/assistant/chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contextual chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assistant&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/assistant/apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apply recommended action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/ai/summarize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Summarization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/ai/quiz&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quiz generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/ai/flashcards&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flashcard generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/ai/daily-priorities&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Daily priorities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;Building Campus Copilot reinforced an important lesson about AI applications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best AI feature is not always the part that generates the answer. It is the system that gives the model the right context and knows when not to use the model.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this project, deterministic academic logic provides the reliable foundation, while Gemma adds natural-language reasoning and personalised assistance on top.&lt;/p&gt;

&lt;p&gt;That combination made it possible to build an academic assistant that is useful, explainable, and still functional when the model is unavailable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;If I continue developing Campus Copilot, I would like to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;persistent production database storage&lt;/li&gt;
&lt;li&gt;hosted Gemma inference for production AI features&lt;/li&gt;
&lt;li&gt;richer student-context retrieval&lt;/li&gt;
&lt;li&gt;calendar integration&lt;/li&gt;
&lt;li&gt;notifications for attendance and deadlines&lt;/li&gt;
&lt;li&gt;more personalised study analytics&lt;/li&gt;
&lt;li&gt;stronger evaluation of AI-generated quizzes and study plans&lt;/li&gt;
&lt;/ul&gt;




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