<?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: Justin Crow</title>
    <description>The latest articles on DEV Community by Justin Crow (@justincrowcre).</description>
    <link>https://dev.to/justincrowcre</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%2F4056884%2F3bd527b2-b07b-44de-b3fb-884a1cead67a.png</url>
      <title>DEV Community: Justin Crow</title>
      <link>https://dev.to/justincrowcre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justincrowcre"/>
    <language>en</language>
    <item>
      <title>I turned 100k county property records into a free "instant comps" tool</title>
      <dc:creator>Justin Crow</dc:creator>
      <pubDate>Fri, 31 Jul 2026 15:57:56 +0000</pubDate>
      <link>https://dev.to/justincrowcre/i-turned-100k-county-property-records-into-a-free-instant-comps-tool-484d</link>
      <guid>https://dev.to/justincrowcre/i-turned-100k-county-property-records-into-a-free-instant-comps-tool-484d</guid>
      <description>&lt;p&gt;Commercial real estate has a data problem for the little guy: the good comps live behind CoStar/LoopNet paywalls, while the &lt;em&gt;raw&lt;/em&gt; data — county property-appraiser rolls and recorded deeds — is public but unusable in its raw form. I wanted a free tool that hands a normal person recent comparable sales for any South Florida commercial property in one click. Here’s the build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The data.&lt;/strong&gt; I assembled ~100k tri-county commercial parcels (Broward, Miami-Dade, Palm Beach) with recorded, arms-length sales into a single Postgres table: address, city, county, building SF, sale price, sale date, use type, year built, and coordinates. The messy part wasn’t volume — it was normalization: inconsistent city labels, non-arms-length transfers, and land-only sales polluting the per-SF math.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The API.&lt;/strong&gt; A single read-only serverless function takes a county, optional city, and optional asset type, and returns the most recent qualifying sales plus a median $/SF. The query filters to building-improved, arms-length sales above a price floor and within a recent window, ordered by date. Public, no auth, CORS-open — it only ever reads, and only returns already-public sale records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The front end.&lt;/strong&gt; Static HTML/JS on Netlify, with an edge function proxying the tool routes. A small widget renders the returned comps as a table with a checkbox per row — because &lt;em&gt;every comp isn’t equal&lt;/em&gt;. The user unchecks the ones that aren’t comparable, and the median recalculates live. That "curate the set" interaction is the whole point: a median over 25 random sales is noise; a median over the six you actually believe in is a value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons.&lt;/strong&gt; (1) Public data is 10% acquisition, 90% normalization. (2) Let users prune inputs — a transparent, editable median beats a black-box "estimate." (3) A read-only public endpoint over already-public data keeps the security surface tiny.&lt;/p&gt;

&lt;p&gt;If you want to poke at the result, it’s live and free: &lt;a href="https://justincrowcre.com/bov/" rel="noopener noreferrer"&gt;Broker Opinion of Value tool&lt;/a&gt;. Happy to answer build questions in the comments.&lt;/p&gt;

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