<?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: OMW Locksmith LLC</title>
    <description>The latest articles on DEV Community by OMW Locksmith LLC (@omwlocksmith).</description>
    <link>https://dev.to/omwlocksmith</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%2F4229131%2F770ba02f-61c8-468e-ae8a-5f0501d9a572.png</url>
      <title>DEV Community: OMW Locksmith LLC</title>
      <link>https://dev.to/omwlocksmith</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omwlocksmith"/>
    <language>en</language>
    <item>
      <title>Building a static site for a locksmith in Columbia, MO: LocalBusiness schema, click-to-call and a blog with no CMS</title>
      <dc:creator>OMW Locksmith LLC</dc:creator>
      <pubDate>Thu, 05 Nov 2026 20:19:01 +0000</pubDate>
      <link>https://dev.to/omwlocksmith/building-a-static-site-for-a-locksmith-in-columbia-mo-localbusiness-schema-click-to-call-and-a-gog</link>
      <guid>https://dev.to/omwlocksmith/building-a-static-site-for-a-locksmith-in-columbia-mo-localbusiness-schema-click-to-call-and-a-gog</guid>
      <description>&lt;p&gt;Most tutorials about "local business websites" assume a CMS, a theme and a dozen plugins. We went the other way for a small locksmith shop in Columbia, Missouri, and the result has been easier to maintain than anything with a database behind it. Here is what we built for &lt;a href="https://omwlocksmith.com/" rel="noopener noreferrer"&gt;OMW Locksmith LLC&lt;/a&gt; and the three decisions that mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Plain HTML pages, uploaded over the host's API
&lt;/h2&gt;

&lt;p&gt;The whole site is static HTML and CSS on shared hosting. No build step, no npm, no admin panel to patch. New pages (including blog posts) are written as a single &lt;code&gt;index.html&lt;/code&gt; inside a folder such as &lt;code&gt;/blog/&amp;lt;slug&amp;gt;/&lt;/code&gt; and pushed with the hosting provider's file API. A deploy is one HTTP request; a rollback is re-uploading the previous file.&lt;/p&gt;

&lt;p&gt;Why it matters for a service business: the phone rings when the page loads fast on a cracked phone screen at 11 pm in a parking lot. A 7 KB HTML file with no render-blocking scripts does that reliably. Lighthouse mobile scores stay in the high 90s without any tuning.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. One &lt;code&gt;LocalBusiness&lt;/code&gt; JSON-LD block, and the same data everywhere
&lt;/h2&gt;

&lt;p&gt;The home page carries a single JSON-LD block of type &lt;code&gt;Locksmith&lt;/code&gt; (a subtype of &lt;code&gt;LocalBusiness&lt;/code&gt;) with the business name, street address, phone number, service area and opening hours:&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;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Locksmith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OMW Locksmith LLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"telephone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1 (636) 201-1375"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&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;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PostalAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streetAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2210 Whitegate Dr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressLocality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Columbia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"addressRegion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"65202"&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;span class="nl"&gt;"areaServed"&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;"Columbia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ashland"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fulton"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Moberly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kingdom City"&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;The rule we enforce in code review: the name, address and phone in the JSON-LD must be byte-for-byte identical to the ones in the footer, the contact page and every directory listing. Search engines reconcile a business across the web by matching those three fields, and a stray "Suite 2" or a second phone format quietly splits the entity in two. Keeping the NAP in one place and copying it verbatim is boring, and it is the single highest-leverage SEO decision on a site like this.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Click-to-call as the primary action
&lt;/h2&gt;

&lt;p&gt;Every page has one obvious action: &lt;code&gt;&amp;lt;a href="tel:+16362011375"&amp;gt;&lt;/code&gt;. Not a contact form, not a chat widget. For emergency trades (lockouts, lost car keys) the conversion is a phone call, so the button sits in the header, in the hero and at the end of every article, and it is large enough to hit with a thumb. We track it with a single &lt;code&gt;click&lt;/code&gt; listener that fires an analytics event; nothing else runs on the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The blog without a CMS
&lt;/h2&gt;

&lt;p&gt;Articles are written in Markdown, converted once to HTML with a tiny script, wrapped in the site's layout and uploaded as &lt;code&gt;/blog/&amp;lt;slug&amp;gt;/index.html&lt;/code&gt;. There is no comment system and no admin login to brute-force. The first post explains what drives the price of a locksmith call in mid-Missouri; you can see the output of the pipeline here: &lt;a href="https://omwlocksmith.com/blog/what-locksmith-work-costs-columbia-mo/" rel="noopener noreferrer"&gt;what locksmith work actually costs in Columbia, MO&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we would tell another developer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Static is enough for the vast majority of service businesses. Reach for a CMS only when a non-technical person has to edit weekly.&lt;/li&gt;
&lt;li&gt;Put the NAP in one source file and generate every page from it. Consistency beats cleverness.&lt;/li&gt;
&lt;li&gt;Measure on a real mid-range phone over cellular, not on your laptop over fiber.&lt;/li&gt;
&lt;li&gt;Ship the &lt;code&gt;tel:&lt;/code&gt; link first; everything else is secondary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have built something similar, I would like to hear what you used for the HTML pipeline and whether you kept it static as the site grew.&lt;/p&gt;

</description>
      <category>beginners</category>
    </item>
  </channel>
</rss>
