<?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: Robby D</title>
    <description>The latest articles on DEV Community by Robby D (@robbydslilgreens).</description>
    <link>https://dev.to/robbydslilgreens</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%2F4137849%2Ff1c33328-67b6-47c2-83c1-b1b16873d5ed.png</url>
      <title>DEV Community: Robby D</title>
      <link>https://dev.to/robbydslilgreens</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robbydslilgreens"/>
    <language>en</language>
    <item>
      <title>26 of 45 shops had no way to reach them. Here's the script I added</title>
      <dc:creator>Robby D</dc:creator>
      <pubDate>Sat, 26 Sep 2026 14:44:00 +0000</pubDate>
      <link>https://dev.to/robbydslilgreens/26-of-45-shops-had-no-way-to-reach-them-heres-the-script-i-added-17m2</link>
      <guid>https://dev.to/robbydslilgreens/26-of-45-shops-had-no-way-to-reach-them-heres-the-script-i-added-17m2</guid>
      <description>&lt;p&gt;A few days ago I published a small tool that pulls independent cafes, juice bars, health-food shops and delis out of OpenStreetMap. In the sample run for Asheville, NC it found 45 shops. A reader pointed out that the phone column probably matters most for indie shops, and later that someone still has to look up the actual buyer before a scraped list is any use to anyone. Both fair points, so I counted.&lt;/p&gt;

&lt;p&gt;Of the 45 shops:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 list an email&lt;/li&gt;
&lt;li&gt;12 list a website but no email&lt;/li&gt;
&lt;li&gt;5 list only a phone number&lt;/li&gt;
&lt;li&gt;26 list nothing at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is 19 you can reach somehow and 26 you can't, from this data alone. So I added a second script to the repo, &lt;a href="https://github.com/robbydslilgreens-bit/indie-door-finder" rel="noopener noreferrer"&gt;&lt;code&gt;contact_routes.py&lt;/code&gt;&lt;/a&gt;, that does the sorting for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;python door_finder.py --city "Asheville, NC" --radius-mi 10 --out doors.csv
python contact_routes.py doors.csv --out doors-routes.csv
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It adds a &lt;code&gt;contact_route&lt;/code&gt; column (&lt;code&gt;email&lt;/code&gt;, &lt;code&gt;website&lt;/code&gt;, &lt;code&gt;phone-only&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;) and, for the shops with an email, an &lt;code&gt;email_domain_mx&lt;/code&gt; column. That one asks Cloudflare's public DNS-over-HTTPS endpoint whether the domain accepts mail at all. One lookup per distinct domain, no API key, standard library only.&lt;/p&gt;

&lt;p&gt;The MX check is deliberately small. It catches dead domains and typos. It says nothing about whether the mailbox exists or whether a human reads it, so I still run a proper verifier before sending anything. A domain that accepts mail can still bounce every address you throw at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we do with each bucket
&lt;/h2&gt;

&lt;p&gt;This is the manual part, and it's the part no script does for you. It's what we do for our own beverage brand's outreach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email or website listed:&lt;/strong&gt; open the site. The About page, the shop's Instagram or a local news write-up usually names the owner. Thirty seconds of looking beats writing to &lt;code&gt;info@&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone-only:&lt;/strong&gt; call or walk in. At a small shop the person who picks up may well be the owner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing listed:&lt;/strong&gt; search the shop's name plus the town. If that turns up nothing either, skip it and move on. It is not worth an hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point of the sorting is to spend your limited outreach time on the shops you can actually reach. It also stops you from sending a message to an address you never verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenStreetMap is volunteer-entered, so the 26 "nothing listed" shops may have a phone and a website that nobody added yet. The numbers describe the map data, not the shops.&lt;/li&gt;
&lt;li&gt;This is one city. I wouldn't read the ratios as typical anywhere else. Run it on yours.&lt;/li&gt;
&lt;li&gt;It finds shops and sorts contact routes. It does not find buyers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo (MIT, no dependencies): &lt;a href="https://github.com/robbydslilgreens-bit/indie-door-finder" rel="noopener noreferrer"&gt;https://github.com/robbydslilgreens-bit/indie-door-finder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want the rest of the method we use (finding the buyer, what to say, following up after a sample), there's a &lt;a href="https://robbydslilgreens.com/answers/tools-for-getting-into-indie-retail-stores?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=contact-routes-devto" rel="noopener noreferrer"&gt;free tracker and guides&lt;/a&gt; or a &lt;a href="https://shop.robbydslilgreens.com/products/the-indie-retail-playbook-get-your-food-or-drink-into-independent-stores?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=contact-routes-devto" rel="noopener noreferrer"&gt;$19 written playbook&lt;/a&gt;. The scripts work fine without either.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I run this brand's marketing through an AI agent that researches, writes, and (within set guardrails) publishes on my behalf. This post was drafted by that process and checked against our own numbers before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>opensource</category>
      <category>smallbusiness</category>
    </item>
    <item>
      <title>I open-sourced the OpenStreetMap step of our own retail-prospecting tool</title>
      <dc:creator>Robby D</dc:creator>
      <pubDate>Tue, 22 Sep 2026 14:55:41 +0000</pubDate>
      <link>https://dev.to/robbydslilgreens/i-open-sourced-the-openstreetmap-step-of-our-own-retail-prospecting-tool-ab</link>
      <guid>https://dev.to/robbydslilgreens/i-open-sourced-the-openstreetmap-step-of-our-own-retail-prospecting-tool-ab</guid>
      <description>&lt;p&gt;We make a small-batch beverage (Robby Ds Lil Greens, in Virginia's Shenandoah Valley) and sell it through independent stores — cafes, juice bars, health-food shops, delis. Before you can pitch anyone, you need a list of who's actually nearby, and most of that list is small local shops that never show up in a "top retailers" search.&lt;/p&gt;

&lt;p&gt;We'd already built a script for our own prospecting that pulls candidates from OpenStreetMap (Nominatim to geocode a place, one Overpass query to find nearby independent-looking shops). This week I stripped it down to a standalone, dependency-free version and published it: &lt;strong&gt;&lt;a href="https://github.com/robbydslilgreens-bit/indie-door-finder" rel="noopener noreferrer"&gt;indie-door-finder&lt;/a&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python door_finder.py &lt;span class="nt"&gt;--city&lt;/span&gt; &lt;span class="s2"&gt;"Asheville, NC"&lt;/span&gt; &lt;span class="nt"&gt;--radius-mi&lt;/span&gt; 10 &lt;span class="nt"&gt;--out&lt;/span&gt; doors.csv
python door_finder.py &lt;span class="nt"&gt;--lat&lt;/span&gt; 35.5951 &lt;span class="nt"&gt;--lon&lt;/span&gt; &lt;span class="nt"&gt;-82&lt;/span&gt;.5515 &lt;span class="nt"&gt;--radius-mi&lt;/span&gt; 15 &lt;span class="nt"&gt;--out&lt;/span&gt; doors.csv
python door_finder.py &lt;span class="nt"&gt;--city&lt;/span&gt; &lt;span class="s2"&gt;"Front Royal, VA"&lt;/span&gt; &lt;span class="nt"&gt;--radius-mi&lt;/span&gt; 25 &lt;span class="nt"&gt;--broad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API keys, no accounts, no third-party packages — just the Python standard library plus two free public OSM services. Output is a CSV: name, category, address, phone, website, email (when OSM has one), distance, and a link back to the OSM entry. It filters out anything tagged with a brand/operator and a list of common chain names, so what's left is mostly independent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it's not:&lt;/strong&gt; a verified contact list. A sample run for Asheville, NC (8-mile radius) found 45 independent candidates — only 14 had a website and 2 listed an email. OpenStreetMap coverage is uneven and volunteer-entered, especially for small rural shops. Use the output as a starting list, not a finished one: look at each shop's site or call before you pitch, and verify any email before you send to it. It also finds shops, not buyers — someone still has to walk in or call.&lt;/p&gt;

&lt;p&gt;I built and use this for our own beverage brand's outreach; publishing it standalone in case it saves another maker an afternoon of manually building the same list by hand. MIT licensed, works fine without anything else we sell. If you want the rest of the method (how to find the actual buyer, what to say, following up after a sample), we wrote that up too — &lt;a href="https://robbydslilgreens.com/answers/tools-for-getting-into-indie-retail-stores?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=door-finder-devto" rel="noopener noreferrer"&gt;free tracker + guides&lt;/a&gt; or a &lt;a href="https://shop.robbydslilgreens.com/products/the-indie-retail-playbook-get-your-food-or-drink-into-independent-stores?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=door-finder-devto" rel="noopener noreferrer"&gt;$19 written playbook&lt;/a&gt; if you'd rather have it all in one place.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/robbydslilgreens-bit/indie-door-finder" rel="noopener noreferrer"&gt;https://github.com/robbydslilgreens-bit/indie-door-finder&lt;/a&gt; — issues/PRs welcome, especially chain names I missed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I run this brand's marketing through an AI agent that researches, writes, and (within set guardrails) publishes on my behalf. This post was drafted by that process and reviewed against our own facts before publishing — flagging it here since it's directly relevant to a "here's what I built" post.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>showdev</category>
      <category>smallbusiness</category>
    </item>
  </channel>
</rss>
