 #  The Humbling Art of Free Software 

 

  ![The Humbling Art of Free Software](https://cdn.richeyweb.com/images/articles/facepalm.avif)    As a [Joomla](/blog/hosting/cron-vs-joomla-lazy-scheduler-and-webcron "Cron vs Joomla Lazy Scheduler and WebCron") extension [developer](/blog/development/bug-reports-a-developers-best-friend-not-a-burden "Bug Reports: A Developer's Best Friend, Not a Burden"), I’ve spent years building and sharing [free extensions](/blog/personal/why-my-joomla-extensions-are-free "Why My Joomla Extensions Are Free") with the [Joomla community](/blog/development/one-sh-tty-email-that-made-me-finally-do-something-about-spam "One Sh*tty Email That Made Me Finally Do Something About Spam"). It’s a labor of love—crafting tools like my [Contact - Valid Email](/software/joomla/plugins/contact-valid-email) and [User - MX Filter](/software/joomla/plugins/user-mx-filter) plugins to help site admins fight [spam](/blog/personal/this-is-how-you-kill-joomla-as-a-platform "This Is How You Kill Joomla as a Platform") and keep their forms secure. But every so often, the open-source world delivers a humbling reminder that no matter how carefully you [code](/blog/personal/pre-configured-client-extension-inspired-by-sap "Pre-Configured Client Extension Inspired by SAP"), there’s always a blind spot waiting to surprise you. Today was one of those days, and it’s a story worth sharing.

## The Humbling Sting of an Oversight

Picture this: a user tests my anti-spam plugins, designed to block contact form submissions with invalid email addresses by checking for valid MX records. It’s a simple but effective gatekeeper—or so I thought. The user, wielding a fake email address, sailed right through. Why? The domain had an MX record, but it pointed to 0.0.0.0—an invalid, non-routable IP address that my plugins didn’t catch. They even said, “If this works, I’ll use it.” It didn’t, and I'm sure lost their [trust](/white-hat-seo/quality-content "Quality Content") as a result.

In the Joomla community, trust is everything. We pour hours into free [software](/blog/development/my-software-powers-joomlas-volunteer-portal "My Software Powers Joomla’s Volunteer Portal"), not for profit, but to build a reputation for reliability. When a flaw like this surfaces, it’s not just a bug—it feels personal. That moment was humbling. It exposed a gap in my thought process, a variable I hadn’t accounted for. I’d built these plugins to protect users, but one edge case made them vulnerable, and that miss cost me a potential user.

## The Five-Minute Fix

The good news? Once I understood the issue, the [fix](/blog/development/new-geoip-coming-soon "New GeoIP Coming Soon") was straightforward. Within five minutes, I added a check to both the Contact - Valid Email and User - MX Filter plugins to reject MX records pointing to 0.0.0.0. It’s an address that’s invalid in any network context, so the tweak was a no-brainer. A few lines of code, a quick test, and the hole was plugged. But the fix didn’t erase the humbling lesson: no matter how solid you think your code is, someone will find a way to break it.

In open-source development, these moments are par for the course. You release your work to the Joomla community, and users—bless their relentless curiosity—push your extensions to their limits. They don’t care about the late-night coding sessions or the clever logic you’re proud of. They just want it to work. When it doesn’t, it’s a reminder that you’re not the center of the universe—you’re part of a collaborative ecosystem where every bug is a chance to learn.

## Looking Ahead: CIDR Black and White Lists

This experience didn’t just prompt a quick fix; it sparked a bigger idea. Blocking 0.0.0.0 was a start, but non-routable IP addresses (like 10.0.0.0/8, 192.168.0.0/16, or others defined in RFC 1918) could still slip through similar MX record tricks. To make my plugins more robust, I’m planning to add CIDR-based blacklist and whitelist capabilities to both Contact - Valid Email and User - MX Filter.

The idea is simple but powerful: let Joomla admins define their own IP ranges to block or allow, with a default blacklist option for common non-routable addresses. I’ll include clear documentation listing ranges like 0.0.0.0/32, 192.168.0.0/16, and others, so users can easily configure their [setup](/blog/hosting/varnish-and-joomla "Varnish and Joomla"). This feature will give [site owners](/blog/development/problems-turn-into-features "Problems Turn Into Features") more control over their spam defenses while closing off [edge cases](/blog/development/another-canonical-url-demon-slain "Another Canonical URL Demon Slain") that could undermine trust.

## Testing and Testing and Testing

No matter how much I test, I can only test for the scenarios that I can think of. For some reason, it never occurred to me that someone would put an invalid IP address into an MX record. In hindsight, that was naive. People put invalid stuff into every form field imaginable - that's why we have form validation. Certainly there is someone with a non-routable IP address as their MX record. It boggles the mind to think of such a thing, but as surely as I can think of it (now), someone has done it. I'm certain (now).

## The Bigger Picture

Developing free software for Joomla is a humbling journey. You put your work out there, knowing it’ll be scrutinized, praised, or torn apart. Each [bug report](/blog/development/how-a-bug-report-made-hashcash-smarter "How a Bug Report Made HashCash Smarter"), each failed test, is a lesson in humility—but also an opportunity to grow. This latest slip with 0.0.0.0 reminded me that no code is perfect, and no developer is infallible. Yet, it’s these moments that push us to improve, to listen to the community, and to keep building tools that make Joomla better for everyone.

To the user I lost today: I wish I could show you the fix. The plugins are stronger now, and they’ll be even tougher with CIDR support. To the Joomla community: thank you for keeping me on my toes. Your tests and [feedback](/blog/development/fair-reviews-and-support "Fair Reviews and Support") make my work better, even when they sting. If you’re using Contact - Valid Email or User - MX Filter, grab the latest update, and stay tuned for the CIDR feature. Let’s keep [building trust](/blog/personal/self-sufficient-solutions-building-trust-with-clients "Self-Sufficient Solutions: Building Trust with Clients"), one fix at a time.



- [      email ](mailto:?subject=The+Humbling+Art+of+Free+Software&body=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fdevelopment%2Fthe-humbling-art-of-free-software)
- [      facebook ](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fdevelopment%2Fthe-humbling-art-of-free-software)
- [      x-twitter ](https://twitter.com/intent/tweet?text=The+Humbling+Art+of+Free+Software%3A+https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fdevelopment%2Fthe-humbling-art-of-free-software)
- [      linkedin ](http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fdevelopment%2Fthe-humbling-art-of-free-software&title=The+Humbling+Art+of+Free+Software&summary=As+a+Joomla+extension+developer+%2C+I%E2%80%99ve+spent+years...)
- [      pinterest ](http://pinterest.com/pin/create/button/?url=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fdevelopment%2Fthe-humbling-art-of-free-software&media=https%3A%2F%2Fcdn.joomla.org%2Fimages%2Fjoomla-org-og.jpg&description=The+Humbling+Art+of+Free+Software)
 


 

   [  Previous article: Problems Turn Into Features   Problems Turn Into Features ](/blog/development/problems-turn-into-features) [  Next article: Fair Reviews and Support  Fair Reviews and Support  ](/blog/development/fair-reviews-and-support)  

##### We Value Your Privacy

 

We use cookies to enhance your experience and for traffic analysis. By continuing to visit this site you agree to our use of cookies.

[Privacy Policy](/privacy-policy)

 Details 

###### Google Tag Manager Items

- Ad Storage
- Ad User Data
- Ad Personalization
- Analytics Storage
- Functionality Storage
- Personalization Storage
- Security Storage
 
 

 

 

 

 

 Decline Accept
```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://www.richeyweb.com/#organization","name":"RicheyWeb","url":"https://www.richeyweb.com/","logo":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/logo/richeyweb.svg","contentUrl":"https://www.richeyweb.com/images/logo/richeyweb.svg","width":{"@type":"QuantitativeValue","value":38,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":38,"unitCode":"PX"},"@id":"https://www.richeyweb.com/#logo"},"image":{"@id":"https://www.richeyweb.com/#logo"},"sameAs":["https://x.com/ComRicheyweb","https://www.facebook.com/RicheyWebDev/","https://www.youtube.com/channel/UCxnVG8BwOvQRO7hVqNX7T2g","https://community.joomla.org/service-providers-directory/listings/115:richeyweb.html"],"description":"RicheyWeb is a custom software developer specializing in Joomla extensions.","ContactPoint":[{"@type":"ContactPoint","url":"https://www.richeyweb.com/contact-us","telephone":"903-873-8460","contactType":"Owner/Administrator","areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"availableLanguage":"en"},{"@type":"ContactPoint","url":"https://www.richeyweb.com/bugs","telephone":"903-873-8460","contactType":"Technical Support","areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"availableLanguage":"en"}],"knowsAbout":["Computer programming",{"@type":"Thing","name":"Computer programming","sameAs":["https://en.wikipedia.org/wiki/Computer_programming","https://www.wikidata.org/wiki/Q80006","https://g.co/kg/m/01mf_"]},"PHP",{"@type":"Thing","name":"PHP","sameAs":["https://en.wikipedia.org/wiki/PHP","https://www.wikidata.org/wiki/Q59","https://g.co/kg/m/060kv"]},"JavaScript",{"@type":"Thing","name":"JavaScript","sameAs":["https://en.wikipedia.org/wiki/JavaScript","https://www.wikidata.org/wiki/Q2005","https://g.co/kg/m/02p97"]},"arduino","Computer forensics",{"@type":"Thing","name":"Computer forensics","sameAs":["https://en.wikipedia.org/wiki/Computer_forensics","https://www.wikidata.org/wiki/Q878553","https://g.co/kg/m/02wxbd"]},"White hat",{"@type":"Thing","name":"White hat","sameAs":["https://en.wikipedia.org/wiki/White_hat_(computer_security)","https://www.wikidata.org/wiki/Q7995625","https://g.co/kg/m/03ns_5"]},"Search engine optimization",{"@type":"Thing","name":"Search engine optimization","sameAs":["https://en.wikipedia.org/wiki/Search_engine_optimization","https://www.wikidata.org/wiki/Q180711","https://g.co/kg/m/019qb_"]},"Search engine marketing",{"@type":"Thing","name":"Search engine marketing","sameAs":["https://en.wikipedia.org/wiki/Search_engine_marketing","https://www.wikidata.org/wiki/Q846132","https://g.co/kg/m/06mw8r"]},"Digital marketing",{"@type":"Thing","name":"Digital marketing","sameAs":["https://en.wikipedia.org/wiki/Digital_marketing","https://www.wikidata.org/wiki/Q1323528","https://g.co/kg/g/122hcnps"]},"Web hosting service",{"@type":"Thing","name":"Web hosting service","sameAs":["https://en.wikipedia.org/wiki/Web_hosting_service","https://www.wikidata.org/wiki/Q5892272","https://g.co/kg/m/014pz4"]},"Email hosting service",{"@type":"Thing","name":"Email hosting service","sameAs":["https://en.wikipedia.org/wiki/Email_hosting_service","https://www.wikidata.org/wiki/Q5368818","https://g.co/kg/m/09w60m"]},"Internet hosting service",{"@type":"Thing","name":"Internet hosting service","sameAs":["https://en.wikipedia.org/wiki/Internet_hosting_service","https://www.wikidata.org/wiki/Q1210425","https://g.co/kg/m/09w5yw"]},"Virtual hosting",{"@type":"Thing","name":"Virtual hosting","sameAs":["https://en.wikipedia.org/wiki/Virtual_hosting","https://www.wikidata.org/wiki/Q588365","https://g.co/kg/m/024mvh"]},"Web performance",{"@type":"Thing","name":"Web performance","sameAs":["https://en.wikipedia.org/wiki/Web_performance","https://www.wikidata.org/wiki/Q7978612","https://g.co/kg/m/0gfj3f1"]},"Web content management system",{"@type":"Thing","name":"Web content management system","sameAs":["https://en.wikipedia.org/wiki/Web_content_management_system","https://www.wikidata.org/wiki/Q45211","https://g.co/kg/m/0615s2"]},"Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"General Data Protection Regulation",{"@type":"Thing","name":"General Data Protection Regulation","sameAs":["https://en.wikipedia.org/wiki/General_Data_Protection_Regulation","https://www.wikidata.org/wiki/Q1172506","https://g.co/kg/m/0pk_7xs"]},"SERP",{"@type":"Thing","name":"SERP","sameAs":["https://en.wikipedia.org/wiki/SERP","https://www.wikidata.org/wiki/Q2205811","https://g.co/kg/g/11c5szp7kc"]},"Artificial intelligence",{"@type":"Thing","name":"Artificial intelligence","sameAs":["https://en.wikipedia.org/wiki/Artificial_intelligence","https://www.wikidata.org/wiki/Q11660","https://g.co/kg/m/0mkz"]},"Prompt engineering",{"@type":"Thing","name":"Prompt engineering","sameAs":["https://en.wikipedia.org/wiki/Prompt_engineering","https://www.wikidata.org/wiki/Q108941486","https://g.co/kg/g/11p6kpgt_n"]},"E-learning",{"@type":"Thing","name":"E-learning","sameAs":["https://en.wikipedia.org/wiki/E-learning_(theory)","https://www.wikidata.org/wiki/Q182250","https://g.co/kg/g/122czm1f"]},"Sharable Content Object Reference Model",{"@type":"Thing","name":"Sharable Content Object Reference Model","sameAs":["https://en.wikipedia.org/wiki/Sharable_Content_Object_Reference_Model","https://www.wikidata.org/wiki/Q827811","https://g.co/kg/m/06_40"]},"Experience API",{"@type":"Thing","name":"Experience API","sameAs":["https://en.wikipedia.org/wiki/Experience_API","https://www.wikidata.org/wiki/Q7807728","https://g.co/kg/g/1yw9ktxr8"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]},"Nginx",{"@type":"Thing","name":"Nginx","sameAs":["https://en.wikipedia.org/wiki/Nginx","https://www.wikidata.org/wiki/Q306144","https://g.co/kg/m/02qft91"]},"MySQL",{"@type":"Thing","name":"MySQL","sameAs":["https://en.wikipedia.org/wiki/MySQL","https://www.wikidata.org/wiki/Q850","https://g.co/kg/m/04y3k"]}],"areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"memberOf":["Mensa International",{"@type":"Organization","name":"Mensa International","sameAs":["https://en.wikipedia.org/wiki/Mensa_International","https://www.wikidata.org/wiki/Q184194","https://g.co/kg/m/0140pf"]},"National Rifle Association",{"@type":"Organization","name":"National Rifle Association","sameAs":["https://en.wikipedia.org/wiki/National_Rifle_Association","https://www.wikidata.org/wiki/Q863259","https://g.co/kg/m/0j6f9"]},"CompTIA",{"@type":"Organization","name":"CompTIA","sameAs":["https://en.wikipedia.org/wiki/CompTIA","https://www.wikidata.org/wiki/Q597534","https://g.co/kg/m/040shq"]},"ISFCE LLC",{"@type":"Organization","name":"ISFCE LLC","sameAs":["https://isfce.com","https://g.co/kg/g/11wxm5r0rg"]}],"hasCredential":[{"@type":"EducationalOccupationalCredential","name":"Joomla 3 Certified Administrator","credentialCategory":"Certification","description":"Administrator Exam is the first available Joomla! certification exam","recognizedBy":{"@type":"Organization","name":"Open Source Matters, Inc.","sameAs":["https://en.wikipedia.org/wiki/Open_Source_Matters,_Inc.","https://g.co/kg/g/11f00wvjhz"]},"url":"https://certification.joomla.org/certified-user-directory/michael-richey","about":["Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"Web content management system",{"@type":"Thing","name":"Web content management system","sameAs":["https://en.wikipedia.org/wiki/Web_content_management_system","https://www.wikidata.org/wiki/Q45211","https://g.co/kg/m/0615s2"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]}],"educationalLevel":"expert","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/contact/badge.webp","contentUrl":"https://www.richeyweb.com/images/contact/badge.webp","width":{"@type":"QuantitativeValue","value":300,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":86,"unitCode":"PX"},"caption":"Joomla 3 Certified Administrator"}},{"@type":"EducationalOccupationalCredential","name":"Certified Computer Examiner","credentialCategory":"Certification","description":"Internationally recognized computer forensics certifiecation","recognizedBy":{"@type":"Organization","name":"ISFCE LLC","sameAs":["https://en.wikipedia.org/wiki/ISFCE_LLC","https://g.co/kg/g/11wxm5r0rg"]},"url":"https://isfce.com/","about":["Digital forensics",{"@type":"Thing","name":"Digital forensics","sameAs":["https://en.wikipedia.org/wiki/Digital_forensics","https://www.wikidata.org/wiki/Q3246940","https://g.co/kg/m/0cnxzfx"]},"Computer forensics",{"@type":"Thing","name":"Computer forensics","sameAs":["https://en.wikipedia.org/wiki/Computer_forensics","https://www.wikidata.org/wiki/Q878553","https://g.co/kg/m/02wxbd"]},"Mobile device forensics",{"@type":"Thing","name":"Mobile device forensics","sameAs":["https://en.wikipedia.org/wiki/Mobile_device_forensics","https://www.wikidata.org/wiki/Q6887097","https://g.co/kg/m/06zp3tp"]},"Network forensics",{"@type":"Thing","name":"Network forensics","sameAs":["https://en.wikipedia.org/wiki/Network_forensics","https://www.wikidata.org/wiki/Q7001032","https://g.co/kg/m/05pb280"]},"Database forensics",{"@type":"Thing","name":"Database forensics","sameAs":["https://en.wikipedia.org/wiki/Database_forensics","https://www.wikidata.org/wiki/Q5227405","https://g.co/kg/m/0cgqsy"]}],"educationalLevel":"expert","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/contact/isfce-cce.webp","contentUrl":"https://www.richeyweb.com/images/contact/isfce-cce.webp","width":{"@type":"QuantitativeValue","value":150,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":150,"unitCode":"PX"},"caption":"Certified Computer Examiner"}}],"hasOfferCatalog":{"@type":"OfferCatalog","name":"Web Services","itemListElement":[{"@type":"Offer","itemOffered":{"@type":"Service","name":"Hosting"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Development"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Search Engine Optimization"}}]}},{"@type":"WebSite","@id":"https://www.richeyweb.com/#website","url":"https://www.richeyweb.com/","name":"RicheyWeb","publisher":{"@id":"https://www.richeyweb.com/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.richeyweb.com/search?q={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string","valueMaxLength":256,"valueMinLength":2,"valuePattern":"^[A-Za-z0-9\\s]+$"}},"creator":{"@id":"https://www.richeyweb.com/#organization"},"copyrightHolder":{"@id":"https://www.richeyweb.com/#organization"}},{"@type":"WebPage","@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#webpage","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software","name":"The Humbling Art of Free Software","description":"The humbling experience of a Joomla plugin flaw, I fixed a spam filter in 5 min. Plans for CIDR lists next. One must take the good with the bad.","isPartOf":{"@id":"https://www.richeyweb.com/#website"},"about":{"@id":"https://www.richeyweb.com/#organization"},"inLanguage":"en-GB"},{"@type":"Article","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/facepalm.avif","contentUrl":"https://www.richeyweb.com/images/articles/facepalm.avif","width":{"@type":"QuantitativeValue","unitCode":"PX"},"height":{"@type":"QuantitativeValue","unitCode":"PX"},"caption":"The Humbling Art of Free Software","representativeOfPage":true},"headline":"The Humbling Art of Free Software","description":"The humbling experience of a Joomla plugin flaw, I fixed a spam filter in 5 min. Plans for CIDR lists next. One must take the good with the bad.","author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"},"datePublished":"2025-08-23T00:00:00+00:00","dateModified":"2026-03-30T00:00:00+00:00","about":["Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]},"Open-source software",{"@type":"Thing","name":"Open-source software","sameAs":["https://en.wikipedia.org/wiki/Open-source_software","https://www.wikidata.org/wiki/Q1130645","https://g.co/kg/m/01pjyj"]},"Software bug",{"@type":"Thing","name":"Software bug","sameAs":["https://en.wikipedia.org/wiki/Software_bug","https://www.wikidata.org/wiki/Q179550","https://g.co/kg/m/0274l59"]}],"mentions":["Email spam",{"@type":"Thing","name":"Email spam","sameAs":["https://en.wikipedia.org/wiki/Email_spam","https://www.wikidata.org/wiki/Q13512320","https://g.co/kg/m/02c58p"]},"Computer programming",{"@type":"Thing","name":"Computer programming","sameAs":["https://en.wikipedia.org/wiki/Computer_programming","https://www.wikidata.org/wiki/Q80006","https://g.co/kg/m/01mf_"]},"Plug-in",{"@type":"Thing","name":"Plug-in","sameAs":["https://en.wikipedia.org/wiki/Plug-in_(computing)","https://www.wikidata.org/wiki/Q3906765","https://g.co/kg/m/05x35"]},"Online community",{"@type":"Thing","name":"Online community","sameAs":["https://en.wikipedia.org/wiki/Online_community","https://www.wikidata.org/wiki/Q6576792","https://g.co/kg/m/09k4rpx"]},"Contact - Valid Email",{"@type":"Thing","@id":"https://www.richeyweb.com/software/joomla/plugins/contact-valid-email/#softwareapplication","name":"Contact - Valid Email","sameAs":["https://extensions.joomla.org/extension/contacts-and-feedback/contact-forms/contact-valid-email/","https://en.wikipedia.org/wiki/Contact_-_Valid_Email"]},"User - MX Filter",{"@type":"Thing","@id":"https://www.richeyweb.com/software/joomla/plugins/user-mx-filter/#softwareapplication","name":"User - MX Filter","sameAs":["https://extensions.joomla.org/extension/clients-a-communities/user-management/user-mx-filter/","https://en.wikipedia.org/wiki/User_-_MX_Filter"]},"Private network",{"@type":"Thing","name":"Private network","sameAs":["https://en.wikipedia.org/wiki/Private_network","https://www.wikidata.org/wiki/Q11186","https://g.co/kg/m/030x6h"]},"0.0.0.0",{"@type":"Thing","name":"0.0.0.0","sameAs":["https://en.wikipedia.org/wiki/0.0.0.0","https://www.wikidata.org/wiki/Q4545523","https://g.co/kg/m/047vm9s"]},{"@type":"Article","@id":"https://www.richeyweb.com/white-hat-seo/quality-content#article","url":"https://www.richeyweb.com/white-hat-seo/quality-content","name":"Quality Content","headline":"Quality Content","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/seo/quality-content/quality-content.webp","contentUrl":"https://www.richeyweb.com/images/articles/seo/quality-content/quality-content.webp","width":{"@type":"QuantitativeValue","value":1024,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":576,"unitCode":"PX"},"caption":"Quality Content"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/hosting/cron-vs-joomla-lazy-scheduler-and-webcron#article","url":"https://www.richeyweb.com/blog/hosting/cron-vs-joomla-lazy-scheduler-and-webcron","name":"Cron vs Joomla Lazy Scheduler and WebCron","headline":"Cron vs Joomla Lazy Scheduler and WebCron","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/lazy-scheduler-and-web-cron/lazy-scheduler-and-web-cron.webp","contentUrl":"https://www.richeyweb.com/images/articles/lazy-scheduler-and-web-cron/lazy-scheduler-and-web-cron.webp","width":{"@type":"QuantitativeValue","value":888,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":499,"unitCode":"PX"},"caption":"Cron vs Joomla Lazy Scheduler and WebCron"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/bug-reports-a-developers-best-friend-not-a-burden#article","url":"https://www.richeyweb.com/blog/development/bug-reports-a-developers-best-friend-not-a-burden","name":"Bug Reports: A Developer's Best Friend, Not a Burden","headline":"Bug Reports: A Developer's Best Friend, Not a Burden","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/plg_content_interlinked/articles/russian-comments.webp","contentUrl":"https://www.richeyweb.com/images/articles/plg_content_interlinked/articles/russian-comments.webp","width":{"@type":"QuantitativeValue","value":1200,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":675,"unitCode":"PX"},"caption":"Bug Reports: A Developer's Best Friend, Not a Burden"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/personal/why-my-joomla-extensions-are-free#article","url":"https://www.richeyweb.com/blog/personal/why-my-joomla-extensions-are-free","name":"Why My Joomla Extensions Are Free","headline":"Why My Joomla Extensions Are Free","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/why-my-joomla-extensions-are-free/free-extensions-kinison.webp","contentUrl":"https://www.richeyweb.com/images/articles/why-my-joomla-extensions-are-free/free-extensions-kinison.webp","width":{"@type":"QuantitativeValue","value":666,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":374,"unitCode":"PX"},"caption":"Why My Joomla Extensions Are Free"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/hosting/negative-seo-via-url-parameter-abuse-in-joomla#article","url":"https://www.richeyweb.com/blog/hosting/negative-seo-via-url-parameter-abuse-in-joomla","name":"Negative SEO via URL Parameter Abuse in Joomla","headline":"Negative SEO via URL Parameter Abuse in Joomla","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/negative-seo-canonical-url/negative-seo-junk-query-parameters.webp","contentUrl":"https://www.richeyweb.com/images/articles/negative-seo-canonical-url/negative-seo-junk-query-parameters.webp","width":{"@type":"QuantitativeValue","value":889,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":499,"unitCode":"PX"},"caption":"Negative SEO via URL Parameter Abuse in Joomla"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/problems-turn-into-features#article","url":"https://www.richeyweb.com/blog/development/problems-turn-into-features","name":"Problems Turn Into Features","headline":"Problems Turn Into Features","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/problems-turn-into-features/problems-turn-into-features.webp","contentUrl":"https://www.richeyweb.com/images/articles/problems-turn-into-features/problems-turn-into-features.webp","width":{"@type":"QuantitativeValue","value":899,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":505,"unitCode":"PX"},"caption":"Problems Turn Into Features"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/fair-reviews-and-support#article","url":"https://www.richeyweb.com/blog/development/fair-reviews-and-support","name":"Fair Reviews and Support","headline":"Fair Reviews and Support","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/fair-reviews-and-support/fair-reviews-text.webp","contentUrl":"https://www.richeyweb.com/images/articles/fair-reviews-and-support/fair-reviews-text.webp","width":{"@type":"QuantitativeValue","value":872,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":500,"unitCode":"PX"},"caption":"Fair Reviews and Support"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla#article","url":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla","name":"Varnish and Joomla","headline":"Varnish and Joomla","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/varnish-nginx-joomla/varnish-and-joomla.webp","contentUrl":"https://www.richeyweb.com/images/articles/varnish-nginx-joomla/varnish-and-joomla.webp","width":{"@type":"QuantitativeValue","value":890,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":500,"unitCode":"PX"},"caption":"Varnish and Joomla"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/hosting/microsoft-deliverability-sendgrid-and-blacklists#article","url":"https://www.richeyweb.com/blog/hosting/microsoft-deliverability-sendgrid-and-blacklists","name":"Microsoft Deliverability - SendGrid and Blacklists","headline":"Microsoft Deliverability - SendGrid and Blacklists","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/microsoft-deliverability/microsoft-deliverability.webp","contentUrl":"https://www.richeyweb.com/images/articles/microsoft-deliverability/microsoft-deliverability.webp","width":{"@type":"QuantitativeValue","value":896,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":504,"unitCode":"PX"},"caption":"Microsoft Deliverability - SendGrid and Blacklists"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/one-sh-tty-email-that-made-me-finally-do-something-about-spam#article","url":"https://www.richeyweb.com/blog/development/one-sh-tty-email-that-made-me-finally-do-something-about-spam","name":"One Sh*tty Email That Made Me Finally Do Something About Spam","headline":"One Sh*tty Email That Made Me Finally Do Something About Spam","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/plg_contact_validemail/validemail.webp","contentUrl":"https://www.richeyweb.com/images/articles/plg_contact_validemail/validemail.webp","width":{"@type":"QuantitativeValue","value":540,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":302,"unitCode":"PX"},"caption":"One Sh*tty Email That Made Me Finally Do Something About Spam"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/personal/pre-configured-client-extension-inspired-by-sap#article","url":"https://www.richeyweb.com/blog/personal/pre-configured-client-extension-inspired-by-sap","name":"Pre-Configured Client Extension Inspired by SAP","headline":"Pre-Configured Client Extension Inspired by SAP","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/pcc/pre-configured-client.webp","contentUrl":"https://www.richeyweb.com/images/articles/pcc/pre-configured-client.webp","width":{"@type":"QuantitativeValue","value":880,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":500,"unitCode":"PX"},"caption":"Pre-Configured Client Extension Inspired by SAP"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/new-geoip-coming-soon#article","url":"https://www.richeyweb.com/blog/development/new-geoip-coming-soon","name":"New GeoIP Coming Soon","headline":"New GeoIP Coming Soon","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/geoip-coming-soon/geoip-coming-soon.webp","contentUrl":"https://www.richeyweb.com/images/articles/geoip-coming-soon/geoip-coming-soon.webp","width":{"@type":"QuantitativeValue","value":508,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":285,"unitCode":"PX"},"caption":"New GeoIP Coming Soon"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/personal/this-is-how-you-kill-joomla-as-a-platform#article","url":"https://www.richeyweb.com/blog/personal/this-is-how-you-kill-joomla-as-a-platform","name":"This Is How You Kill Joomla as a Platform","headline":"This Is How You Kill Joomla as a Platform","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/killing-the-platform/killing-the-platform.webp","contentUrl":"https://www.richeyweb.com/images/articles/killing-the-platform/killing-the-platform.webp","width":{"@type":"QuantitativeValue","value":666,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":374,"unitCode":"PX"},"caption":"This Is How You Kill Joomla as a Platform"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/another-canonical-url-demon-slain#article","url":"https://www.richeyweb.com/blog/development/another-canonical-url-demon-slain","name":"Another Canonical URL Demon Slain","headline":"Another Canonical URL Demon Slain","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/joomlas-canonical-url-chaos/canonical-url-demon.webp","contentUrl":"https://www.richeyweb.com/images/articles/joomlas-canonical-url-chaos/canonical-url-demon.webp","width":{"@type":"QuantitativeValue","value":519,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":291,"unitCode":"PX"},"caption":"Another Canonical URL Demon Slain"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/windownamestore-a-privacy-friendly-volatile-storage-solution-for-web-developers#article","url":"https://www.richeyweb.com/blog/development/windownamestore-a-privacy-friendly-volatile-storage-solution-for-web-developers","name":"WindowNameStore: A Privacy-Friendly Volatile Storage Solution for Web Developers","headline":"WindowNameStore: A Privacy-Friendly Volatile Storage Solution for Web Developers","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/windownamestore/windownamestore.webp","contentUrl":"https://www.richeyweb.com/images/articles/windownamestore/windownamestore.webp","width":{"@type":"QuantitativeValue","value":666,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":375,"unitCode":"PX"},"caption":"WindowNameStore: A Privacy-Friendly Volatile Storage Solution for Web Developers"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/my-software-powers-joomlas-volunteer-portal#article","url":"https://www.richeyweb.com/blog/development/my-software-powers-joomlas-volunteer-portal","name":"My Software Powers Joomla’s Volunteer Portal","headline":"My Software Powers Joomla’s Volunteer Portal","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/thumbs-up-kid.webp","contentUrl":"https://www.richeyweb.com/images/articles/thumbs-up-kid.webp","width":{"@type":"QuantitativeValue","value":600,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":337,"unitCode":"PX"},"caption":"My Software Powers Joomla’s Volunteer Portal"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/personal/self-sufficient-solutions-building-trust-with-clients#article","url":"https://www.richeyweb.com/blog/personal/self-sufficient-solutions-building-trust-with-clients","name":"Self-Sufficient Solutions: Building Trust with Clients","headline":"Self-Sufficient Solutions: Building Trust with Clients","author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}},{"@type":"Article","@id":"https://www.richeyweb.com/blog/development/how-a-bug-report-made-hashcash-smarter#article","url":"https://www.richeyweb.com/blog/development/how-a-bug-report-made-hashcash-smarter","name":"How a Bug Report Made HashCash Smarter","headline":"How a Bug Report Made HashCash Smarter","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/how-a-bug-report-made-hashcash-smarter/double-lock.webp","contentUrl":"https://www.richeyweb.com/images/how-a-bug-report-made-hashcash-smarter/double-lock.webp","width":{"@type":"QuantitativeValue","value":1280,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":720,"unitCode":"PX"},"caption":"How a Bug Report Made HashCash Smarter"},"author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"}}],"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#article","isPartOf":{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#webpage"},"publisher":{"@id":"https://www.richeyweb.com/#organization"},"citation":[{"@type":"CreativeWork","@id":"https://www.richeyweb.com/software/joomla/plugins/contact-valid-email#softwareapplication","url":"https://www.richeyweb.com/software/joomla/plugins/contact-valid-email","name":"Contact - Valid Email"},{"@type":"CreativeWork","@id":"https://www.richeyweb.com/software/joomla/plugins/user-mx-filter#softwareapplication","url":"https://www.richeyweb.com/software/joomla/plugins/user-mx-filter","name":"User - MX Filter"}],"keywords":"Joomla extension, Joomla community, free extensions, Contact - Valid Email plugin, User - MX Filter plugin, spam, secure forms, open-source world, code, blind spot, fake email address, MX record, invalid IP address, 0.0.0.0, trust, reliability, bug, vulnerability, potential user, five-minute fix, network context, code fix, testing, user limits, collaborative ecosystem, learn, CIDR blacklist, CIDR whitelist, IP ranges, default blacklist, documentation, setup, site owners, spam defenses, edge cases, trust, form validation, non-routable IP address, software, developer, humility, bug report, failed test, opportunity to grow, perfect code, infallible developer, improve, community feedback, Joomla, latest update, feedback, building trust, fix","articleSection":"Development","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software","hasPart":[{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-the-humbling-sting-of-an-oversight_2_1"},{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-the-five-minute-fix_2_2"},{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-looking-ahead-cidr-black-and-white-lists_2_3"},{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-testing-and-testing-and-testing_2_4"},{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-the-bigger-picture_2_5"}]},{"@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex","@type":"ItemList","name":"The Humbling Art of Free Software","numberOfItems":5,"itemListElement":[{"@type":"ListItem","position":1,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-the-humbling-sting-of-an-oversight_2_1","name":"The Humbling Sting of an Oversight","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#toc-the-humbling-sting-of-an-oversight_2_1"}},{"@type":"ListItem","position":2,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-the-five-minute-fix_2_2","name":"The Five-Minute Fix","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#toc-the-five-minute-fix_2_2"}},{"@type":"ListItem","position":3,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-looking-ahead-cidr-black-and-white-lists_2_3","name":"Looking Ahead: CIDR Black and White Lists","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#toc-looking-ahead-cidr-black-and-white-lists_2_3"}},{"@type":"ListItem","position":4,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-testing-and-testing-and-testing_2_4","name":"Testing and Testing and Testing","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#toc-testing-and-testing-and-testing_2_4"}},{"@type":"ListItem","position":5,"item":{"@type":"WPHeader","@id":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#articleindex-toc-the-bigger-picture_2_5","name":"The Bigger Picture","url":"https://www.richeyweb.com/blog/development/the-humbling-art-of-free-software#toc-the-bigger-picture_2_5"}}]}]}
```
