<?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: Jay Durango</title>
    <description>The latest articles on DEV Community by Jay Durango (@jaydurangodev).</description>
    <link>https://dev.to/jaydurangodev</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3812510%2F6a9863a4-e9a1-41a0-a141-d95a21da7af1.png</url>
      <title>DEV Community: Jay Durango</title>
      <link>https://dev.to/jaydurangodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaydurangodev"/>
    <language>en</language>
    <item>
      <title>I Built a 10-Factor Scoring Algorithm to Rate Any Business Location (C to AAA)</title>
      <dc:creator>Jay Durango</dc:creator>
      <pubDate>Sun, 08 Mar 2026 06:28:27 +0000</pubDate>
      <link>https://dev.to/jaydurangodev/i-built-a-10-factor-scoring-algorithm-to-rate-any-business-location-c-to-aaa-2pja</link>
      <guid>https://dev.to/jaydurangodev/i-built-a-10-factor-scoring-algorithm-to-rate-any-business-location-c-to-aaa-2pja</guid>
      <description>&lt;p&gt;I run a small portfolio of brick-and-mortar businesses. Every time I evaluate a new location — gas station, auto shop, retail space — I'd spend days pulling data from Google Maps, census reports, traffic studies, and competitor lists. Then I'd dump it all into a spreadsheet and try to make a decision.&lt;/p&gt;

&lt;p&gt;It was slow, inconsistent, and subjective. So I built an algorithm to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Site Selection is Broken
&lt;/h2&gt;

&lt;p&gt;Most small business owners pick locations based on gut feeling, a broker's pitch, or "it felt right when I drove by." The data exists to make better decisions, but it's scattered across dozens of sources and there's no standardized way to score it.&lt;/p&gt;

&lt;p&gt;Enterprise players use tools like Placer.ai ($500+/mo) or hire consultants ($5K+ per report). Small operators get nothing.&lt;/p&gt;

&lt;p&gt;I wanted something that could score any address on a standardized scale — like a credit score, but for business locations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10-Factor Algorithm
&lt;/h2&gt;

&lt;p&gt;After analyzing what actually correlates with business success at physical locations, I landed on 10 dimensions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;What It Measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Traffic Volume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;Daily vehicle/foot count from DOT + Google Popular Times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Demographics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;Median income, population density, age distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Competition Density&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;Same-category businesses within radius&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;Road type, intersection quality, public transit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Visibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;Frontage, signage potential, setback distance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Parking &amp;amp; Layout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;Lot size, spaces per sqft, flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Anchor Proximity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;Distance to Walmart, Target, major chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Growth Trajectory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;5-year population trend, permit activity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Market Saturation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;td&gt;Revenue-per-capita vs. business count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Risk Factors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;td&gt;Crime rate, flood zone, vacancy rate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total: 100% weighted score.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grading System
&lt;/h2&gt;

&lt;p&gt;Raw scores get mapped to letter grades using distribution-based thresholds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateGrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;percentile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getPercentileRank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;population&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;percentile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Not Rated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;percentile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;That Ain't It&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;percentile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Good but not Great&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;percentile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pull the Trigger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;percentile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A+&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unicorn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AAA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Great White Buffalo&lt;/span&gt;&lt;span class="dl"&gt;'&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 labels are intentionally blunt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C = "That Ain't It"&lt;/strong&gt; — meets minimum criteria but has significant drawbacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B = "Good but not Great"&lt;/strong&gt; — solid fundamentals, notable limitations
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A = "Pull the Trigger"&lt;/strong&gt; — strong across all dimensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A+ = "Unicorn"&lt;/strong&gt; — exceptional, rare find&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AAA = "Great White Buffalo"&lt;/strong&gt; — statistical anomaly, once in a lifetime&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Self-Improving Thresholds
&lt;/h2&gt;

&lt;p&gt;Here's the part I'm most proud of. The algorithm never stops learning.&lt;/p&gt;

&lt;p&gt;Every scored location feeds back into the dataset. As more locations get analyzed, the averages recalibrate, thresholds shift, and grades become more accurate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;recalibrateThresholds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allScores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SCORES_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;allScores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="c1"&gt;// Recalculate population statistics&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculateDistribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Update grade boundaries based on actual distribution&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;THRESHOLDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;current&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;updated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;sample_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stddev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stddev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;percentiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;percentiles&lt;/span&gt;&lt;span class="p"&gt;,&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;With 10 scored locations, the grades are rough estimates. With 1,000, they're statistically meaningful. With 10,000, they're approaching ground truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Sources (All Free or Cheap)
&lt;/h2&gt;

&lt;p&gt;One design constraint: keep data costs near zero.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US Census API&lt;/td&gt;
&lt;td&gt;Demographics, income, population&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Places API&lt;/td&gt;
&lt;td&gt;Competitor count, ratings, categories&lt;/td&gt;
&lt;td&gt;$0.032/call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps Platform&lt;/td&gt;
&lt;td&gt;Geocoding, distance matrix&lt;/td&gt;
&lt;td&gt;Free tier generous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOT Traffic Data&lt;/td&gt;
&lt;td&gt;AADT counts by road segment&lt;/td&gt;
&lt;td&gt;Free (public data)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FEMA Flood Maps&lt;/td&gt;
&lt;td&gt;Flood zone classification&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FBI UCR&lt;/td&gt;
&lt;td&gt;Crime statistics by area&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Building Permits API&lt;/td&gt;
&lt;td&gt;Construction/growth activity&lt;/td&gt;
&lt;td&gt;Free (varies by county)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total cost per location analysis: roughly &lt;strong&gt;$0.15 - $0.30&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Compare that to $500+/mo for Placer.ai or $5K for a consultant report.&lt;/p&gt;

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

&lt;p&gt;The whole thing runs on Cloudflare Workers (serverless, $0/mo hosting):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User enters address
  → Geocode via Google Maps
  → Fan out to 10 data sources in parallel
  → Normalize each factor to 0-100
  → Apply weights
  → Calculate composite score
  → Map to letter grade
  → Store result (feeds back into thresholds)
  → Return report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Processing time: ~3 seconds per address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Matters
&lt;/h2&gt;

&lt;p&gt;A raw score isn't enough. The algorithm factors in context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time of year&lt;/strong&gt;: Seasonal businesses score differently in summer vs. winter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market conditions&lt;/strong&gt;: Vacancy rates shift what "good" looks like&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location-specific factors&lt;/strong&gt;: A gas station at a highway exit is evaluated differently than one in a residential neighborhood&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competition quality&lt;/strong&gt;: 5 competitors with 2-star reviews is different from 5 with 4.8-star reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real Example
&lt;/h2&gt;

&lt;p&gt;I ran the algorithm on a gas station I was evaluating in suburban Minnesota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traffic Volume:    82/100 (28,000 AADT on adjacent road)
Demographics:      74/100 (median income $78K, growing area)
Competition:       61/100 (4 stations within 2 miles)
Accessibility:     88/100 (signalized intersection, easy in/out)
Visibility:        79/100 (corner lot, good frontage)
Parking:           70/100 (adequate but tight)
Anchor Proximity:  85/100 (Walmart 0.3 mi, Target 0.8 mi)
Growth Trajectory: 77/100 (12% population growth in 5yr)
Market Saturation: 58/100 (slightly oversaturated)
Risk Factors:      81/100 (low crime, no flood zone)

Composite Score: 75.4
Grade: A — "Pull the Trigger"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I bought it. It's been profitable since month one.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Weighted scoring beats gut feeling every time.&lt;/strong&gt; Even rough data, systematically analyzed, outperforms intuition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The grade scale matters more than the score.&lt;/strong&gt; Nobody remembers "75.4" but everyone remembers "A — Pull the Trigger."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-improving algorithms are worth the extra complexity.&lt;/strong&gt; The recalibration loop is the difference between a static spreadsheet and a living system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free data is surprisingly good.&lt;/strong&gt; Census, DOT, FEMA — there's more free public data than most people realize.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;I packaged this into a tool called &lt;a href="https://jrdconnect.com" rel="noopener noreferrer"&gt;SiteSweep&lt;/a&gt; — $79 one-time purchase, no subscription. Enter an address, get a full 10-factor report with a letter grade in seconds.&lt;/p&gt;

&lt;p&gt;It's built for small business owners, franchise operators, and commercial real estate investors who want data-driven site selection without enterprise pricing.&lt;/p&gt;

&lt;p&gt;The whole stack runs on Cloudflare Workers with zero hosting costs. Deep dive on the architecture: &lt;a href="https://jrdconnect.com/blog/zero-cost-saas.html" rel="noopener noreferrer"&gt;How We Run SaaS With Zero Hosting Costs&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What factors would you add to the scoring algorithm? I'm always looking to improve the model. Drop your thoughts in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>showdev</category>
      <category>startup</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a $99 Mitchell1 Alternative That Auto Shop Owners Actually Want</title>
      <dc:creator>Jay Durango</dc:creator>
      <pubDate>Sun, 08 Mar 2026 06:15:52 +0000</pubDate>
      <link>https://dev.to/jaydurangodev/i-built-a-99-mitchell1-alternative-that-auto-shop-owners-actually-want-11bi</link>
      <guid>https://dev.to/jaydurangodev/i-built-a-99-mitchell1-alternative-that-auto-shop-owners-actually-want-11bi</guid>
      <description>&lt;p&gt;Auto shop owners are getting ripped off by software subscriptions. Mitchell1 ProDemand charges $300+/month. Tekmetric wants $200+/month. RepairShopr takes $60+/month. For what? Work orders, a CRM, and parts tracking.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;JRD Garage&lt;/strong&gt; — a complete auto shop management system for &lt;strong&gt;$99 one-time&lt;/strong&gt;. No monthly fees. No per-user charges. No surprise price increases.&lt;/p&gt;

&lt;p&gt;Here's how it stacks up.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Subscription Trap
&lt;/h2&gt;

&lt;p&gt;If you run an independent auto repair shop, your software costs look something like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Software&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;th&gt;Annual Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mitchell1 ProDemand&lt;/td&gt;
&lt;td&gt;$300+&lt;/td&gt;
&lt;td&gt;$3,600+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tekmetric&lt;/td&gt;
&lt;td&gt;$200+&lt;/td&gt;
&lt;td&gt;$2,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RepairShopr&lt;/td&gt;
&lt;td&gt;$60+&lt;/td&gt;
&lt;td&gt;$720+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ShopBoss&lt;/td&gt;
&lt;td&gt;$200+&lt;/td&gt;
&lt;td&gt;$2,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's $720-$3,600/year just to manage work orders and customer info. For a small independent shop doing $30-50K/month in revenue, that's a significant line item.&lt;/p&gt;

&lt;p&gt;And here's the kicker: &lt;strong&gt;you never own anything&lt;/strong&gt;. Miss a payment? Your data is held hostage. They raise prices? You eat it or migrate.&lt;/p&gt;




&lt;h2&gt;
  
  
  What JRD Garage Does
&lt;/h2&gt;

&lt;p&gt;Everything a small-to-mid shop needs, nothing it doesn't:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work Orders&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create, track, and close repair orders&lt;/li&gt;
&lt;li&gt;Labor + parts line items with automatic totaling&lt;/li&gt;
&lt;li&gt;Print-ready invoices&lt;/li&gt;
&lt;li&gt;Status tracking (pending &amp;gt; in progress &amp;gt; complete &amp;gt; invoiced)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Customer CRM&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full customer database with vehicle history&lt;/li&gt;
&lt;li&gt;Service reminders and follow-up tracking&lt;/li&gt;
&lt;li&gt;Notes and communication log per customer&lt;/li&gt;
&lt;li&gt;Search by name, phone, plate, or VIN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Parts Tracking&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inventory management with cost/markup&lt;/li&gt;
&lt;li&gt;Vendor tracking&lt;/li&gt;
&lt;li&gt;Low-stock alerts&lt;/li&gt;
&lt;li&gt;Parts-to-work-order linking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AI Call Scripts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pre-built scripts for common customer calls&lt;/li&gt;
&lt;li&gt;Estimate follow-ups, service reminders, upsell prompts&lt;/li&gt;
&lt;li&gt;Customizable per shop&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Architecture (For the Nerds)
&lt;/h2&gt;

&lt;p&gt;JRD Garage runs on &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; — serverless JavaScript at the edge. Here's why that matters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (any browser) → Cloudflare Workers (serverless) → KV/D1 (storage)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero hosting costs&lt;/strong&gt;: Cloudflare's free tier handles 100K requests/day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global edge deployment&lt;/strong&gt;: Your shop management loads fast from anywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No server maintenance&lt;/strong&gt;: No updates, no patches, no "server is down" calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scales to zero&lt;/strong&gt;: When you're not using it, you're not paying for it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend is vanilla HTML/CSS/JS — no React, no build step, no npm install nightmare. It just works. On any device. Any browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Work order creation — it's really this simple&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/work-orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SHOP_DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INSERT INTO work_orders (id, customer_id, vehicle, status, created_at, items) VALUES (?, ?, ?, ?, ?, ?)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vehicle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&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;No Express. No middleware chain. No ORM. Just a Worker that handles requests and talks to D1 (Cloudflare's SQLite-at-the-edge database).&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Mitchell1 ($300+/mo)&lt;/th&gt;
&lt;th&gt;JRD Garage ($99 once)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Work Orders&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer CRM&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parts Tracking&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoicing&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-device&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (web-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Features&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (call scripts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting Cost&lt;/td&gt;
&lt;td&gt;Included (you pay)&lt;/td&gt;
&lt;td&gt;$0 (serverless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Ownership&lt;/td&gt;
&lt;td&gt;Their servers&lt;/td&gt;
&lt;td&gt;Your instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price After Year 1&lt;/td&gt;
&lt;td&gt;$3,600+&lt;/td&gt;
&lt;td&gt;$99 (still)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price After Year 3&lt;/td&gt;
&lt;td&gt;$10,800+&lt;/td&gt;
&lt;td&gt;$99 (still)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After 3 years with Mitchell1, you've spent &lt;strong&gt;$10,800+&lt;/strong&gt; and own nothing.&lt;/p&gt;

&lt;p&gt;After 3 years with JRD Garage, you've spent &lt;strong&gt;$99&lt;/strong&gt; and own the software forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who It's For
&lt;/h2&gt;

&lt;p&gt;JRD Garage is built for &lt;strong&gt;independent shops doing 5-30 cars/day&lt;/strong&gt;. If you're a 1-3 bay operation, a mobile mechanic, or a specialty shop (transmission, diesel, performance), this is your sweet spot.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Multi-location dealership service departments (use CDK or Reynolds)&lt;/li&gt;
&lt;li&gt;Shops that need integrated parts ordering from specific distributors&lt;/li&gt;
&lt;li&gt;Shops that require insurance/warranty claim processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For everyone else? $99 beats $300/month every single time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;JRD Garage is available now at &lt;a href="https://jrdconnect.com/checkout.html?product=jrd-garage" rel="noopener noreferrer"&gt;jrdconnect.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;$99 one-time. No account required to browse. No credit card to "try free." Just pay once and it's yours.&lt;/p&gt;

&lt;p&gt;If you're tired of renting your shop software, come check it out.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Jay — I build one-time purchase software tools. No subscriptions, no monthly fees, no BS. Check out more at &lt;a href="https://jrdconnect.com" rel="noopener noreferrer"&gt;jrdconnect.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>startup</category>
      <category>saas</category>
    </item>
    <item>
      <title>I Built an AI That Reads Your Screen and Auto-Fills Forms — Here's How</title>
      <dc:creator>Jay Durango</dc:creator>
      <pubDate>Sun, 08 Mar 2026 06:05:04 +0000</pubDate>
      <link>https://dev.to/jaydurangodev/i-built-an-ai-that-reads-your-screen-and-auto-fills-forms-heres-how-1dd0</link>
      <guid>https://dev.to/jaydurangodev/i-built-an-ai-that-reads-your-screen-and-auto-fills-forms-heres-how-1dd0</guid>
      <description>&lt;p&gt;Every day, millions of knowledge workers do the same thing: look at data on one screen, then manually type it into another application. Invoice numbers, tracking codes, customer details, form fields — copied by hand, one keystroke at a time.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built &lt;strong&gt;Scan0tron&lt;/strong&gt; — a desktop AI that literally &lt;em&gt;sees&lt;/em&gt; your screen and auto-fills forms for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;We have AI that writes essays, generates images, and passes the bar exam. But somehow we're still &lt;em&gt;manually copying data between windows&lt;/em&gt; like it's 1998.&lt;/p&gt;

&lt;p&gt;Think about how much time you spend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading an invoice PDF → typing values into accounting software&lt;/li&gt;
&lt;li&gt;Copying tracking numbers from email → pasting into shipping portals&lt;/li&gt;
&lt;li&gt;Transcribing handwritten notes → entering into a CRM&lt;/li&gt;
&lt;li&gt;Reading one spreadsheet → filling out fields in another app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't "work." It's human OCR. And it's a massive productivity drain.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Scan0tron Works
&lt;/h2&gt;

&lt;p&gt;The concept is deceptively simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; — Select any window or region on your screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze&lt;/strong&gt; — AI vision model processes the captured content, understanding context (not just characters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-fill&lt;/strong&gt; — Extracted data populates into your target form fields automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key difference from traditional OCR tools: Scan0tron doesn't just &lt;em&gt;read text&lt;/em&gt;. It &lt;strong&gt;understands context&lt;/strong&gt;. It knows that "INV-2024-0847" is an invoice number, that "$4,299.00" is a total, and that "Net 30" is payment terms. It maps fields intelligently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐     ┌──────────────┐     ┌─────────────────┐
│  Screen Capture  │ ──→ │  AI Analysis  │ ──→ │  Auto-Fill Form │
│  (any window)    │     │  (contextual) │     │  (your target)  │
└─────────────────┘     └──────────────┘     └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Numbers: 50 Tasks Timed
&lt;/h2&gt;

&lt;p&gt;I ran a benchmark: 50 common data entry tasks, comparing manual keyboard entry vs. Scan0tron.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Manual&lt;/th&gt;
&lt;th&gt;Scan0tron&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Avg time per task&lt;/td&gt;
&lt;td&gt;3.2 min&lt;/td&gt;
&lt;td&gt;12 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error rate&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;td&gt;0.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tasks/hour&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;180+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time savings&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The accuracy improvement surprised me most. Humans make typos. AI vision doesn't fat-finger the keyboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Just Use ChatGPT?
&lt;/h2&gt;

&lt;p&gt;ChatGPT can't see your screen. Neither can Gemini, Claude, or any cloud AI. They work with text you &lt;em&gt;give&lt;/em&gt; them — they can't observe your desktop, read your open applications, or interact with your forms.&lt;/p&gt;

&lt;p&gt;Scan0tron runs locally on your machine. It has direct access to your screen content. No copy-pasting into a chat window. No describing what you're looking at. Just capture → fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture (For the Nerds)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Electron&lt;/strong&gt; desktop app (cross-platform: Windows, Mac, Linux)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer vision&lt;/strong&gt; pipeline for screen region capture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI inference&lt;/strong&gt; for contextual understanding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form mapping&lt;/strong&gt; engine that matches extracted fields to target inputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cloud dependency&lt;/strong&gt; — works offline, your data never leaves your machine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing That Doesn't Suck
&lt;/h2&gt;

&lt;p&gt;This is where I get opinionated. Most AI tools charge $20-50/month. That's $240-600/year for what is essentially a utility.&lt;/p&gt;

&lt;p&gt;Scan0tron is &lt;strong&gt;$49. Once. Forever.&lt;/strong&gt; No subscription. No "free tier" that cripples functionality. No usage caps.&lt;/p&gt;

&lt;p&gt;I wrote about &lt;a href="https://jrdconnect.com/blog/why-no-subscriptions.html" rel="noopener noreferrer"&gt;why we don't charge monthly fees&lt;/a&gt; if you're curious about the business model. TL;DR: Cloudflare Workers + Electron = $0/month hosting costs, so we don't need recurring revenue to stay alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you spend more than 30 minutes a day on manual data entry, Scan0tron pays for itself on day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jrdconnect.com/checkout.html?product=scan0tron" rel="noopener noreferrer"&gt;Get Scan0tron — $49 one-time&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built by &lt;a href="https://jrdconnect.com" rel="noopener noreferrer"&gt;Jay Durango&lt;/a&gt; — I build one-time purchase software tools that replace overpriced subscriptions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your most tedious data entry task? I'm curious what workflows people would automate first. Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>How I Run 3 SaaS Products on $0/Month Hosting (Cloudflare Workers Architecture)</title>
      <dc:creator>Jay Durango</dc:creator>
      <pubDate>Sun, 08 Mar 2026 06:01:14 +0000</pubDate>
      <link>https://dev.to/jaydurangodev/how-i-run-3-saas-products-on-0month-hosting-cloudflare-workers-architecture-3j12</link>
      <guid>https://dev.to/jaydurangodev/how-i-run-3-saas-products-on-0month-hosting-cloudflare-workers-architecture-3j12</guid>
      <description>&lt;p&gt;Everyone tells you SaaS needs servers. Monthly bills. DevOps. Infrastructure.&lt;/p&gt;

&lt;p&gt;I run 3 commercial products — and my hosting bill is &lt;strong&gt;$0/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's exactly how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Static HTML/CSS/JS on Cloudflare Pages (free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Cloudflare Workers (100K requests/day free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Workers KV + D1 (free tier covers everything)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: CardPointe (no monthly fee, just per-transaction)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: MailChannels via Workers (free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CDN/SSL&lt;/strong&gt;: Cloudflare (obviously free)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Products
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scan0tron&lt;/strong&gt; ($49) — AI screen capture + auto-fill. Desktop app (Electron) talks to a Worker API for license validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JRD Garage&lt;/strong&gt; ($99) — Auto shop management. Full work orders, CRM, parts tracking. All serverless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SiteSweep&lt;/strong&gt; ($79) — Location intelligence. 10-factor scoring algorithm rates business sites C through AAA.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All one-time purchase. No subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Works
&lt;/h2&gt;

&lt;p&gt;Cloudflare Workers run at the edge in 300+ cities. Cold start is ~0ms (not Lambda's 500ms+). The free tier gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100,000 requests/day&lt;/li&gt;
&lt;li&gt;10ms CPU time per request&lt;/li&gt;
&lt;li&gt;Workers KV: 100K reads/day, 1K writes/day&lt;/li&gt;
&lt;li&gt;D1: 5M rows read, 100K rows written/day&lt;/li&gt;
&lt;li&gt;Pages: Unlimited bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For context, 100K requests/day supports roughly &lt;strong&gt;5,000-10,000 daily active users&lt;/strong&gt;. That's enough to run a real business before you ever pay a cent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Math vs AWS
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;AWS Cost&lt;/th&gt;
&lt;th&gt;Cloudflare Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;$20-50/mo (Lambda)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;$15-30/mo (RDS)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;$5-10/mo (S3)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN&lt;/td&gt;
&lt;td&gt;$10-20/mo (CloudFront)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL&lt;/td&gt;
&lt;td&gt;Free (ACM)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$50-110/mo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you sell one-time-purchase software, every dollar of margin matters. Zero hosting means the first sale is pure profit.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User → Cloudflare Pages (static frontend)
     → Cloudflare Worker (API/logic)
     → Workers KV (key-value state)
     → D1 (relational queries)
     → CardPointe (payment processing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Docker. No Kubernetes. No EC2 instances to patch. No RDS backups to manage. No load balancers. No auto-scaling configs.&lt;/p&gt;

&lt;p&gt;It just works. At the edge. For free.&lt;/p&gt;

&lt;h2&gt;
  
  
  When You Outgrow Free
&lt;/h2&gt;

&lt;p&gt;At $5/month (Workers Paid), you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10M requests/month&lt;/li&gt;
&lt;li&gt;30ms CPU time&lt;/li&gt;
&lt;li&gt;Expanded KV and D1 limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That supports &lt;strong&gt;15,000-20,000 DAU&lt;/strong&gt;. Most indie products never get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The One-Time Purchase Model
&lt;/h2&gt;

&lt;p&gt;Monthly SaaS pricing exists because of monthly infrastructure costs. Remove the infrastructure costs, and suddenly one-time pricing makes sense.&lt;/p&gt;

&lt;p&gt;$49 once → customer happy, margin preserved, zero churn to worry about.&lt;/p&gt;

&lt;p&gt;I wrote a deeper technical breakdown here: &lt;a href="https://jrdconnect.com/blog/zero-cost-saas.html" rel="noopener noreferrer"&gt;The Zero-Cost SaaS Architecture&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building these at &lt;a href="https://jrdconnect.com" rel="noopener noreferrer"&gt;jrdconnect.com&lt;/a&gt;. Happy to answer questions about the architecture.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>serverless</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
