<?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: Scott Steinmetz</title>
    <description>The latest articles on DEV Community by Scott Steinmetz (@scott_steinmetz).</description>
    <link>https://dev.to/scott_steinmetz</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%2F4050394%2F611c58d9-5498-4ab0-a85f-b1e3a2e49097.png</url>
      <title>DEV Community: Scott Steinmetz</title>
      <link>https://dev.to/scott_steinmetz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/scott_steinmetz"/>
    <language>en</language>
    <item>
      <title>The Day My Domain Name Expired and Took Everything Down With It</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Sat, 24 Oct 2026 14:00:02 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/the-day-my-domain-name-expired-and-took-everything-down-with-it-55ca</link>
      <guid>https://dev.to/scott_steinmetz/the-day-my-domain-name-expired-and-took-everything-down-with-it-55ca</guid>
      <description>&lt;p&gt;On August 14th, everything I run stopped working at once. Our family's chore app. The maintenance request system I use at my day job. The scheduling tools, the design studio, the video editor. Every one of them went dark at the same time.&lt;/p&gt;

&lt;p&gt;My first thought was a server crash. The alerts that came in did not help. None of them said "your domain expired." They said things like "health check failed" and "no response," one service at a time, as if a pile of unrelated things had broken on the same day.&lt;/p&gt;

&lt;p&gt;They had not. Every one of those services lived under the same domain name, and the registration on that domain name had lapsed. When a domain expires, the internet simply stops knowing where to find you. Your website, your email, and every app hanging off it all disappear together. From the servers' point of view, nothing was wrong, so none of my server alerts pointed at the real cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;After the outage, I added a domain check to the monitoring system that already inspects my servers every night at 2 AM and emails me one combined report.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A 30-Day Head Start:&lt;/strong&gt; Every night, the system looks up the official expiration date for all eight of my domains. Anything within 30 days of expiring shows up as a warning at the top of the morning report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asks the Official Source:&lt;/strong&gt; Instead of trusting a reseller's dashboard, it asks the organization that actually runs each domain ending, like .com or .us, for the real date on file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Email, Not a Dozen:&lt;/strong&gt; Domain warnings arrive in the same morning report as everything else, so there is no separate inbox to remember to check.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Paying Did Not Fix It Right Away
&lt;/h3&gt;

&lt;p&gt;Here is the part nobody tells you. Once I renewed the domain, everything did not snap back. It took hours for the renewal to spread back out across the internet, and the whole time, anyone trying to reach those services kept hitting error pages. That is why the warning now comes 30 days out. An expired security certificate can be replaced in minutes. An expired domain cannot.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Standard Lookup Tool Did Not Know My Domain Ending
&lt;/h3&gt;

&lt;p&gt;The usual lookup tool for checking domain expiration simply reported "not supported" for the newer ending my main domain uses. That was the one domain that mattered most. I switched to the newer official lookup system that every domain ending is supposed to support, and kept the old method as a backup for the one ending the new system still does not cover.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A False Alarm on the First Test
&lt;/h3&gt;

&lt;p&gt;On the very first test run, two of my domains reported as already expired when they were fine. The date on file included a time of day, and my check was reading the wrong part of the line. It was a small fix, but a good reminder that a warning system that cries wolf gets ignored. I verified all eight domains by hand before trusting it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Month of Warning:&lt;/strong&gt; Any domain nearing expiration now shows up 30 days ahead instead of announcing itself as a full outage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No More Mystery Outages:&lt;/strong&gt; Domain trouble gets its own clearly labeled line in the report instead of hiding behind a pile of unrelated alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works Without Me Remembering:&lt;/strong&gt; The check runs every night on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you own a business domain, take five minutes today. Log in to wherever you bought it, confirm auto-renew is on, make sure the credit card on file has not expired, and check that the contact email is one you actually read. The next step on my end is adding the same 30-day warning for the business owners whose sites I look after, so their domains never surprise them either.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>beginners</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Phone Plan Store That Shows You What You'd Save Before You Click Anything</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:00:02 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/a-phone-plan-store-that-shows-you-what-youd-save-before-you-click-anything-1aj6</link>
      <guid>https://dev.to/scott_steinmetz/a-phone-plan-store-that-shows-you-what-youd-save-before-you-click-anything-1aj6</guid>
      <description>&lt;p&gt;Most people pay too much for their phone plan, and most of them know it. They just do not want to deal with it. Comparing plans feels like homework, and every carrier's website is built to confuse you into the most expensive option.&lt;/p&gt;

&lt;p&gt;I started reselling phone service that runs on the same three major networks most people already use, for noticeably less. The service was good. The website selling it was not. It was running a stock template that showed a generic blog feed as its front page. A visitor had no idea what was for sale, what it cost, or why they should care.&lt;/p&gt;

&lt;p&gt;Store-builder templates I tried had the same weakness. They are great at listing products. They are not built to answer the one question a phone shopper has: "How much would I actually save?" So I rebuilt the storefront around that question.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Savings Slider:&lt;/strong&gt; Right at the top of the page, visitors drag a slider to their current monthly bill, and the page instantly shows what they would pay instead and how much they would keep each year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prices That Never Go Stale:&lt;/strong&gt; Every price on the page is pulled straight from the store's actual product list. Change a price in one place, and the homepage, the calculator, and the checkout all update together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three Networks, One Look:&lt;/strong&gt; The design uses three colored dots, one for each network the service runs on, as a simple visual promise that you keep the coverage you already know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkout Stays Simple:&lt;/strong&gt; The page design never touches the checkout itself, so buying a plan uses the store's well-tested payment flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prices Showing Up as Gibberish
&lt;/h3&gt;

&lt;p&gt;My first attempt at live pricing showed visitors raw bracketed code where the dollar amounts should have been. The homepage layout was built in a way that skipped the step that turns those placeholders into real numbers. I moved the pricing into a different kind of page section that does run that step, and the real prices appeared.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Visitors Seeing Yesterday's Design
&lt;/h3&gt;

&lt;p&gt;To keep the site fast, a security and speed service stores copies of the site's images and styling around the country for a very long time. That is great for speed, but it meant visitors kept seeing the old design after I published the new one. I set up a way to clear just the changed files from those stored copies after every update, so a change goes live for everyone right away without slowing down the rest of the site.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A Growing Catalog Outgrew the Nightly Security Scan
&lt;/h3&gt;

&lt;p&gt;When the phone and accessory catalog grew to nearly 7,800 files almost overnight, my nightly virus scan of the server started running out of time. Worse, it was quietly taking the checks scheduled after it down with it. The catalog was not the problem. The scan schedule was. I first gave the virus scan its own time limit so the other checks always run. Then, when it still could not finish, I changed it to scan any new or changed files every night plus one-seventh of everything else, so every file gets checked at least once a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Answer Comes First:&lt;/strong&gt; Visitors see their own potential savings within seconds of landing, before they read a single plan description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Place to Change Prices:&lt;/strong&gt; Updating a plan price is a single edit. There is no hunting through pages for old numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room for a Bigger Catalog:&lt;/strong&gt; The store now carries a full lineup of phones and accessories alongside the plans, and the server keeps up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step is adding a family-plan version of the savings slider, since households with four or five lines are where the yearly savings get dramatic.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>ecommerce</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Checked 213 Local Business Websites. Here's What Was Quietly Broken.</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Sun, 18 Oct 2026 14:00:02 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/i-checked-213-local-business-websites-heres-what-was-quietly-broken-4hik</link>
      <guid>https://dev.to/scott_steinmetz/i-checked-213-local-business-websites-heres-what-was-quietly-broken-4hik</guid>
      <description>&lt;p&gt;Most business owners never look at their own website. They had it built a few years ago, it went live, and as far as they know, it still works. Customers rarely call to say "your website is broken." They just leave and call the competitor.&lt;/p&gt;

&lt;p&gt;I wanted to know how common that was in my own backyard. So I built a tool that walked through every business I could find from Mt. Vernon down to the Illinois border, seventeen counties in all. It turned up 1,683 businesses. Of those, 213 had websites the tool could check from the outside, the same way a customer would see them.&lt;/p&gt;

&lt;p&gt;I was not hacking anyone or testing for weak spots. The tool simply visited each site like a regular visitor and wrote down what it saw. A lot of what it saw was not good.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Looks Like a Customer:&lt;/strong&gt; The tool loads each homepage, follows the main links, and notes anything a customer would bump into: missing pictures, dead pages, error screens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spots the Leftovers:&lt;/strong&gt; It looks for builder placeholder text like "click here to edit" that was never replaced before launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks the Locks:&lt;/strong&gt; It notes whether the security certificate is valid and whether the domain name is close to expiring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grades the Results:&lt;/strong&gt; Each site gets a simple A through D grade so the worst problems rise to the top of the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What It Found
&lt;/h2&gt;

&lt;p&gt;These are the patterns that showed up again and again. I have left out business names on purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pictures That Only Worked on the Designer's Computer
&lt;/h3&gt;

&lt;p&gt;On one site, the photos pointed back to the web designer's own laptop. They looked fine to the designer during the build. For every customer since, those pictures have been empty boxes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Online Store Links That Go Nowhere
&lt;/h3&gt;

&lt;p&gt;Several businesses had a "Shop Online" button that led to an error page. In some cases, the online store had been moved or shut down, and nobody updated the button. That is a customer ready to spend money, hitting a wall.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Old Pages That Disappeared
&lt;/h3&gt;

&lt;p&gt;Sites that were rebuilt at some point often left their old product pages behind as dead links. Anyone who bookmarked them, or found them through a search, gets a "page not found" screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A Hacked Site Selling Something Else
&lt;/h3&gt;

&lt;p&gt;One local club's website had been broken into and stuffed with foreign gambling ads. The owners almost certainly have no idea, because the spam was tucked into pages they never visit. Search engines see it, though, and that does real damage to a business's reputation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The First Pass Was Too Harsh
&lt;/h3&gt;

&lt;p&gt;My first run flagged far more sites as "broken" than were really broken. Some sites were simply blocking automated visitors, which is a reasonable security choice, not a failure. My spam detector also flagged an innocent page because the word "specialist" happens to contain the name of a well-known spam drug. I tightened both checks and reran everything. The honest final count: 1 site in great shape, 15 in good shape, and the rest with at least something worth a closer look.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "No Website" Usually Was Not True
&lt;/h3&gt;

&lt;p&gt;Public business listings said hundreds of these businesses had no website at all. When I looked them up by hand, most did. They just were not listed anywhere the map knew about. Lesson learned: never trust a single source. I now double-check every "no website" result before believing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Five-Minute Self-Check:&lt;/strong&gt; Open your site on your phone. Tap every button on the homepage, especially "Shop," "Book," and "Contact." Make sure every picture loads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search for Yourself:&lt;/strong&gt; Search your business name plus words like "casino" or "pharmacy." If odd pages show up under your domain name, you may have been hacked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for Leftovers:&lt;/strong&gt; Scroll every page once, looking for "lorem ipsum," "click here to edit," or other placeholder text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step is reaching out to the businesses with the most serious problems and offering to fix them, starting with the hacked site, before their customers notice first.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>marketing</category>
    </item>
    <item>
      <title>I Built a Scrolling Feed That Teaches You Something Instead of Wasting Your Evening</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Thu, 15 Oct 2026 14:00:01 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/i-built-a-scrolling-feed-that-teaches-you-something-instead-of-wasting-your-evening-jpk</link>
      <guid>https://dev.to/scott_steinmetz/i-built-a-scrolling-feed-that-teaches-you-something-instead-of-wasting-your-evening-jpk</guid>
      <description>&lt;p&gt;I can lose 45 minutes to short videos without noticing. Swipe, swipe, swipe. Most nights, I could not tell you one thing I learned.&lt;/p&gt;

&lt;p&gt;The frustrating part is that some of the best teachers in the world are giving away free lessons on video sites. Guitar chords, personal budgeting, public speaking, photography basics. It is all there. It is just buried under everything else, with no order to it and no way to pick up where you left off.&lt;/p&gt;

&lt;p&gt;The online course sites I tried had the opposite problem. Everything was organized, but every lesson was a 40-minute commitment behind a monthly subscription. I wanted the habit-forming swipe of a short video app, pointed at something useful. So I built MicroLearn.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;MicroLearn is a feed of short lessons that learns what you like. Open it, swipe, and pick up a new skill a few minutes at a time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Feed That Gets to Know You:&lt;/strong&gt; The feed pays attention to which topics you finish and which you skip. Over time it serves more of what you stick with, and it mixes in fresh lessons so it never goes stale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Courses Built in Seconds:&lt;/strong&gt; A teacher types a topic like "photography fundamentals." The system breaks it into an ordered set of bite-sized lessons and finds a strong free video for each step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reminders Right Before You Forget:&lt;/strong&gt; Lessons you have finished come back around on a schedule, a day later, then a few days, then a week, which is the same method language-learning apps use to make things stick.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install It Like an App:&lt;/strong&gt; It runs in any phone or computer browser, and you can add it to your home screen so it opens like a regular app, without an app store download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teachers and Learners:&lt;/strong&gt; Only approved teachers can create courses. Everyone else just learns, which keeps the content library clean.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Running Out of Free Searches
&lt;/h3&gt;

&lt;p&gt;The video site lets a free account run only about 100 searches a day. Building a new course uses a batch of them, and so does the feed when it goes hunting for fresh lessons. Early on, those two features did not know about each other. One busy afternoon of course-building could have left the feed empty for the rest of the day.&lt;/p&gt;

&lt;p&gt;I gave the whole system one shared counter. Every search goes through the same gate, so course-building and the feed draw from the same daily budget and never overspend it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A Thin Feed for New Interests
&lt;/h3&gt;

&lt;p&gt;If you told MicroLearn you love woodworking and there were only three woodworking lessons in the library, you would see them once and then hit a wall. Now, when your favorite topics run low on lessons you have not seen, the feed quietly goes out and finds more on the spot.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Built to Become a Phone App Later
&lt;/h3&gt;

&lt;p&gt;I was not sure yet whether this deserved its own app store listing. Instead of guessing, I made the web version installable and kept everything behind the scenes separate from the screens. If MicroLearn takes off, a phone app can be added on top later without rebuilding anything underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five Courses on Day One:&lt;/strong&gt; It launched with ready-made courses in guitar basics, beginner programming, public speaking, personal finance, and photography.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Content Costs:&lt;/strong&gt; Every lesson is a free video from an existing teacher, so there is no library to film or license.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low Running Costs:&lt;/strong&gt; Careful use of the daily search limit keeps video searches inside the free allowance, so the main cost is the small AI charge each time a new course is built.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step is opening MicroLearn to a few schools and small training teams who want to hand their people a short, guided set of lessons instead of a stack of hour-long videos.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>education</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Your Business Emails Land in Spam (and the Three Records That Fix It)</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:00:02 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/why-your-business-emails-land-in-spam-and-the-three-records-that-fix-it-24ic</link>
      <guid>https://dev.to/scott_steinmetz/why-your-business-emails-land-in-spam-and-the-three-records-that-fix-it-24ic</guid>
      <description>&lt;p&gt;A customer places an order on your website. The order confirmation never shows up. They email you asking if the order went through, or worse, they call their bank and dispute the charge.&lt;/p&gt;

&lt;p&gt;Most of the time, the email was sent. It just landed in their spam folder. Gmail, Outlook, and Yahoo have gotten much stricter about mail that cannot prove where it came from, and most small business websites were never set up to prove it.&lt;/p&gt;

&lt;p&gt;I found this on my own sites. When I moved eight of my domains behind a new security service this summer, I checked every one of them. My own online print shop was missing one of the three records that tell Gmail "yes, this email is really from us." Every receipt it sent was going out with one leg of its ID missing. The off-the-shelf fixes I found either wanted full access to my domain account, which is a security risk, or assumed I already knew what all of this meant. So I built a simpler path.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;Email providers check three short records attached to your domain name. You may hear an IT person call them SPF, DKIM, and DMARC. In plain English, they work like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Guest List:&lt;/strong&gt; The first record lists every service allowed to send email on your behalf, like your website, your newsletter tool, and your office email. Mail from anyone not on the list looks suspicious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Wax Seal:&lt;/strong&gt; The second record lets your email service sign every message with a signature that cannot be faked. The receiving inbox checks the seal against the one on file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The House Rules:&lt;/strong&gt; The third record tells Gmail and Outlook what to do with mail that fails the first two checks, and where to send a report about it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool I built walks a shop owner through all three. You pick the email services you use from a list, and it writes out the exact records you need. If you already have a guest list, it adds to it instead of overwriting it. Then it checks your domain to confirm the records are live, and it can read the hidden "report card" Gmail attaches to every message so you can see a real pass or fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Fixing One Thing Without Breaking Another
&lt;/h3&gt;

&lt;p&gt;The most common mistake I see is someone adding a new guest list that replaces the old one. Their website receipts start arriving again, but now their office email lands in spam. The tool reads the existing list first and merges the new entries into it, so turning on one service never quietly locks out another.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Not Asking for the Keys to Everything
&lt;/h3&gt;

&lt;p&gt;The easy way to automate this is to ask the business owner for full login access to their domain account. I decided against it. That login can redirect your website and your email anywhere, and no small plugin should be holding it. Instead, the tool gives you copy-and-paste instructions, then double-checks your work from the outside. It takes a few extra minutes, and nothing sensitive is stored.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Proof, Not Guesswork
&lt;/h3&gt;

&lt;p&gt;"It should work now" is not good enough when customer receipts are on the line. The final step has you send yourself a test email and paste in Gmail's behind-the-scenes report. The tool reads it and tells you plainly which of the three checks passed and which did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Receipts That Arrive:&lt;/strong&gt; Order confirmations and password resets reach the inbox, which means fewer "did my order go through?" calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caught on My Own Shop First:&lt;/strong&gt; The missing record on my print shop was fixed the same day I found it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set It Once:&lt;/strong&gt; For most small businesses this is a one-time setup. Once the records are in place, they keep working without anyone touching them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to check your own business right now, send an email from your business address to a Gmail account, open it, and choose "Show original." If you do not see three lines that say PASS near the top, your customers' spam folders are probably getting some of your mail. The next step for the tool is testing it on a few more live shops before I offer it to other businesses.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>email</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My Website's Security Was So Tight It Locked Out the One Visitor I Wanted</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Fri, 09 Oct 2026 14:00:02 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/my-websites-security-was-so-tight-it-locked-out-the-one-visitor-i-wanted-5ekj</link>
      <guid>https://dev.to/scott_steinmetz/my-websites-security-was-so-tight-it-locked-out-the-one-visitor-i-wanted-5ekj</guid>
      <description>&lt;p&gt;Every time I publish a blog post, I have a second job. Open Facebook, paste the link, write a caption. Open LinkedIn, do it again. It only takes a few minutes, but it is exactly the kind of chore that gets skipped on a busy day, and a post nobody sees might as well not exist.&lt;/p&gt;

&lt;p&gt;I tried to automate it earlier this year with a free scheduling tool. It fell apart at the first step. Facebook and LinkedIn will not let a small homegrown tool post on your behalf until you go through a business verification process built for much bigger companies.&lt;/p&gt;

&lt;p&gt;The answer turned out to be a sharing tool from a company that works hand in hand with my blogging software. They have already been through that verification, so you just log in and pick where your posts should go. The catch was that my own website would not let it in.&lt;/p&gt;

&lt;p&gt;If that sounds familiar, it should. A few days ago I wrote about how &lt;a href="https://scottsteinmetz.biz/blog/security-upgrade-blocked-page-editor" rel="noopener noreferrer"&gt;a security upgrade locked a client out of editing their own website&lt;/a&gt;. My security had gotten too tight again, and this time it was locking out a visitor I actually wanted.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Publish Once, Share Everywhere:&lt;/strong&gt; When a post goes live, it now shows up on my Facebook Page and my LinkedIn profile at the same moment, with the title, picture, and link filled in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduled Posts Count Too:&lt;/strong&gt; I write posts ahead of time and set them to go out every few days. The sharing happens at the scheduled time, even if I am at work or asleep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Trusted Visitor, Not an Open Door:&lt;/strong&gt; The sharing service needs to talk to my website through a side entrance that hackers love to attack. That entrance now opens only for the sharing company's own computers. Everyone else still gets turned away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No New Bills:&lt;/strong&gt; The sharing tool, the security service in front of my site, and the hosting setup behind it are all things I already had. Nothing new to pay for.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Three Locks on the Same Door
&lt;/h3&gt;

&lt;p&gt;My first attempt to connect simply failed with a vague error. Digging in, I found that my website has three separate layers of security, and each one had its own lock on that side entrance. The outer security service was blocking it. The traffic director in the middle was blocking it. The server at the very back was blocking it twice.&lt;/p&gt;

&lt;p&gt;That is good security. It was also the reason nothing worked. I had to open each lock just enough for one trusted visitor, in the right order, and test each layer on its own so I knew exactly which one was answering.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A Lock That Was Looser Than I Thought
&lt;/h3&gt;

&lt;p&gt;While checking each layer, I found something I did not like. On two of my older sites, the outer lock let through anyone who knew the right phrase to type at the end of the web address. The inner locks were still stopping them, so nothing bad had happened. But "the next lock will catch it" is not a plan.&lt;/p&gt;

&lt;p&gt;I tightened that outer lock first, before opening anything else. Now it checks two things: the right phrase, and whether the visitor is actually coming from the sharing company's published list of computers. A stranger who guesses the phrase still gets blocked at the front gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Facebook Forgot About My New Page
&lt;/h3&gt;

&lt;p&gt;Facebook will not let any outside tool post to a personal profile, so I created a business Page for the blog. Then the new Page refused to show up in the list of places to share. My two older business Pages showed up fine.&lt;/p&gt;

&lt;p&gt;The cause was buried in Facebook's settings. At some point in the past, I had given this same sharing tool access to my older Pages, and Facebook kept reusing that old list instead of asking again. Once I found the tool in Facebook's "Business integrations" settings and checked the box for the new Page, it showed up. It took three tries before Facebook actually saved the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Chore Gone for Good:&lt;/strong&gt; Every post now reaches Facebook and LinkedIn without me lifting a finger, including the ones scheduled weeks ahead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tighter Security Than Before:&lt;/strong&gt; The project ended with my sites better protected than when it started, because the loose outer lock got fixed along the way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Added Cost:&lt;/strong&gt; Everything ran on tools and services I was already using.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you found this post on Facebook or LinkedIn, it got there on its own. The next step is adding the same automatic sharing to the business sites I look after, so their news reaches customers the same day it goes up.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>security</category>
      <category>socialmedia</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My Security Upgrade Locked a Client Out of Editing Their Own Website</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:34:38 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/my-security-upgrade-locked-a-client-out-of-editing-their-own-website-2maj</link>
      <guid>https://dev.to/scott_steinmetz/my-security-upgrade-locked-a-client-out-of-editing-their-own-website-2maj</guid>
      <description>&lt;p&gt;A client of mine came to me with a strange problem. The person who keeps their website up to date could still log in. They could still change other parts of the site. But the moment they tried to edit a regular page, the screen went blank except for one line: "This content is blocked. Contact the site owner to fix the issue." When I logged in and tried it myself, I got the same message.&lt;/p&gt;

&lt;p&gt;The site owner was me, in a sense. Not long before, I had added a new layer of protection to all eight websites I manage. It is a set of instructions every visitor's browser receives, telling it exactly what the page is allowed to load and from where. Done right, it shuts the door on a whole family of attacks where a bad actor sneaks their own code onto your page.&lt;/p&gt;

&lt;p&gt;Done slightly wrong, it shuts the door on you. That is what happened here. The protection was working perfectly. It was just protecting the site from its own editing screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Guest List for Every Page:&lt;/strong&gt; Each time someone opens one of my sites, their browser gets a short list of approved sources for scripts, images, fonts, and embedded windows. Anything not on the list does not load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Editor Lives in a Window Inside a Window:&lt;/strong&gt; Modern page editors show your work inside a small inner window that the editor builds on the fly, right inside your browser. My guest list had no line for that kind of window, so the browser refused to show it. That was the blank screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Narrow Exception:&lt;/strong&gt; I added a single entry allowing those on-the-fly inner windows. Only the page's own code can create one, so an outsider cannot use that opening to slip anything in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three New Locks While I Was There:&lt;/strong&gt; I also added three rules that were missing: no old-style plug-in content, no redirecting the page's base address, and a tighter rule on background helpers. The site ended up stricter overall, not looser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The Easy Fix Was the Wrong Fix
&lt;/h3&gt;

&lt;p&gt;The fastest fix would have been to switch the protection off for the whole admin area, the part of the site where the editing happens. That would have worked in about a minute. It also would have removed the protection from the most valuable part of the site, the part a hacker most wants to get into. I passed on it and tracked down the one specific line the editor needed instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Not Breaking the Checkout
&lt;/h3&gt;

&lt;p&gt;One of the extra rules I considered would have limited where the site's forms are allowed to send information. That sounds like an obvious win. But this client takes payments online, and the checkout hands customers off to the payment company's own page. That rule could have quietly broken checkout. I left it out. A security rule that stops people from paying you is not a win.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Eight Sites With the Same Hidden Problem
&lt;/h3&gt;

&lt;p&gt;Once my client's site was fixed, I checked the other seven sites. Every one had the same rule and the same blind spot. As far as I know, nobody had run into it there yet. I rolled the same fix out to all eight, then confirmed each one was actually sending the corrected rules to visitors instead of trusting that the change had saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Back to Work the Same Day:&lt;/strong&gt; My client could edit pages again that same day, without anyone rebuilding anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stronger, Not Weaker:&lt;/strong&gt; Every site now has the editing fix plus three extra protections it did not have before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seven Sites Fixed Ahead of Time:&lt;/strong&gt; The other sites got the fix before anyone had to call me about a blank screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you or your web person add security settings like this to your own site, test one thing right after: log in and try to edit a page. The next step on my end is adding that exact check to my routine, so the editing screen gets tested every time a security rule changes.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>smallbusiness</category>
      <category>security</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>My Family Still Needs to Send Faxes, So I Built a Fax Line That Lives in the Browser</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Sun, 04 Oct 2026 14:38:24 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/my-family-still-needs-to-send-faxes-so-i-built-a-fax-line-that-lives-in-the-browser-3mjd</link>
      <guid>https://dev.to/scott_steinmetz/my-family-still-needs-to-send-faxes-so-i-built-a-fax-line-that-lives-in-the-browser-3mjd</guid>
      <description>&lt;p&gt;Every few months, someone in my family gets told to "just fax it over." A doctor's office needs a signed form. An insurance company wants a copy of a bill. A county office will not take email, period.&lt;/p&gt;

&lt;p&gt;Nobody in my family owns a fax machine, and nobody wants one. The usual workaround is driving to an office supply store and paying a few dollars a page, or begging a friend who still has an old machine plugged into a landline.&lt;/p&gt;

&lt;p&gt;The online fax services I looked at did not fit either. One provider would not let new accounts receive faxes at all. Another had a signup page that simply did not work. The one that did everything wanted $25 a month at minimum, which is a lot to pay for something we use a handful of times a year. So I built our own.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;Faxbox is a private fax inbox that runs in a web browser. Each household gets its own fax number, and everyone in the family can log in to send and receive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send From Anywhere:&lt;/strong&gt; Upload a PDF or a photo of a signed form, type the destination number, and hit send. No machine, no phone line, no trip to the store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Shared Inbox Per Household:&lt;/strong&gt; Incoming faxes land in a shared family inbox, so whoever is home can see that the doctor's office finally sent the paperwork back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Routing:&lt;/strong&gt; If the same sender always faxes the same person, the system remembers that and drops new faxes straight into that person's view.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locked-Down Households:&lt;/strong&gt; Every family is walled off from every other family. Nobody can see another household's faxes, even by accident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay for Pages, Not Promises:&lt;/strong&gt; The fax number costs well under a dollar a month, and each page costs a penny or two. No monthly minimum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Faxes That Arrived With No Details
&lt;/h3&gt;

&lt;p&gt;Early on, incoming faxes were showing up in the inbox as blank entries: no sender, no page count, nothing. The phone company was telling my system "a fax arrived," but not which one or from whom.&lt;/p&gt;

&lt;p&gt;It turned out the notification address had to be written in a very specific format so the phone company would fill in the sender, the number it was sent to, and the page count. Once that was fixed, every fax arrived complete. As a backup, the system also checks the inbox every 15 minutes on its own, so a missed notification never means a missed fax.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sends That Failed for No Visible Reason
&lt;/h3&gt;

&lt;p&gt;Outgoing faxes were being rejected with vague error messages. Two small details were to blame. The phone company wanted fax numbers written as ten digits, without the leading "1." And the sender name could only contain letters and numbers. A space between a first and last name was enough to sink the whole fax.&lt;/p&gt;

&lt;p&gt;I fixed both behind the scenes. Users type phone numbers and names however they like, and the system cleans them up before anything goes out.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Knowing a Fax Was Real
&lt;/h3&gt;

&lt;p&gt;Because a fax inbox can receive medical and financial paperwork, I did not want to blindly trust any message claiming "you have a new fax." Every incoming notification has to carry a secret key, and then the system goes back to the phone company to confirm the fax actually exists before it shows up in anyone's inbox. Two locks instead of one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No More Store Runs:&lt;/strong&gt; Faxing a signed form now takes about a minute from the kitchen table instead of a 30-minute round trip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Fraction of the Cost:&lt;/strong&gt; A typical month costs our household less than a dollar, compared to a $25 monthly minimum from the cheapest full-featured service I found.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room to Grow:&lt;/strong&gt; Each household is fully separate, so the same system can host other families or a small office without any rebuilding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step is opening Faxbox up to small offices, like a two-person insurance agency or a rural clinic, that still live and die by the fax line but have no reason to keep paying for a machine.&lt;/p&gt;

&lt;p&gt;Curious what this looks like for something you need built? See more of these side by side on the &lt;a href="https://scottsteinmetz.biz/case-studies" rel="noopener noreferrer"&gt;case studies page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>smallbusiness</category>
      <category>family</category>
      <category>showdev</category>
    </item>
    <item>
      <title>FieldOS, Part 3: The App People Open, and What 10 Hours Taught Me About Pricing</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Sat, 29 Aug 2026 14:00:03 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/fieldos-part-3-the-app-people-open-and-what-10-hours-taught-me-about-pricing-3651</link>
      <guid>https://dev.to/scott_steinmetz/fieldos-part-3-the-app-people-open-and-what-10-hours-taught-me-about-pricing-3651</guid>
      <description>&lt;p&gt;Everything in this series so far — the jobs, the parts, the dispatch board, the nine add-ons — runs quietly in the background. None of it matters if the people actually doing the work can't get to it. A technician standing in a parking lot needs a screen that works on his phone. A dispatcher juggling six trucks needs to see the whole board at once. A customer who just wants to know when someone's showing up shouldn't need a password to find out.&lt;/p&gt;

&lt;p&gt;So the last piece was building the actual app every one of those people opens — one login, a different view for every role, all running on top of everything from the first two parts of this series.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One App, Every Role:&lt;/strong&gt; Thirteen different views live behind a single login — a customer portal plus twelve staff roles, from a technician's field view to a dispatcher's board to an accountant's billing screen. Everyone sees exactly what their job needs and nothing they don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Technician's Day, From the Field:&lt;/strong&gt; Time tracking is now tied directly to the job itself — clock in when a job starts, clock out when it's done, and that time flows straight into the invoice from Part 1 automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Dispatcher's Board:&lt;/strong&gt; Every open job, every technician's schedule, assign and reassign in a couple of taps — not a phone call and a whiteboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What Customers See:&lt;/strong&gt; A customer who reported an issue through the public form from Part 2 can log in and watch it move from reported to assigned to done, and see any quote waiting on their approval — no bookkeeping mess, no calling to ask "any update?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try It Yourself:&lt;/strong&gt; A public demo login resets the entire system to a clean starting point every single time, so anyone can click through as a technician, a dispatcher, or a customer without touching real data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;p&gt;Wiring a real interface on top of a working system finds bugs that testing pieces in isolation never surfaces. Every one of these came from actually clicking through the app as each type of user, not from a passing code check.&lt;/p&gt;

&lt;h3&gt;
  
  
  Numbers That Forgot They Were Numbers
&lt;/h3&gt;

&lt;p&gt;The parts inventory screen was sorting and flagging low stock incorrectly — a count of 14 was showing as lower than a count of 5. The cause: those quantities were quietly being handled as words instead of numbers somewhere along the way, and words sort alphabetically, not numerically ("14" reads as "less than" "5" the same way "apple" reads as less than "banana"). Once caught, it was one fix applied everywhere the same data got used.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Date That Moved Itself
&lt;/h3&gt;

&lt;p&gt;A maintenance schedule saved for the 15th was displaying as the 14th. The calendar field was reading a plain date with no time attached and defaulting to a time zone that shifted it back a day. Fixed by being explicit about the time on every date like this going forward — a small, permanent fix once it was actually found.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Filing Cabinet Named the Same Thing as a Web Page
&lt;/h3&gt;

&lt;p&gt;Opening the equipment page directly, or refreshing it, threw an error — but only that one page, and only sometimes. The app's own internal storage folder happened to share a name with that page's web address, and the two were quietly stepping on each other. Renaming the internal folder fixed every instance at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eighty-Three Invoices Nobody Asked For
&lt;/h3&gt;

&lt;p&gt;The "try it yourself, no strings attached" demo was supposed to reset everything to a clean slate on every login. It mostly did — except the automatic invoice-drafting feature from Part 1 kept quietly generating a real draft invoice every time a demo visitor completed a test job, and the reset never knew to clean those up. By the time this was caught, 83 fake draft invoices had piled up in the background. Fixed the reset to sweep those up too, then ran it twice in a row and confirmed the count actually stayed flat instead of climbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure Yours the Same Way
&lt;/h2&gt;

&lt;p&gt;The whole point of building FieldOS wasn't just to have the software — it was to finally know, with real numbers, what a project like this actually costs to build. If you build things for clients and you're guessing at your own pricing the way I was, here's exactly what I did, so you can do it too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Track every stage separately&lt;/strong&gt; — planning, building, testing, and fixing bugs — not one lump "total time" at the end. They tell you different things about where your hours actually go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only count time you're genuinely working.&lt;/strong&gt; A tool sitting open on your screen while you're at lunch isn't billable effort, and it's tempting to let it sneak into the number anyway. Be honest, even when the honest number is smaller than you expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do it on one real project you actually finish and ship&lt;/strong&gt; — not a rough average from memory of past jobs. Memory rounds up. A live-tracked number doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare the real number to two things&lt;/strong&gt;: what you've historically charged for similar work, and what a client would otherwise spend over the next two or three years buying something similar off the shelf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If those two numbers are wildly out of proportion — and they usually are — price against what you replaced for the client, not against the clock.&lt;/strong&gt; The clock tells you your own cost. It was never supposed to tell you what the work is worth to the person paying for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;p&gt;This last piece — the actual app, every role, wired to everything from Parts 1 and 2 — took &lt;strong&gt;just under five hours&lt;/strong&gt;, tracked the same way as the rest of this series: real minutes, planning through testing, nothing rounded up.&lt;/p&gt;

&lt;p&gt;Add up the numbers from all three parts of this series: &lt;strong&gt;roughly three hours&lt;/strong&gt; for the core system, &lt;strong&gt;about two and a half hours&lt;/strong&gt; for the nine add-ons, and &lt;strong&gt;just under five hours&lt;/strong&gt; for the app you'd actually hand to a technician or a customer. That's a complete field service platform — fourteen connected pieces plus a real app for every role — built in &lt;strong&gt;right around ten hours&lt;/strong&gt;. Not ten weeks. Ten hours.&lt;/p&gt;

&lt;p&gt;FieldOS today is a complete, working system covering every role from the technician in the field to the customer waiting at home. A job can go from a customer's public report to an assigned technician to a paid invoice without anyone touching a spreadsheet once.&lt;/p&gt;

&lt;p&gt;Tracking the real hours behind all of it, the way I laid out above, forced an uncomfortable but useful conclusion: pricing this kind of work by the hour badly undersells what actually gets delivered. Ten hours, priced at my old hourly rate, comes out to less than a used car — for a system meant to replace years of subscription software fees. That's the wrong number to hand a client. A system like this needs to be priced against what it replaces for a business — the subscription costs, the slower and clunkier process, the owner's own time spent chasing paperwork — not against how many hours a clock happened to run.&lt;/p&gt;

&lt;p&gt;The next phase is already scoped: real-time technician location tracking, a proper visit-scheduling calendar, signature capture on completed jobs, and built-in team messaging — the groundwork for a true mobile app crews can carry in a truck. That build starts as soon as this series is finished.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>mobile</category>
    </item>
    <item>
      <title>FieldOS, Part 2: Nine Add-Ons You Only Pay for If You Need Them</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Tue, 25 Aug 2026 14:00:01 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/fieldos-part-2-nine-add-ons-you-only-pay-for-if-you-need-them-57e7</link>
      <guid>https://dev.to/scott_steinmetz/fieldos-part-2-nine-add-ons-you-only-pay-for-if-you-need-them-57e7</guid>
      <description>&lt;p&gt;The core of FieldOS — jobs, parts, dispatch, billing — runs the daily grind for any field service business. But "runs the daily grind" and "runs the whole business" are different problems, and every business's gap between the two looks different.&lt;/p&gt;

&lt;p&gt;An HVAC company lives and dies by scheduled maintenance visits. A body shop cares about tracking which insurance estimate got approved. A five-location parts operation needs someone besides the owner able to see the whole company at a glance. None of those needs are universal, so none of them belong bolted onto the core system by default. I built each one as a separate piece a business can turn on only if they need it — the same idea as buying one lamp instead of a whole store's worth of lighting you'll never plug in.&lt;/p&gt;

&lt;p&gt;Nine of these add-ons exist today, each one solving a real gap I could point to in an actual field service business.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Add-Ons Work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Recurring Care:&lt;/strong&gt; A maintenance schedule — replace this filter every 90 days, service this unit twice a year — opens its own job automatically when it comes due, and reschedules itself the moment the work is marked complete. No one has to remember.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real Time Sheets:&lt;/strong&gt; Technicians clock in and out per job, or per shift, and that time feeds straight into the automatic invoice from Part 1 — real labor charges instead of a guess written down after the fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracking What You Own:&lt;/strong&gt; A registry for everything a business owns and everywhere it can be. Fixed equipment stays put — an HVAC unit, a lift, a compressor. Movable assets get tracked as they move — a company truck or trailer, always showing where it actually is right now versus where it's normally kept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quotes Before the Work Starts:&lt;/strong&gt; A formal price gets built, sent, and either approved or declined before a single hour goes on the clock — and an approved quote turns into a real job automatically, no re-entering anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Front Door for Customers, No Password Required:&lt;/strong&gt; A public form lets anyone report an issue without creating an account first — the same instinct behind a "report a pothole" page a city might run. Customers who do have an account get their own private view of their open jobs and quotes, nothing more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staying in Sync with the Customer List You Already Use:&lt;/strong&gt; Rather than force a business to keep two separate customer databases, this piece quietly updates the contact system a business is already running the moment a job comes in or a quote gets approved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bills That Send Themselves:&lt;/strong&gt; For customers on a standing service agreement — a monthly cleaning contract, a quarterly inspection — an invoice generates itself on schedule, no one has to remember to send it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Filing Cabinet That Never Loses Anything:&lt;/strong&gt; Manuals, warranties, insurance certificates, compliance paperwork — stored centrally, tagged to a location or a specific job, with an automatic reminder before anything expires.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Dashboard for Everything:&lt;/strong&gt; A single view pulling live numbers from every other piece a business has turned on — nothing to export, nothing to reconcile by hand.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Buy It or Build It
&lt;/h3&gt;

&lt;p&gt;The recurring-billing piece could have leaned on an existing paid add-on rather than being built from scratch. I checked, and using it would have meant an extra ongoing licensing cost for every single business that turns this feature on — forever, whether they use it heavily or barely at all. I built a lightweight version instead, with no added cost that compounds across every future client.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bill That Quietly Crept Later
&lt;/h3&gt;

&lt;p&gt;Testing the recurring-billing piece caught a subtle but real problem: if the automatic billing check ever ran a little late — a server hiccup, a missed window — the next bill's due date would silently push back by that same delay, and the one after that, compounding every time it happened. A customer on a monthly plan could slowly drift toward being billed less often than agreed, with nobody noticing until months later. I fixed the math to always count forward from the correct scheduled date, immune to how late the check itself happens to run.&lt;/p&gt;

&lt;h3&gt;
  
  
  The First Public Door Needed a Lock
&lt;/h3&gt;

&lt;p&gt;Every other piece of FieldOS lives behind a login. The public "report an issue" form doesn't — it's the platform's first door open to literally anyone on the internet, which meant it needed real protection before it could go live: a hidden trap field that only automated spam-bots fill in, and a limit on how many submissions one visitor can send in an hour. Security wasn't an afterthought bolted on after the form worked — it shipped as part of "working" in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;About two and a half hours&lt;/strong&gt;, tracked the same way as Part 1 — that's what it took to design, build, and verify all nine of these pieces, each one tested live against real data before moving to the next. All nine are independently switchable — a business turns on exactly what applies to how they work and ignores the rest. Between the core system and these nine add-ons, FieldOS now covers the entire life of a job: before it starts, while it's happening, and long after it's closed and filed away.&lt;/p&gt;

&lt;p&gt;Next in this series: the actual app the people using all of this — technicians, dispatchers, customers — open every day, and what tracking every hour of this build revealed about what a system like this should really cost.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>FieldOS, Part 1: I Built the Core System and Timed Every Single Hour</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Sat, 22 Aug 2026 03:18:01 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/fieldos-part-1-i-built-the-core-system-and-timed-every-single-hour-2ig6</link>
      <guid>https://dev.to/scott_steinmetz/fieldos-part-1-i-built-the-core-system-and-timed-every-single-hour-2ig6</guid>
      <description>&lt;p&gt;A while back, I built a complete field service management platform for the first time. It worked. But building it taught me as much about what I'd do differently as it taught me about field service software itself.&lt;/p&gt;

&lt;p&gt;So I built it again — FieldOS — the way I'd build it now, with everything I picked up the first time around. And this time I tracked every real hour it took, start to finish. Not to hit a deadline. To finally answer a question I'd always guessed at before: how much time does a project like this actually take, and what is that time genuinely worth to the business paying for it?&lt;/p&gt;

&lt;p&gt;I do maintenance for a car dealership, an auto parts warehouse, a body shop, and five parts stores in my day job, so I've seen firsthand what off-the-shelf field service software costs a business — and how much of it a smaller crew never touches. FieldOS is built so a business only pays for the pieces it actually needs. But the real question underneath this series isn't what to charge. It's how to price custom work in a way that's honest about what the work is worth, without pricing a small business out of getting it built at all. This series is that experiment, told through the build itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Core System Works
&lt;/h2&gt;

&lt;p&gt;Every field service business needs the same five things to run day to day, no matter what they fix or deliver. This is the part of FieldOS nobody gets to skip — the foundation every add-on plugs into later in this series.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Front Door for Every Job:&lt;/strong&gt; A request comes in, gets logged, and moves through a status list a business defines for itself — not a fixed workflow some software vendor decided everyone needs. A body shop's process doesn't look like an HVAC crew's, so the system shouldn't force them into the same one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real Parts Tracking:&lt;/strong&gt; Every part or supply used on a job gets logged against real stock at a real location, and the system flags it automatically the moment something drops below what a crew needs on hand — not after a technician shows up to an empty shelf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Dispatch Board, Not a Spreadsheet:&lt;/strong&gt; Jobs get assigned to the right technician at a glance, and each tech can see their own schedule without needing access to everyone else's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Getting Paid Without a Bookkeeping Headache:&lt;/strong&gt; The moment a job is marked done, an invoice drafts itself automatically — parts, notes, and all — routed through a payment processor businesses already trust with millions of transactions a day, not some bolted-on, custom-built checkout page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;p&gt;Building the pieces separately is the easy part. Getting them to work correctly together, under real conditions, is where the actual engineering happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Warning That Went Quiet
&lt;/h3&gt;

&lt;p&gt;Low parts triggering an automatic alert only matters if the alert actually fires. While connecting the parts-tracking piece to the job-tracking piece, I found that the low-stock warning had quietly stopped working the moment the two were wired together — invisible when I tested each piece alone, only caught once I ran them as a real pair. The cause was a simple ordering problem: one piece was checking whether the other was ready before the other had actually finished starting up. I fixed the startup order and re-ran the exact scenario that broke it, twice, to be sure.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Invoice That Forgot Its Own Line Items
&lt;/h3&gt;

&lt;p&gt;During a live test of the automatic billing, I generated a real invoice for parts and labor. The total was correct. The list of what was actually being charged for was blank. A finished invoice with the right number but no explanation of where it came from is worse than no invoice at all — a customer would rightly question it. The bug turned out to be a filtering step that was quietly excluding the exact type of charge line this system uses. One fix, and every future invoice carried its full itemized breakdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Five Doors, One That Didn't Announce Itself
&lt;/h3&gt;

&lt;p&gt;A job can enter this system five different ways — a technician logs it, a customer reports it, a scheduled maintenance check creates it automatically, and so on. While wiring in a piece that keeps a business's contact list in sync, I found that four of those five doors properly announced "a new job just came in" to the rest of the system. The fifth didn't, silently, which meant contact records could go stale depending on how a job started. I funneled all five through one shared announcement point so nothing can enter the system again without every other piece hearing about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;p&gt;Real time, tracked as I went rather than guessed afterward: &lt;strong&gt;roughly three hours&lt;/strong&gt;, start to finish, to design, build, and verify all five of these pieces working together. Not three weeks. Three hours. By the end of that single focused stretch, the entire core system was live and taking a real job from "reported" all the way through "paid" — confirmed with an actual test checkout, not just a passing code check. A part gets used, stock drops, a technician gets assigned, the job closes out, and an invoice is waiting with the right total and the right explanation of what it's for.&lt;/p&gt;

&lt;p&gt;That's the floor every FieldOS business runs on. Next in this series: the add-on pieces — the ones a business only pays for if their work actually needs them.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Digital Toolbox for Eight Locations (and Every Truck)</title>
      <dc:creator>Scott Steinmetz</dc:creator>
      <pubDate>Tue, 11 Aug 2026 14:00:02 +0000</pubDate>
      <link>https://dev.to/scott_steinmetz/a-digital-toolbox-for-seven-locations-and-every-truck-1141</link>
      <guid>https://dev.to/scott_steinmetz/a-digital-toolbox-for-seven-locations-and-every-truck-1141</guid>
      <description>&lt;p&gt;I'm the only maintenance person for eight business locations. A dealership, a parts warehouse, a body shop, and five separate auto parts stores, plus the service trucks that move between them. When something breaks, I'm the one who gets the call, no matter which of the eight sites it's at.&lt;/p&gt;

&lt;p&gt;The calls used to come in however people felt like sending them. A text to my personal phone. A verbal "hey, when you get a second" in the parking lot. A voicemail with no callback number. Nothing was written down anywhere, so nothing could be tracked, prioritized, or handed off. If I forgot a request, there was no record that it ever happened.&lt;/p&gt;

&lt;p&gt;The supply side was just as loose. I'd show up to fix a light fixture and discover I was out of the right bulbs, because the only inventory system was my memory of what I thought was still in the truck. Off-the-shelf work order software didn't fix either problem. That kind of software is built for facilities teams with a dozen technicians and a training budget, not a solo operation covering eight addresses. None of it treated a service truck as a real location with its own stock on the shelf, which is exactly what I needed.&lt;/p&gt;

&lt;p&gt;It was actually my wife who called it. She'd hear me on the phone with yet another location, watch me try to reconstruct what was still on the truck from memory, and finally pointed out the obvious: I build exactly this kind of system for other businesses, so why was I running mine out of my head? She was right. So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;So I built the tool myself, sized for the job I actually have.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Report a Problem, No Account Needed:&lt;/strong&gt; Anyone at any of the eight locations can flag an issue from their phone or a store computer in seconds. No username, no password, no app to download first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One Dashboard For Everything:&lt;/strong&gt; Every request from every site lands in a single place I check, instead of six inboxes and a stack of sticky notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reminders Before Things Break:&lt;/strong&gt; The system tracks routine maintenance on a schedule and automatically opens a reminder the day it's due, so upkeep happens on a calendar instead of only after something fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Real Supply Shelf for Every Location — and Every Truck:&lt;/strong&gt; Common parts and supplies are tracked location by location, and the truck counts as its own location with its own running count. I always know what's on hand and what's not, before I'm standing in front of the broken fixture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overcoming the Friction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Making the Truck a Real Location Without Confusing the Front Desk
&lt;/h3&gt;

&lt;p&gt;Trucks needed the same inventory tracking as a fixed store: a running count, a reorder point, a history of what was used and when. But I didn't want a store employee reporting a broken light and seeing "Truck" sitting in the same dropdown as their own building, wondering if they picked the wrong one.&lt;/p&gt;

&lt;p&gt;I split the two views apart. The public report form only shows the eight physical locations, so nobody's guessing. Behind the scenes, the truck is a full-fledged location with its own shelf of supplies, visible to me on the inventory side where it belongs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Killing Alert Fatigue Before It Started
&lt;/h3&gt;

&lt;p&gt;The moment I started loading in real supply counts, half of them were already below where I'd eventually want a reorder alert, simply because I was entering historical numbers, not fresh restocks. If the system fired a low-stock email for every one of those on day one, I'd have learned to ignore my own alerts within a week.&lt;/p&gt;

&lt;p&gt;I built the alert to only fire when a count crosses down below the line from a healthy level. Loading in a starting number that happens to be low stays silent. An actual drop from full to low sends an email. That distinction keeps the alerts meaningful instead of becoming noise I tune out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tying Every Part to the Job That Used It
&lt;/h3&gt;

&lt;p&gt;A supply count by itself doesn't answer the question that actually matters: where did it go? I wanted every change in stock, whether it's a restock, a manual correction, or a part pulled for a specific repair, to leave a record tied back to the ticket or the routine maintenance job it belonged to. Now when a location's supply count drops, there's always a paper trail explaining why, not just a number that changed for no visible reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Win
&lt;/h2&gt;

&lt;p&gt;The real measure of this project is how much of my day it gives back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No More Phone Tag:&lt;/strong&gt; Every one of the eight locations reports issues the same way, and every issue lands in one place I actually check, instead of scattered texts and hallway conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fewer Wasted Trips:&lt;/strong&gt; Knowing what's stocked on the truck and at each site before I head out means fewer mid-job runs back to the shop for a part I assumed I had.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Shelf That Manages Itself:&lt;/strong&gt; Reorder alerts only fire when something genuinely needs attention, so restocking is a five-minute glance instead of a manual count across eight locations and a truck.&lt;/p&gt;

&lt;p&gt;Next up is connecting the two halves directly: when a repair ticket calls for a part, pulling it straight from the right location's shelf automatically, instead of me doing that math by hand.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>api</category>
    </item>
  </channel>
</rss>
