<?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: Dayanand garg</title>
    <description>The latest articles on DEV Community by Dayanand garg (@dayanandgarg).</description>
    <link>https://dev.to/dayanandgarg</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%2F848099%2F316ecdc4-a7f1-4c07-85a5-86e2923edc63.png</url>
      <title>DEV Community: Dayanand garg</title>
      <link>https://dev.to/dayanandgarg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dayanandgarg"/>
    <language>en</language>
    <item>
      <title>GoWithProof: I Built My Friend an AI That Argues Against Its Own Recommendations</title>
      <dc:creator>Dayanand garg</dc:creator>
      <pubDate>Sun, 04 Oct 2026 23:37:31 +0000</pubDate>
      <link>https://dev.to/dayanandgarg/gowithproof-i-built-my-friend-an-ai-that-argues-against-its-own-recommendations-1d6f</link>
      <guid>https://dev.to/dayanandgarg/gowithproof-i-built-my-friend-an-ai-that-argues-against-its-own-recommendations-1d6f</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;Choosing a place to go should be easy.&lt;/p&gt;

&lt;p&gt;I built GoWithProof for a close friend I regularly make plans with. Whenever we decide where to eat, drink, or spend an evening around Delhi/Gurgaon, one of us inevitably ends up doing the same research loop: Google Maps, Reddit, restaurant apps, recent reviews, and then an AI search on top of all of it. We rarely trust a single source enough to make the decision.&lt;br&gt;
That recurring problem was the reason for this project. I wanted to build something specifically for the way we actually make plans together—not another generic “best restaurants near me” app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search Google Maps&lt;/li&gt;
&lt;li&gt;Check ratings&lt;/li&gt;
&lt;li&gt;Open Reddit&lt;/li&gt;
&lt;li&gt;Search for recent discussions&lt;/li&gt;
&lt;li&gt;Look at restaurant platforms&lt;/li&gt;
&lt;li&gt;Read the newest reviews&lt;/li&gt;
&lt;li&gt;Read the worst reviews&lt;/li&gt;
&lt;li&gt;Ask an AI&lt;/li&gt;
&lt;li&gt;Discover that every source says something different&lt;/li&gt;
&lt;li&gt;Still not know where to go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is not that recommendations are unavailable.&lt;/p&gt;

&lt;p&gt;The problem is that there are &lt;strong&gt;too many recommendations, from sources with different incentives, different levels of freshness, and different blind spots&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;GoWithProof&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recommendations with receipts.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GoWithProof is an AI-assisted decision engine for choosing places.&lt;/p&gt;

&lt;p&gt;Instead of asking an LLM:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's the best pub in Gurgaon?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and trusting whatever appears next, GoWithProof does something closer to how I would research the decision myself.&lt;/p&gt;

&lt;p&gt;It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;understands what you actually care about,&lt;/li&gt;
&lt;li&gt;discovers plausible places,&lt;/li&gt;
&lt;li&gt;researches recent reviews and live web evidence,&lt;/li&gt;
&lt;li&gt;deliberately searches for complaints and counter-evidence,&lt;/li&gt;
&lt;li&gt;extracts grounded claims,&lt;/li&gt;
&lt;li&gt;measures evidence quality and disagreement,&lt;/li&gt;
&lt;li&gt;ranks candidates deterministically,&lt;/li&gt;
&lt;li&gt;and shows both &lt;strong&gt;why you should consider a place and why you might not want to go there&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The feature I care about most is called &lt;strong&gt;Devil's Advocate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most recommendation systems spend their effort finding reasons why their recommendation is good.&lt;/p&gt;

&lt;p&gt;GoWithProof also asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What could make this recommendation wrong?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If a place looks great for craft beer but recent visitors repeatedly complain about service, noise, pricing, crowds, or reservations, I want to know that &lt;strong&gt;before&lt;/strong&gt; we leave home.&lt;/p&gt;
&lt;h3&gt;
  
  
  It doesn't require a perfect prompt
&lt;/h3&gt;

&lt;p&gt;A user can start with something vague:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find me a pub in Gurgaon."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GoWithProof progressively asks for the information that will materially change the decision.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"Friday around 8 PM."&lt;/p&gt;

&lt;p&gt;"Around ₹1500 per person."&lt;/p&gt;

&lt;p&gt;"Craft beer."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It builds a structured decision context across the conversation instead of forcing users to express every constraint in one giant prompt.&lt;/p&gt;

&lt;p&gt;During development, I also learned that specific preferences need to stay specific.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;craft beer != drinks
live music != music
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If someone asks for craft beer, a generic cocktail bar should not automatically count as a strong match.&lt;/p&gt;

&lt;p&gt;Preserving that meaning throughout clarification, discovery, research, and ranking became one of the most important parts of the system.&lt;/p&gt;




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

&lt;p&gt;👉 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://go-with-proof.onrender.com" rel="noopener noreferrer"&gt;https://go-with-proof.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can try something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dinner in CP tomorrow at 7 PM, 4 people, around ₹1000–1200 each, great food, vegetarian options, and quiet enough to talk.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or something simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Find me a pub in Gurgaon with good craft beer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The application will clarify missing details when necessary, research candidates, and return evidence-backed recommendations.&lt;/p&gt;




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

&lt;p&gt;The complete project is open source:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://gitlab.com/gargdaya/go-with-proof" rel="noopener noreferrer"&gt;https://gitlab.com/gargdaya/go-with-proof&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is a small monorepo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go-with-proof/
├── frontend/
│   └── Next.js + React + TypeScript
│
├── backend/
│   └── Bun + Elysia + TypeScript
│
├── .gitlab-ci.yml
└── render.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitLab CI runs the automated checks and production build, while the frontend and backend are deployed separately on Render.&lt;/p&gt;




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

&lt;p&gt;One of the main design decisions was to avoid building a system where an LLM receives a prompt and simply returns three restaurant names.&lt;/p&gt;

&lt;p&gt;I wanted to use the model where language models are strong, while keeping the actual decision process understandable and testable.&lt;/p&gt;

&lt;p&gt;The architecture looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  │
  ▼
Conversational clarification
  │
  ▼
Gemma
intent + constraints
  │
  ▼
DecisionContext
  │
  ▼
Candidate discovery
  │
  ▼
SerpApi
  │
  ├── Google Maps
  ├── Reviews
  └── Web/community search
          │
          ▼
Counter-evidence searches
          │
          ▼
Gemma evidence extraction
          │
          ▼
Grounding + Zod validation
          │
          ▼
Deduplication + normalization
          │
          ▼
Deterministic TypeScript ranking
          │
          ▼
Recommendations
  │
  ├── Why it fits
  ├── Confidence
  ├── Concerns
  └── Devil's Advocate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are really three different jobs in that pipeline:&lt;/p&gt;

&lt;h3&gt;
  
  
  Understand
&lt;/h3&gt;

&lt;p&gt;What does the user actually want?&lt;/p&gt;

&lt;h3&gt;
  
  
  Research
&lt;/h3&gt;

&lt;p&gt;What evidence exists about the candidates?&lt;/p&gt;

&lt;h3&gt;
  
  
  Decide
&lt;/h3&gt;

&lt;p&gt;How well does each candidate fit the current situation, and how much evidence do we actually have?&lt;/p&gt;

&lt;p&gt;Keeping those responsibilities separate made the system much easier to reason about.&lt;/p&gt;




&lt;h3&gt;
  
  
  Gemma: Language Understanding, Not an Oracle
&lt;/h3&gt;

&lt;p&gt;Gemma is at the core of GoWithProof, but it does not get to arbitrarily choose the final answer.&lt;/p&gt;

&lt;p&gt;I use two Gemma models for different workloads.&lt;/p&gt;

&lt;h4&gt;
  
  
  Gemma 3 4B
&lt;/h4&gt;

&lt;p&gt;The smaller model handles conversational clarification.&lt;/p&gt;

&lt;p&gt;This operation happens frequently and is latency-sensitive.&lt;/p&gt;

&lt;p&gt;Its job is to understand statements such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"tomorrow around seven"
"somewhere we can talk"
"around ₹1200 each"
"craft beer"
"vegetarian options"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and turn them into structured context.&lt;/p&gt;

&lt;h4&gt;
  
  
  Gemma 3 27B
&lt;/h4&gt;

&lt;p&gt;The larger model is used where understanding messy natural language becomes more important: extracting structured evidence from reviews and search results.&lt;/p&gt;

&lt;p&gt;Its job is to turn unstructured text into evidence such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"drinks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"claim"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The beer quality was praised."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"supportingQuote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Superb quality beer...."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"firsthand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Gemma does &lt;strong&gt;not&lt;/strong&gt; calculate the final recommendation score.&lt;/p&gt;

&lt;p&gt;That is deliberate.&lt;/p&gt;

&lt;p&gt;The model interprets language.&lt;/p&gt;

&lt;p&gt;The application makes the decision.&lt;/p&gt;

&lt;p&gt;Things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;freshness weighting,&lt;/li&gt;
&lt;li&gt;preference matching,&lt;/li&gt;
&lt;li&gt;negative ratios,&lt;/li&gt;
&lt;li&gt;source diversity,&lt;/li&gt;
&lt;li&gt;practical constraints,&lt;/li&gt;
&lt;li&gt;evidence quantity,&lt;/li&gt;
&lt;li&gt;disagreement,&lt;/li&gt;
&lt;li&gt;and confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are handled deterministically in TypeScript.&lt;/p&gt;

&lt;p&gt;That gives me something I can test and reason about.&lt;/p&gt;




&lt;h3&gt;
  
  
  SerpApi: Connecting the System to Live Evidence
&lt;/h3&gt;

&lt;p&gt;A recommendation engine isn't very useful if its knowledge stops at model training time.&lt;/p&gt;

&lt;p&gt;GoWithProof uses &lt;strong&gt;SerpApi&lt;/strong&gt; as its live research layer.&lt;/p&gt;

&lt;p&gt;It provides information used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;place discovery,&lt;/li&gt;
&lt;li&gt;Google Maps results,&lt;/li&gt;
&lt;li&gt;business metadata,&lt;/li&gt;
&lt;li&gt;ratings and review counts,&lt;/li&gt;
&lt;li&gt;operating information,&lt;/li&gt;
&lt;li&gt;recent reviews,&lt;/li&gt;
&lt;li&gt;low-rated reviews,&lt;/li&gt;
&lt;li&gt;Google Search results,&lt;/li&gt;
&lt;li&gt;community discovery,&lt;/li&gt;
&lt;li&gt;and deliberate counter-evidence searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key idea is that SerpApi provides &lt;strong&gt;evidence&lt;/strong&gt;, not the final answer.&lt;/p&gt;

&lt;p&gt;GoWithProof does not assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Google Maps ranked this first, therefore it must be the best."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, those results become inputs into a larger decision process.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;




&lt;h3&gt;
  
  
  I Search for Reasons NOT to Recommend a Place
&lt;/h3&gt;

&lt;p&gt;This is probably the most important part of the project.&lt;/p&gt;

&lt;p&gt;For a candidate, GoWithProof doesn't only run normal searches.&lt;/p&gt;

&lt;p&gt;It deliberately generates searches such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"&amp;lt;place&amp;gt;" bad experience
"&amp;lt;place&amp;gt;" overrated
"&amp;lt;place&amp;gt;" crowded
"&amp;lt;place&amp;gt;" expensive
"&amp;lt;place&amp;gt;" noisy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those searches can also depend on what the user actually cares about.&lt;/p&gt;

&lt;p&gt;If the user says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I want somewhere quiet enough to have a conversation."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;then evidence about noise becomes especially important.&lt;/p&gt;

&lt;p&gt;If they want craft beer, evidence about the beer matters more than generic evidence about cocktails.&lt;/p&gt;

&lt;p&gt;This became the &lt;strong&gt;Devil's Advocate&lt;/strong&gt; part of GoWithProof.&lt;/p&gt;

&lt;p&gt;Instead of only asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How can I justify recommending this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the system also asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What evidence would make me change my mind?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Every AI Claim Needs a Receipt
&lt;/h3&gt;

&lt;p&gt;One of my favorite bugs from the weekend changed the architecture.&lt;/p&gt;

&lt;p&gt;During a live test, a review said something positive about vegetarian food.&lt;/p&gt;

&lt;p&gt;Gemma produced a claim saying both:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the vegetarian food was good &lt;strong&gt;and the music was good&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The source excerpt did not actually support the music claim.&lt;/p&gt;

&lt;p&gt;It was a small hallucination.&lt;/p&gt;

&lt;p&gt;But for GoWithProof, that is a serious problem.&lt;/p&gt;

&lt;p&gt;The entire product is based on the idea that recommendations should be inspectable.&lt;/p&gt;

&lt;p&gt;So I changed the evidence model.&lt;/p&gt;

&lt;p&gt;Every extracted claim now contains a &lt;code&gt;supportingQuote&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Evidence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google_maps_review&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reddit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;official&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;web&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;sourceUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;sourceDate&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;food&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;noise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;crowd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ambience&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drinks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wait_time&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cleanliness&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;other&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;sentiment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;positive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;negative&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mixed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;neutral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;claim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;supportingQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;firsthand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend verifies that the supporting quote actually exists in the source material before accepting the evidence.&lt;/p&gt;

&lt;p&gt;If an extracted claim cannot be grounded in the retrieved text, it should not survive the pipeline.&lt;/p&gt;

&lt;p&gt;That was an important lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;LLMs can be excellent evidence interpreters, but evidence still needs verification.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Negative Evidence Is First-Class Data
&lt;/h3&gt;

&lt;p&gt;I also wanted to avoid the classic recommendation pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4.5 stars — highly recommended!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A place can have thousands of excellent reviews while still having a recurring problem that matters specifically to you.&lt;/p&gt;

&lt;p&gt;So GoWithProof tracks negative evidence explicitly.&lt;/p&gt;

&lt;p&gt;For every candidate it can calculate things such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total evidence
positive evidence
negative evidence
negative ratio
recent negative evidence
source diversity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ratio matters more than simply counting complaints.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 negative signals out of 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is very different from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 negative signals out of 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;even though the raw negative count is identical.&lt;/p&gt;

&lt;p&gt;Freshness matters too.&lt;/p&gt;

&lt;p&gt;A complaint from last month should generally matter more than a complaint from four years ago.&lt;/p&gt;




&lt;h3&gt;
  
  
  Match and Confidence Are Not the Same Thing
&lt;/h3&gt;

&lt;p&gt;This became another important lesson.&lt;/p&gt;

&lt;p&gt;Imagine a place appears to perfectly satisfy what the user asked for.&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the right kind of venue,&lt;/li&gt;
&lt;li&gt;in the right area,&lt;/li&gt;
&lt;li&gt;open at the requested time,&lt;/li&gt;
&lt;li&gt;and associated with the requested preference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That can make it look like an excellent fit.&lt;/p&gt;

&lt;p&gt;But what if the system only managed to collect one useful piece of evidence?&lt;/p&gt;

&lt;p&gt;Then these two statements are very different:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This place looks like a good fit.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We have strong evidence that this place is a good fit.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GoWithProof therefore separates recommendation fit from evidence confidence.&lt;/p&gt;

&lt;p&gt;A candidate can effectively be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Strong potential fit · Low confidence&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;instead of turning sparse evidence into false certainty.&lt;/p&gt;

&lt;p&gt;When the evidence is too weak, the application explicitly labels it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Weak evidence&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think recommendation systems should be allowed to admit uncertainty.&lt;/p&gt;




&lt;h3&gt;
  
  
  Disagreement Is Useful Information
&lt;/h3&gt;

&lt;p&gt;Sources do not always agree.&lt;/p&gt;

&lt;p&gt;Instead of averaging disagreement away, GoWithProof can track it by category.&lt;/p&gt;

&lt;p&gt;Imagine the research produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Food
8 positive
1 negative

Service
6 positive
5 negative

Noise
1 positive
7 negative
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those categories tell very different stories.&lt;/p&gt;

&lt;p&gt;Food looks consistently strong.&lt;/p&gt;

&lt;p&gt;Service is disputed.&lt;/p&gt;

&lt;p&gt;Noise looks like a legitimate concern.&lt;/p&gt;

&lt;p&gt;A single average score hides all of that.&lt;/p&gt;

&lt;p&gt;GoWithProof preserves disagreements so the user can decide whether they matter.&lt;/p&gt;




&lt;h3&gt;
  
  
  Failure Is Part of Live Web Research
&lt;/h3&gt;

&lt;p&gt;Real-time research is messy.&lt;/p&gt;

&lt;p&gt;During development I encountered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;empty search results,&lt;/li&gt;
&lt;li&gt;malformed model output,&lt;/li&gt;
&lt;li&gt;network failures,&lt;/li&gt;
&lt;li&gt;provider timeouts,&lt;/li&gt;
&lt;li&gt;missing dates,&lt;/li&gt;
&lt;li&gt;duplicate URLs,&lt;/li&gt;
&lt;li&gt;evidence that could not safely be attributed,&lt;/li&gt;
&lt;li&gt;and community searches with no useful result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't want one unavailable source to make the whole recommendation fail.&lt;/p&gt;

&lt;p&gt;Each research channel therefore has its own coverage state.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recentReviews"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lowRatedReviews"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"community"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"empty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"counter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system can still return useful partial research.&lt;/p&gt;

&lt;p&gt;And importantly, it can tell the user when evidence is incomplete instead of silently pretending everything succeeded.&lt;/p&gt;




&lt;h3&gt;
  
  
  The First Research Pipeline Took 85 Seconds
&lt;/h3&gt;

&lt;p&gt;One of my first successful live research runs took around &lt;strong&gt;85 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It technically worked.&lt;/p&gt;

&lt;p&gt;But nobody wants to stare at a loading spinner for a minute and a half while deciding where to eat.&lt;/p&gt;

&lt;p&gt;The first implementation was performing too much research across too many candidates.&lt;/p&gt;

&lt;p&gt;So I changed the orchestration.&lt;/p&gt;

&lt;p&gt;Instead of deeply researching everything immediately, the pipeline became closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Broad discovery
      │
      ▼
Candidate filtering
      │
      ▼
Smaller research set
      │
      ▼
Parallel source collection
      │
      ▼
Evidence extraction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Independent searches run concurrently with bounded concurrency.&lt;/p&gt;

&lt;p&gt;Candidate research is capped.&lt;/p&gt;

&lt;p&gt;Partial results can survive the research time budget.&lt;/p&gt;

&lt;p&gt;One later live run dropped from roughly &lt;strong&gt;85 seconds to around 15 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That was a useful engineering lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Better prompting cannot compensate for inefficient orchestration.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Progressive Clarification Was Harder Than Expected
&lt;/h3&gt;

&lt;p&gt;The clarification system also went through several iterations.&lt;/p&gt;

&lt;p&gt;Initially, every answer was sent back through Gemma.&lt;/p&gt;

&lt;p&gt;That caused a funny but important failure.&lt;/p&gt;

&lt;p&gt;The UI asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What matters most?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The user clicked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Drinks"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The backend failed to preserve that answer correctly.&lt;/p&gt;

&lt;p&gt;So it asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What matters most?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;The fix was simple once it was obvious:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not use AI to interpret information your own UI already knows.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quick-choice answers are now merged deterministically.&lt;/p&gt;

&lt;p&gt;Gemma is reserved for genuinely free-form language such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"good beers and somewhere we can actually talk"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That reduced unnecessary inference and removed an entire class of clarification loops.&lt;/p&gt;




&lt;h3&gt;
  
  
  Specific Intent Should Stay Specific
&lt;/h3&gt;

&lt;p&gt;Another problem appeared when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;craft beer → drinks
live music → music
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those transformations are technically reasonable abstractions, but they destroy information that matters to the decision.&lt;/p&gt;

&lt;p&gt;A person asking for craft beer does not simply want "drinks".&lt;/p&gt;

&lt;p&gt;A person asking for live music does not necessarily want a DJ.&lt;/p&gt;

&lt;p&gt;So GoWithProof preserves specific traits alongside broad categories.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priorities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"drinks"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"traits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"craft_beer"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That information can then influence discovery and ranking.&lt;/p&gt;

&lt;p&gt;It also prevents unrelated evidence from being treated as more relevant than it really is.&lt;/p&gt;

&lt;p&gt;For example, a complaint about cocktails should not automatically mean the craft beer is bad.&lt;/p&gt;




&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;The backend has tests around the areas I considered most dangerous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;context accumulation,&lt;/li&gt;
&lt;li&gt;explicit corrections,&lt;/li&gt;
&lt;li&gt;timezone-aware dates,&lt;/li&gt;
&lt;li&gt;quick-choice merging,&lt;/li&gt;
&lt;li&gt;clarification loops,&lt;/li&gt;
&lt;li&gt;model validation,&lt;/li&gt;
&lt;li&gt;evidence grounding,&lt;/li&gt;
&lt;li&gt;deduplication,&lt;/li&gt;
&lt;li&gt;unknown source dates,&lt;/li&gt;
&lt;li&gt;partial provider failure,&lt;/li&gt;
&lt;li&gt;freshness weighting,&lt;/li&gt;
&lt;li&gt;negative ratios,&lt;/li&gt;
&lt;li&gt;source diversity,&lt;/li&gt;
&lt;li&gt;disagreement detection,&lt;/li&gt;
&lt;li&gt;ranking,&lt;/li&gt;
&lt;li&gt;confidence,&lt;/li&gt;
&lt;li&gt;and weak-evidence handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time I froze the backend for submission:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;86 automated tests were passing&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;along with successful type checks and production builds.&lt;/p&gt;

&lt;p&gt;For a weekend project, writing those tests saved much more time than they cost.&lt;/p&gt;




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

&lt;h4&gt;
  
  
  Frontend
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;shadcn/ui&lt;/li&gt;
&lt;li&gt;Lucide&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Backend
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Bun&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Elysia&lt;/li&gt;
&lt;li&gt;Zod&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  AI
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 3 4B&lt;/li&gt;
&lt;li&gt;Gemma 3 27B&lt;/li&gt;
&lt;li&gt;Hugging Face Inference&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Live Research
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;SerpApi&lt;/li&gt;
&lt;li&gt;Google Maps results&lt;/li&gt;
&lt;li&gt;Google Maps reviews&lt;/li&gt;
&lt;li&gt;Google Search and community discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Deployment
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Render Web Service for the frontend&lt;/li&gt;
&lt;li&gt;Render Web Service for the backend&lt;/li&gt;
&lt;li&gt;GitLab CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both production services are described in &lt;code&gt;render.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;GitLab CI performs verification before deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push
   │
   ▼
GitLab CI
   │
   ├── install
   ├── tests
   ├── typecheck
   └── production build
          │
          ▼
        Render
       /      \
 frontend    backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no PM2, Docker, Redis, queue, vector database, or giant agent framework involved.&lt;/p&gt;

&lt;p&gt;For this project I deliberately preferred a small system whose decisions I could still understand.&lt;/p&gt;




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

&lt;p&gt;GoWithProof is fundamentally about questioning opaque authority.&lt;/p&gt;

&lt;p&gt;The application doesn't say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Trust this recommendation because AI said so."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here is the evidence I found. Here is what supports the recommendation. Here is what contradicts it. You decide."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted the AI layer to follow the same philosophy.&lt;/p&gt;

&lt;p&gt;Using an open-weight model like Gemma means the language-understanding layer isn't inseparably tied to a single proprietary recommendation system.&lt;/p&gt;

&lt;p&gt;The architecture keeps clear boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gemma
"What does the user mean?"
"What does this evidence say?"

SerpApi
"What is happening on the live web?"

Application code
"How fresh is this?"
"How relevant is it?"
"How much independent evidence exists?"
"Where do sources disagree?"
"How strongly should we recommend it?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That separation gives me control over the actual decision logic.&lt;/p&gt;

&lt;p&gt;I can change model sizes.&lt;/p&gt;

&lt;p&gt;I can change inference providers.&lt;/p&gt;

&lt;p&gt;I can inspect and iterate on prompts.&lt;/p&gt;

&lt;p&gt;I can test deterministic scoring independently.&lt;/p&gt;

&lt;p&gt;And because Gemma is open-weight, the model itself can eventually run in environments where sending every user interaction to a closed hosted model is not desirable.&lt;/p&gt;

&lt;p&gt;A completely closed recommendation API would give me an answer.&lt;/p&gt;

&lt;p&gt;Open components let me build a &lt;strong&gt;decision process&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That difference is the entire point of GoWithProof.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't ask for authority. Ask for evidence.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;I started the weekend thinking I was building a recommendation engine.&lt;/p&gt;

&lt;p&gt;By the end, I realized I was really building a small &lt;strong&gt;decision engine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The interesting questions were not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I ask an LLM for the top three restaurants?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They were:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I know whether this evidence is actually about this restaurant?"&lt;/p&gt;

&lt;p&gt;"What happens when recent reviews disagree with the overall rating?"&lt;/p&gt;

&lt;p&gt;"Should five negative reviews matter if there are eighty positive ones?"&lt;/p&gt;

&lt;p&gt;"How do I distinguish a place that looks right from a place I have strong evidence for?"&lt;/p&gt;

&lt;p&gt;"What happens when one research source fails?"&lt;/p&gt;

&lt;p&gt;"How do I stop the model from turning 'craft beer' into generic 'drinks'?"&lt;/p&gt;

&lt;p&gt;"How do I prevent an extracted claim from saying more than its source actually said?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those questions made the project much more interesting than the original idea.&lt;/p&gt;

&lt;p&gt;The biggest lessons were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discovery and verification are different problems.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specific user intent should remain specific.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Negative evidence deserves equal treatment.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Freshness matters.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source disagreement should be exposed, not averaged away.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A model-generated claim needs provenance.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match quality and evidence confidence are different concepts.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial failure is normal in live web research.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deterministic code is often better than another LLM call.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sometimes "I don't have enough evidence" is the best recommendation.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I'd Build Next
&lt;/h2&gt;

&lt;p&gt;There is a lot more I would like to explore with GoWithProof.&lt;/p&gt;

&lt;p&gt;Future versions could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;post-visit feedback,&lt;/li&gt;
&lt;li&gt;gradual preference learning,&lt;/li&gt;
&lt;li&gt;remembering what kinds of places a user actually enjoys,&lt;/li&gt;
&lt;li&gt;comparing places friends have already suggested,&lt;/li&gt;
&lt;li&gt;stronger cross-platform candidate discovery,&lt;/li&gt;
&lt;li&gt;deeper Reddit/community research,&lt;/li&gt;
&lt;li&gt;on-demand verification of a specific place,&lt;/li&gt;
&lt;li&gt;recommendation history,&lt;/li&gt;
&lt;li&gt;streaming research progress,&lt;/li&gt;
&lt;li&gt;trip and itinerary decisions,&lt;/li&gt;
&lt;li&gt;and eventually decisions beyond restaurants entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But those are extensions.&lt;/p&gt;

&lt;p&gt;The core idea is already:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discover
   ↓
Verify
   ↓
Challenge
   ↓
Decide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma is a core part of GoWithProof rather than an optional chatbot layer.&lt;/p&gt;

&lt;p&gt;Gemma handles natural-language clarification and turns messy live research into structured evidence.&lt;/p&gt;

&lt;p&gt;I use a smaller Gemma model for latency-sensitive clarification and a larger model for deeper evidence interpretation.&lt;/p&gt;

&lt;p&gt;The final ranking remains deterministic, making the boundary between model interpretation and application decision-making explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of SerpApi
&lt;/h3&gt;

&lt;p&gt;SerpApi is GoWithProof's connection to the live world.&lt;/p&gt;

&lt;p&gt;It powers place discovery, Maps information, review retrieval, organic search, community discovery, and the deliberate counter-evidence searches that make Devil's Advocate possible.&lt;/p&gt;

&lt;p&gt;Without live search, the product would simply be another model recommending places from stale training knowledge.&lt;/p&gt;

&lt;p&gt;SerpApi turns it into a research system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Render
&lt;/h3&gt;

&lt;p&gt;The complete production application runs on Render.&lt;/p&gt;

&lt;p&gt;Both the Next.js frontend and Bun/Elysia backend are deployed as independent Render Web Services.&lt;/p&gt;

&lt;p&gt;The backend running on Render orchestrates live SerpApi research, Gemma inference, validation, evidence processing, and ranking.&lt;/p&gt;

&lt;p&gt;Deployment configuration is committed as infrastructure-as-code through &lt;code&gt;render.yaml&lt;/code&gt;, while GitLab CI runs tests, type checks, and production builds before deployment.&lt;/p&gt;




&lt;p&gt;I built GoWithProof because I wanted a recommendation system I could disagree with.&lt;/p&gt;

&lt;p&gt;Not one that hides uncertainty behind a confident answer.&lt;/p&gt;

&lt;p&gt;Not one that assumes the highest-rated result must be right.&lt;/p&gt;

&lt;p&gt;And not one that asks me to trust an AI without showing me where its answer came from.&lt;/p&gt;

&lt;p&gt;Sometimes the most useful thing an AI can say isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Go here."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"This looks promising. Here's the evidence. Here's what worries me. Now you decide."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's &lt;strong&gt;GoWithProof&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendations with receipts.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Mastering Database Schema Design: The First Step of Requirement Gathering</title>
      <dc:creator>Dayanand garg</dc:creator>
      <pubDate>Thu, 30 Mar 2023 18:19:23 +0000</pubDate>
      <link>https://dev.to/dayanandgarg/mastering-database-schema-design-the-first-step-of-requirement-gathering-26dn</link>
      <guid>https://dev.to/dayanandgarg/mastering-database-schema-design-the-first-step-of-requirement-gathering-26dn</guid>
      <description>&lt;p&gt;When it comes to designing a database schema, the first and most important step is requirement gathering. This step involves understanding the needs and objectives of the system being developed and the data that will be stored and processed within the database. A well-designed database schema can greatly improve the efficiency and accuracy of data management, and ultimately, the success of the system as a whole.&lt;/p&gt;

&lt;p&gt;Here are some key steps to follow when gathering requirements for database schema design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Identify the stakeholders: The first step in requirement gathering is to identify the stakeholders who will be using the system and the data that will be stored in the database. This includes end-users, developers, and other stakeholders such as managers, administrators, and data analysts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine the scope: Once the stakeholders have been identified, it is important to determine the scope of the system and the database. This includes understanding the business processes, rules, and workflows that will be supported by the database, as well as the types of data that will be stored and processed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define the data entities: Once the scope has been determined, the next step is to define the data entities that will be stored in the database. This involves identifying the key data elements and their relationships, as well as any constraints or rules that must be applied to the data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine the data attributes: For each data entity, it is important to determine the attributes that will be stored in the database. This includes defining the data type, size, format, and any other relevant properties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identify the relationships: Once the data entities and attributes have been defined, the next step is to identify the relationships between the entities. This involves understanding the primary keys, foreign keys, and any other relationships that must be established to ensure data integrity and consistency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consider performance and scalability: Finally, when gathering requirements for database schema design, it is important to consider performance and scalability. This includes understanding the expected volume of data and transactions, as well as the types of queries and reports that will be generated. This information can be used to design a database schema that is optimized for performance and can scale to meet future needs.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Overall, requirement gathering is a crucial step in the database schema design process. By taking the time to understand the needs and objectives of the system and the data that will be stored and processed, it is possible to design a database schema that is efficient, accurate, and supports the needs of all stakeholders.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Database Design 101: An Introduction</title>
      <dc:creator>Dayanand garg</dc:creator>
      <pubDate>Wed, 22 Feb 2023 17:30:50 +0000</pubDate>
      <link>https://dev.to/dayanandgarg/database-design-101-an-introduction-129o</link>
      <guid>https://dev.to/dayanandgarg/database-design-101-an-introduction-129o</guid>
      <description>&lt;p&gt;If you're new to the field of &lt;em&gt;database design&lt;/em&gt;, you might be wondering what it is and why it's important. In this post, we'll provide a basic overview of database design, explain why it matters, and walk you through the basic steps involved in the database design process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is database design?
&lt;/h2&gt;

&lt;p&gt;At its core, database design is the process of creating a logical and physical model of a database system. This involves defining the structure of the data, the relationships between different data elements, and the rules for storing and retrieving the data. A well-designed database can improve data accuracy, reduce data redundancy, and provide faster access to the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is database design important?&lt;/strong&gt;&lt;br&gt;
Database design is critical because it can impact the performance and usability of a database system. Poorly designed databases can lead to data inconsistencies, slower performance, and difficulties in retrieving and analyzing data. On the other hand, well-designed databases can provide numerous benefits, including improved data accuracy, increased data security, and faster access to the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps in the database design process
&lt;/h2&gt;

&lt;p&gt;The database design process typically involves several distinct steps, including requirements gathering, conceptual design, logical design, normalization, physical design, implementation, and maintenance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Requirements gathering&lt;/strong&gt;: This involves understanding user requirements, defining data elements, and creating use cases and scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conceptual design&lt;/strong&gt;: This step involves creating an Entity-Relationship (ER) model, identifying entities and attributes, and defining relationships between entities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logical design&lt;/strong&gt;: Here, you create a relational schema, define tables and columns, and create primary and foreign keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalization&lt;/strong&gt;: This step involves organizing the data into tables and eliminating redundancy in the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical design&lt;/strong&gt;: In this step, you choose a database management system (DBMS), define storage structures, and create indexes and views.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt;: This involves creating the database schema, populating the database with data, and ensuring data integrity and security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance&lt;/strong&gt;: Finally, you'll monitor the database performance, back up and restore the database, and modify the database schema as needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Database design is a complex and important field that can have a significant impact on the performance and usability of a database system. By understanding the basic steps involved in the database design process, you can begin to create databases that are well-designed, secure, and efficient. In the coming chapters of this book, we'll dive deeper into each step of the database design process, providing practical advice and best practices along the way.&lt;/p&gt;

&lt;p&gt;We hope you found this introduction to database design helpful. If you have any questions or comments, please feel free to leave them below!&lt;/p&gt;

</description>
      <category>posts</category>
      <category>writing</category>
      <category>contentwriting</category>
    </item>
    <item>
      <title>Why Next.js is the Best Choice for Server-Side Rendering with React</title>
      <dc:creator>Dayanand garg</dc:creator>
      <pubDate>Wed, 22 Feb 2023 04:59:37 +0000</pubDate>
      <link>https://dev.to/dayanandgarg/why-nextjs-is-the-best-choice-for-server-side-rendering-with-react-11hk</link>
      <guid>https://dev.to/dayanandgarg/why-nextjs-is-the-best-choice-for-server-side-rendering-with-react-11hk</guid>
      <description>&lt;p&gt;In recent years, server-side rendering (SSR) has become an essential part of building modern web applications. Server-side rendering allows web developers to provide better user experience and improve search engine optimization (SEO) by pre-rendering HTML on the server before sending it to the client. React, one of the most popular JavaScript libraries for building web applications, also supports server-side rendering. In this blog, we'll discuss why Next.js is the best choice for server-side rendering with React.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Next.js?
&lt;/h2&gt;

&lt;p&gt;Next.js is a popular open-source framework for building server-rendered React applications. It was created by Vercel, the company that created the popular JavaScript-based JAMstack platform. Next.js provides a set of tools and features that help developers build high-performance web applications. Some of its features include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Server-side rendering&lt;/strong&gt;: Next.js provides built-in support for server-side rendering, which means that your application's pages are pre-rendered on the server and sent to the client as HTML. This significantly improves the time-to-first-byte (TTFB) and makes the website load faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatic code splitting&lt;/strong&gt;: Next.js automatically splits your code into smaller chunks, which reduces the size of the JavaScript files and improves the page load time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Static site generation&lt;/strong&gt;: Next.js supports static site generation, which means that your website's pages can be pre-generated as static HTML files and served from a content delivery network (CDN). This further improves the page load time and reduces the server's load.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why Next.js is the Best Choice for Server-Side Rendering with React&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easy to get started&lt;/strong&gt;: Next.js provides an easy-to-use CLI tool that helps you create a new project quickly. You don't need to set up a separate server or configure complex build tools. Next.js takes care of all the setup, so you can focus on building your application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provides a great developer experience&lt;/strong&gt;: Next.js provides a great developer experience by supporting hot module replacement (HMR), which means that your changes are reflected in the browser instantly. This makes the development process faster and more efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improves search engine optimization&lt;/strong&gt;: By using server-side rendering, Next.js provides search engine crawlers with fully rendered HTML pages, which makes it easier for them to index your website's content. This improves the website's visibility on search engine results pages (SERPs) and can lead to more organic traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better performance&lt;/strong&gt;: Next.js provides faster page load times by using server-side rendering and automatic code splitting. This significantly reduces the time-to-first-byte (TTFB) and makes the website load faster. In addition, Next.js supports static site generation, which makes the website even faster by serving pre-generated HTML files from a content delivery network (CDN).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next.js is a powerful open-source framework for building server-rendered React applications. It provides a set of tools and features that make it easy to get started and improve the website's performance, developer experience, and search engine optimization. If you're looking to build a server-rendered React application, Next.js is the best choice&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to track user location in background</title>
      <dc:creator>Dayanand garg</dc:creator>
      <pubDate>Sat, 18 Feb 2023 03:51:12 +0000</pubDate>
      <link>https://dev.to/dayanandgarg/how-to-track-user-location-in-background-pnm</link>
      <guid>https://dev.to/dayanandgarg/how-to-track-user-location-in-background-pnm</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidexowthye4it78i0n72.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidexowthye4it78i0n72.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In many mobile apps, it's important to track the user's location to provide location-based services or gather data for analytics purposes. However, tracking the location in the background and sending it to the server can be challenging, especially when the screen is locked or the app is in the background. In this tutorial, we'll learn how to update the user's location in every 15 minutes and send it to the server even when the screen is locked in a React Native app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we get started, make sure you have the following installed on your development machine:&lt;/p&gt;

&lt;p&gt;Node.js (v10 or later)&lt;br&gt;
React Native CLI&lt;br&gt;
Android Studio (for Android development)&lt;br&gt;
Xcode (for iOS development)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install necessary packages
&lt;/h2&gt;

&lt;p&gt;First, let's install the necessary packages to track the user's location in the background and schedule a background task. Run the following commands in your terminal:&lt;/p&gt;

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

npm install @react-native-community/geolocation
npm install react-native-background-task


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Step 2: Grant permissions
&lt;/h2&gt;

&lt;p&gt;Next, we need to grant the necessary permissions to access the device's location. Depending on your target platform, you need to add the following lines to your AndroidManifest.xml and Info.plist files:&lt;/p&gt;

&lt;p&gt;AndroidManifest.xml:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&amp;gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;Info.plist:&lt;/p&gt;

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

&amp;lt;key&amp;gt;NSLocationAlwaysAndWhenInUseUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;Location is used to track your movements.&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;NSLocationAlwaysUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;Location is used to track your movements.&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;NSLocationWhenInUseUsageDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;Location is used to track your movements.&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;UIBackgroundModes&amp;lt;/key&amp;gt;
&amp;lt;array&amp;gt;
  &amp;lt;string&amp;gt;fetch&amp;lt;/string&amp;gt;
  &amp;lt;string&amp;gt;remote-notification&amp;lt;/string&amp;gt;
  &amp;lt;string&amp;gt;location&amp;lt;/string&amp;gt;
&amp;lt;/array&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;These permissions allow the app to access the device's location even when the app is in the background or the screen is locked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Set up background location tracking
&lt;/h2&gt;

&lt;p&gt;Now, let's set up the background location tracking using the Geolocation module from @react-native-community/geolocation. This module provides a way to watch the device's position in the background and receive updates at a given interval.&lt;/p&gt;

&lt;p&gt;Here's an example of how you can set up the background location tracking:&lt;/p&gt;

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

import Geolocation from '@react-native-community/geolocation';

// Configure Geolocation
Geolocation.setRNConfiguration({
  authorizationLevel: 'always', // Request "always" location permission
  skipPermissionRequests: false, // Prompt for permission if not granted
});

// Watch for position updates
const watchId = Geolocation.watchPosition(
  position =&amp;gt; {
    console.log(position);
    // Send the position data to the server
  },
  error =&amp;gt; {
    console.log(error);
  },
  {
    distanceFilter: 10, // Minimum distance (in meters) to update the location
    interval: 900000, // Update interval (in milliseconds), which is 15 minutes
    fastestInterval: 300000, // Fastest update interval (in milliseconds)
    accuracy: {
      android: 'highAccuracy',
      ios: 'best',
    },
    showsBackgroundLocationIndicator: true,
    pausesLocationUpdatesAutomatically: false,
    activityType: 'fitness', // Specify the activity type (e.g., 'fitness' or 'other')
    useSignificantChanges: false,
    deferredUpdatesInterval: 0,
    deferredUpdatesDistance: 0,
    foregroundService: {
      notificationTitle: 'Tracking your location',
      notificationBody: 'Enable location tracking to continue', // Add a notification body
    },
  }
);

// To stop tracking (for example, when the component unmounts):
// Geolocation.clearWatch(watchId);



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

&lt;/div&gt;

&lt;p&gt;By following the steps outlined in this tutorial, you can ensure that your app continues to track the user's location and provide relevant services even when the app is in the background or the screen is locked.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
