<?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: Department of Doing Nothing</title>
    <description>The latest articles on DEV Community by Department of Doing Nothing (@doingnothingdept).</description>
    <link>https://dev.to/doingnothingdept</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%2F4200783%2Fa528ba92-ff5d-444e-83b4-8c36ff27c113.jpg</url>
      <title>DEV Community: Department of Doing Nothing</title>
      <link>https://dev.to/doingnothingdept</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/doingnothingdept"/>
    <language>en</language>
    <item>
      <title>Your SPF record has a limit of 10 DNS lookups. Here's how to count yours and fix it</title>
      <dc:creator>Department of Doing Nothing</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:40:36 +0000</pubDate>
      <link>https://dev.to/doingnothingdept/your-spf-record-has-a-limit-of-10-dns-lookups-heres-how-to-count-yours-and-fix-it-3mo6</link>
      <guid>https://dev.to/doingnothingdept/your-spf-record-has-a-limit-of-10-dns-lookups-heres-how-to-count-yours-and-fix-it-3mo6</guid>
      <description>&lt;p&gt;If your email lands in spam and your SPF record "looks fine", count its DNS lookups. SPF has a hard limit that many domains cross without noticing, usually after adding a newsletter tool, a help desk and a shop platform over the years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;When a receiving server checks SPF, it may follow at most 10 mechanisms that need a DNS query (RFC 7208, section 4.6.4). These count:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;include:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a&lt;/code&gt; and &lt;code&gt;mx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ptr&lt;/code&gt; and &lt;code&gt;exists:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;redirect=&lt;/code&gt; modifier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These do not count: &lt;code&gt;ip4:&lt;/code&gt;, &lt;code&gt;ip6:&lt;/code&gt; and &lt;code&gt;all&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The count includes everything nested: if you &lt;code&gt;include:_spf.google.com&lt;/code&gt; and that record includes three more, that is four lookups, not one.&lt;/p&gt;

&lt;p&gt;Go over 10 and the receiver stops with a "permerror". SPF then counts as failed for every message, and DMARC has to rely on DKIM alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Count yours
&lt;/h2&gt;

&lt;p&gt;Start with your own record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT example.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows: &lt;code&gt;nslookup -type=TXT example.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then look up every &lt;code&gt;include:&lt;/code&gt; and &lt;code&gt;redirect=&lt;/code&gt; target the same way and add up the counting terms you find at each level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT _spf.google.com
dig +short TXT spf.protection.outlook.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A common real-world result: Google Workspace (about 4), Microsoft 365 (2), a newsletter tool (1-2), a help desk (1-2), a shop (1-3), plus &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;mx&lt;/code&gt; at the top. That is 11-14 before anyone notices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Remove what you no longer use.&lt;/strong&gt; Old newsletter tools and trial services are the usual culprits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drop &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;mx&lt;/code&gt; unless your web or mail server sends mail itself.&lt;/strong&gt; Most small businesses send through a provider, so these two lookups do nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move bulk senders to a subdomain.&lt;/strong&gt; Send newsletters from &lt;code&gt;news.example.com&lt;/code&gt; with its own SPF record; it has its own limit of 10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be careful with "flattening"&lt;/strong&gt; (replacing includes with the IP addresses they contain). It works until your provider changes its addresses, and then mail fails silently. Prefer the steps above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep exactly one SPF record.&lt;/strong&gt; Two &lt;code&gt;v=spf1&lt;/code&gt; records on the same name are an error by themselves.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Or let a tool count it
&lt;/h2&gt;

&lt;p&gt;I built a free checker that follows the nested includes, counts the lookups and also checks DKIM, DMARC, MTA-STS and DNSSEC: &lt;strong&gt;&lt;a href="https://guides.webcareshelf.com/email-check/" rel="noopener noreferrer"&gt;guides.webcareshelf.com/email-check&lt;/a&gt;&lt;/strong&gt;. No signup, and it reads only public DNS.&lt;/p&gt;

&lt;p&gt;Disclosure: it's our project. There's an optional $9 report that writes the corrected records for your domain; everything above works without it.&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>5 boring things that quietly break small-business websites (and how to check each in two minutes)</title>
      <dc:creator>Department of Doing Nothing</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:23:30 +0000</pubDate>
      <link>https://dev.to/doingnothingdept/5-boring-things-that-quietly-break-small-business-websites-and-how-to-check-each-in-two-minutes-202a</link>
      <guid>https://dev.to/doingnothingdept/5-boring-things-that-quietly-break-small-business-websites-and-how-to-check-each-in-two-minutes-202a</guid>
      <description>&lt;p&gt;Most small-business websites don't go down because of a clever attack. They go down because of something boring that nobody was watching: a certificate that expired on a Sunday, a domain renewal that failed because the card on file changed, or invoices that land in spam for months before anyone notices.&lt;/p&gt;

&lt;p&gt;Here are the five I see most often, with a quick way to check each one yourself. Everything below uses public information only, so you can run it against any site you look after.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The TLS certificate expires
&lt;/h2&gt;

&lt;p&gt;When the certificate expires, visitors get a full-page browser warning and most of them leave. Free certificates (Let's Encrypt and most hosting providers) last 90 days or less and depend on automatic renewal, which fails silently more often than you'd think: a DNS change, a moved server or a firewall rule is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it:&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;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 &lt;span class="nt"&gt;-servername&lt;/span&gt; example.com 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-enddate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix it:&lt;/strong&gt; make sure automatic renewal is actually on for the domain you are serving (including &lt;code&gt;www&lt;/code&gt;), and put the expiry date in a calendar two weeks early as a backup.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The domain itself expires
&lt;/h2&gt;

&lt;p&gt;This one is worse than the certificate: when the domain lapses, the website &lt;em&gt;and&lt;/em&gt; the email stop working, and in the worst case someone else registers it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it&lt;/strong&gt; with RDAP, the modern replacement for WHOIS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://rdap.org/domain/example.com &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.events[] | select(.eventAction=="expiration") | .eventDate'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix it:&lt;/strong&gt; turn on auto-renew at the registrar, check that the payment card on file is current, and make sure the registrar's emails go to an address someone actually reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;code&gt;http://&lt;/code&gt; doesn't redirect to &lt;code&gt;https://&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Many sites answer on both. People who type the address or follow an old link end up on the unencrypted version, and search engines may see two copies of every page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it:&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;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; http://example.com | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want a &lt;code&gt;301&lt;/code&gt; or &lt;code&gt;308&lt;/code&gt; status and a &lt;code&gt;Location:&lt;/code&gt; header that starts with &lt;code&gt;https://&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix it:&lt;/strong&gt; most hosts have a "force HTTPS" switch. Once HTTPS works everywhere, add the &lt;code&gt;Strict-Transport-Security&lt;/code&gt; header (HSTS) so browsers stop trying plain HTTP at all. Start with a short &lt;code&gt;max-age&lt;/code&gt; and raise it once you're sure.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Email goes to spam: missing SPF or DMARC
&lt;/h2&gt;

&lt;p&gt;If the domain has no SPF record, receiving mail servers can't tell which servers may send for it. Without DMARC, anyone can send mail that looks like it comes from your domain, and big providers increasingly send unauthenticated mail straight to spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it:&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;dig +short TXT example.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf1
dig +short TXT _dmarc.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows: &lt;code&gt;nslookup -type=TXT example.com&lt;/code&gt; and &lt;code&gt;nslookup -type=TXT _dmarc.example.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish exactly &lt;strong&gt;one&lt;/strong&gt; SPF record that lists every service that sends for you, for example &lt;code&gt;v=spf1 include:_spf.google.com ~all&lt;/code&gt; for Google Workspace. Two SPF records break both of them.&lt;/li&gt;
&lt;li&gt;Start DMARC in monitoring mode: &lt;code&gt;v=DMARC1; p=none; rua=mailto:dmarc@example.com&lt;/code&gt;. Read the reports for a few weeks, then move to &lt;code&gt;p=quarantine&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. The search basics are missing
&lt;/h2&gt;

&lt;p&gt;A missing page title or description means search results show whatever text the search engine picks. A missing &lt;code&gt;viewport&lt;/code&gt; tag makes the site look broken on phones. No &lt;code&gt;robots.txt&lt;/code&gt; or &lt;code&gt;sitemap.xml&lt;/code&gt; makes new pages slower to be found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it:&lt;/strong&gt; open the page source (Ctrl+U) and look for &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;meta name="description"&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;meta name="viewport"&amp;gt;&lt;/code&gt;, then visit &lt;code&gt;/robots.txt&lt;/code&gt; and &lt;code&gt;/sitemap.xml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix it:&lt;/strong&gt; a title of 30 to 60 characters and a description of 50 to 160 characters that say what the business does and where. Most site builders have fields for both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: security headers
&lt;/h2&gt;

&lt;p&gt;While you are running &lt;code&gt;curl -sI https://example.com&lt;/code&gt;, look for &lt;code&gt;Strict-Transport-Security&lt;/code&gt;, &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;, a framing rule (&lt;code&gt;X-Frame-Options&lt;/code&gt; or &lt;code&gt;frame-ancestors&lt;/code&gt; in a &lt;code&gt;Content-Security-Policy&lt;/code&gt;) and &lt;code&gt;Referrer-Policy&lt;/code&gt;. None of them is hard to add, and together they block a whole class of cheap attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Or check all of it at once
&lt;/h2&gt;

&lt;p&gt;I got tired of running these by hand for every site, so I built a free checker that does all of the above (19 checks) in about 20 seconds: &lt;strong&gt;&lt;a href="https://guides.webcareshelf.com/check/" rel="noopener noreferrer"&gt;guides.webcareshelf.com/check&lt;/a&gt;&lt;/strong&gt;. You get a score and the top three problems with no signup, and it doesn't save results.&lt;/p&gt;

&lt;p&gt;Disclosure: it's my project. There is an optional $9 full report with every check and a plain-English fix for each problem, and the same key works again after you make the fixes. The commands above give you the same information for free.&lt;/p&gt;

&lt;p&gt;If you find a false positive or a check you think is missing, tell me in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
