<?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: Rafayet Hossain</title>
    <description>The latest articles on DEV Community by Rafayet Hossain (@rafayet_extras).</description>
    <link>https://dev.to/rafayet_extras</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Rafayet Hossain</title>
      <link>https://dev.to/rafayet_extras</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rafayet_extras"/>
    <language>en</language>
    <item>
      <title>Realist: an open-weight listing auditor that finds the mismatch before your buyer does</title>
      <dc:creator>Rafayet Hossain</dc:creator>
      <pubDate>Wed, 14 Oct 2026 04:53:25 +0000</pubDate>
      <link>https://dev.to/rafayet_extras/realist-an-open-weight-listing-auditor-that-finds-the-mismatch-before-your-buyer-does-jd6</link>
      <guid>https://dev.to/rafayet_extras/realist-an-open-weight-listing-auditor-that-finds-the-mismatch-before-your-buyer-does-jd6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is my submission for the Side Hustle challenge.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem nobody wants to proofread
&lt;/h2&gt;

&lt;p&gt;If you sell on eBay or Etsy, you have probably written a title that says "Bluetooth 5.3" above a spec table that says "5.0". Or photographed a product next to a charger and never said whether the charger comes with it. Or typed "dishwasher-safe" because the supplier's page did.&lt;/p&gt;

&lt;p&gt;Each of these is small. Each costs a return, a refund, or a one-star review that says "not as described". And the only tool most sellers have for catching them is rereading their own listing, which is the one thing you can't do well, because you already know what you meant.&lt;/p&gt;

&lt;p&gt;Most AI tooling for sellers goes the other direction and writes &lt;em&gt;more&lt;/em&gt; listings. I wanted the opposite: a quality-control pass that tells you what's wrong with the one you already have.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Realist does
&lt;/h2&gt;

&lt;p&gt;Paste a title, description and spec list, add up to eight photos, and Realist returns findings. Every finding has the exact fields or photo involved, a confidence, and a next step. For my test listing it reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔴 Contradiction · bluetooth_version · high · confidence 100%
 - title: Bluetooth 5.3
 - specifications.Bluetooth Version: 5.0
Next: Check the manufacturer's documentation and make every field agree.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Findings come in four kinds, and keeping them apart is the core design decision:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;text_conflict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Two fields disagree. This is a fact about the listing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image_mismatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A photo appears to disagree with the text. This is an observation, with uncertainty.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;possible_omission&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Something visible isn't explained, such as an accessory in the photo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unverified_claim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nothing supplied can back the claim up. This is &lt;em&gt;not&lt;/em&gt; an accusation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A photo that doesn't show an IP67 rating doesn't prove the product isn't IP67. Realist says "verify this", never "this is false".&lt;/p&gt;

&lt;h2&gt;
  
  
  The design choice: don't ask the LLM everything
&lt;/h2&gt;

&lt;p&gt;My first instinct was to hand the model the whole listing and ask whether it looks right. I decided against that, for a reason that shaped the project: &lt;strong&gt;a model's judgment is the wrong tool for anything you can compare exactly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the work is split in two.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plain Python does the comparing.&lt;/strong&gt; It extracts Bluetooth version, IP rating, weight, quantity, battery capacity and color from the title, description and specs, normalizes them, and checks them against each other. &lt;code&gt;1.5 kg&lt;/code&gt; and &lt;code&gt;1500 g&lt;/code&gt; are consistent, because weights are converted to grams first. &lt;code&gt;5.3&lt;/code&gt; against &lt;code&gt;5.0&lt;/code&gt; is a conflict every time, with no sampling and no temperature. That is why the confidence on a text conflict is 1.0. It's confidence that the fields disagree, not that either one is right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A vision model only reports what it sees.&lt;/strong&gt; It returns structured observations per photo (colors, visible accessories, legible text, item count) and never judgments. Python then compares those observations to the listing. A model that says "I see a USB cable" is much easier to trust, and to check, than one that says "this listing seems incomplete".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same split sets how much each finding is trusted. A photo-based color mismatch is capped at 0.8 confidence, because lighting and image processing can shift color. An OCR'd model number that's &lt;em&gt;close&lt;/em&gt; to the listed one but different gets 0.5, because OCR misreads characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open models matter here
&lt;/h2&gt;

&lt;p&gt;This is the part where the open approach did real work, rather than being a checkbox.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seller data stays on the seller's machine.&lt;/strong&gt; Supplier photos, unreleased products, cost-bearing spec sheets: for a seller, a listing draft is business data. Realist runs Qwen2.5-VL-7B through a local Ollama server (default &lt;code&gt;qwen2.5vl:7b&lt;/code&gt;). Photos are resized and stripped of metadata, then sent to &lt;code&gt;127.0.0.1&lt;/code&gt; and nowhere else. I'd still tell anyone to verify their own setup's telemetry before promising "never leaves your computer", and I turned off Streamlit's usage stats for that reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is a swappable part.&lt;/strong&gt; The audit depends on a three-line &lt;code&gt;VisionBackend&lt;/code&gt; interface. When a better vision model appears, or the 7B turns out too slow, I change one class. With a hosted API I'd be rewriting around someone else's pricing and deprecation schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost per audit is close to zero.&lt;/strong&gt; A seller auditing a few hundred listings pays in electricity, not tokens. That decides whether a $9/month plan is a business or a loss. It isn't free (a 7B vision model on a CPU-only machine is slow, and I haven't benchmarked it yet), but the cost is mine to optimize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can read what's running.&lt;/strong&gt; Apache-2.0 for the model and for PaddleOCR (the optional OCR layer) means I can check the licensing for commercial use instead of trusting a terms page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I tested, and what I haven't
&lt;/h2&gt;

&lt;p&gt;Honesty section, because I'd rather you hear it from me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tested:&lt;/strong&gt; the deterministic engine, with 10 unit tests. They cover a matching listing producing zero findings, a deliberately broken listing producing exactly the planted conflicts (Bluetooth version, color, weight, quantity), unit equivalence not being flagged, claims supported by a spec not being flagged, a claim contradicted by a spec being caught, and HTML export escaping hostile input. The Streamlit UI also runs end to end headless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not tested yet:&lt;/strong&gt; I tested the photo checks with hand-written observations, so I can't yet tell you how often the model's &lt;em&gt;real&lt;/em&gt; observations are accurate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not built:&lt;/strong&gt; a labelled evaluation set with precision, recall and false-positive rate, and a model-only baseline to compare against. My hypothesis is that the hybrid approach produces fewer false alarms and more actionable findings than "ask an LLM if this looks right". It is a hypothesis, and I haven't measured it.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Build the 30–50 listing evaluation set and publish the numbers, including the baseline.&lt;/li&gt;
&lt;li&gt;Add more rule families: dimensions, voltage and wattage, compatibility claims, material claims.&lt;/li&gt;
&lt;li&gt;Batch audits and a downloadable report for agencies running hundreds of listings. Free for 5 audits, then somewhere around $9 to $29 a month. Those prices are guesses to test, not market rates.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; .venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
.venv/bin/streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Photo analysis is optional: install Ollama and &lt;code&gt;ollama pull qwen2.5vl:7b&lt;/code&gt;. Without it, Realist runs the text checks and tells you the photos weren't analyzed.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>Hello</title>
      <dc:creator>Rafayet Hossain</dc:creator>
      <pubDate>Mon, 12 Oct 2026 16:43:01 +0000</pubDate>
      <link>https://dev.to/rafayet_extras/hello-3m93</link>
      <guid>https://dev.to/rafayet_extras/hello-3m93</guid>
      <description>&lt;p&gt;Hi&lt;/p&gt;

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