<?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: Todd Libby</title>
    <description>The latest articles on DEV Community by Todd Libby (@colabottles).</description>
    <link>https://dev.to/colabottles</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F161248%2F9c9618b8-7308-435d-be58-37cbf9b603b3.gif</url>
      <title>DEV Community: Todd Libby</title>
      <link>https://dev.to/colabottles</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/colabottles"/>
    <language>en</language>
    <item>
      <title>Names Are Hard But They Don't Have To Be</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/names-are-hard-but-they-dont-have-to-be-1o68</link>
      <guid>https://dev.to/colabottles/names-are-hard-but-they-dont-have-to-be-1o68</guid>
      <description>&lt;h2&gt;
  
  
  The $10,000 Bug
&lt;/h2&gt;

&lt;p&gt;In 2015, a major airline's booking system rejected a passenger's name because it contained an apostrophe. The passenger—who had flown with them dozens of times before—missed their flight. The airline had to refund the ticket and compensate for the inconvenience. Total cost: over $10,000.&lt;/p&gt;

&lt;p&gt;The name? &lt;strong&gt;O'Brien&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One of the most common Irish surnames in the world, rejected by a validation rule that probably took someone five seconds to write.&lt;/p&gt;

&lt;p&gt;This isn't an isolated incident. Every day, millions of people around the world encounter forms that reject their names, corrupt their characters, or force them into boxes that don't fit their cultural identity. It's frustrating for users, expensive for companies, and completely avoidable.&lt;/p&gt;

&lt;p&gt;Take for instance &lt;a href="https://www.fodors.com/news/hotels/how-to-deal-with-booking-problems-because-of-special-characters-in-your-name" rel="noopener noreferrer"&gt;this article&lt;/a&gt;&lt;br&gt;&lt;br&gt;
where a woman was denied a hotel room for having an apostrophe in her name! This is the kind of laziness that I find more than off-putting.&lt;/p&gt;

&lt;p&gt;So I'm going to show you how to build forms that respect the diversity of human names while maintaining security and data integrity. Because names—something we think is simple—are actually one of the hardest problems in software development. Even harder, is the fact that most devs cannot be bothered to learn and implement these inclusive patterns.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Before we dive into the technical details, let's establish why getting names right is so critical:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Scale:&lt;/strong&gt; There are over 7 billion people on Earth, speaking thousands of languages, writing in hundreds of scripts, and following countless cultural naming conventions. Your form isn't just for people like you—it's potentially for &lt;strong&gt;everyone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First Impressions:&lt;/strong&gt; Your form is often the first real interaction someone has with your product. When that form rejects their name, you're not just creating a technical error—you're telling them "this product wasn't built for people like you."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business Impact:&lt;/strong&gt; Failed form submissions mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lost customers and revenue&lt;/li&gt;
&lt;li&gt;Increased support tickets and costs&lt;/li&gt;
&lt;li&gt;Damaged brand reputation&lt;/li&gt;
&lt;li&gt;Potential legal issues (discrimination claims)&lt;/li&gt;
&lt;li&gt;Inaccessible services for entire populations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It's Solvable:&lt;/strong&gt; The good news is that handling names correctly isn't actually that hard once you understand the requirements. The bad news is that most developers have absorbed incorrect assumptions about how names work and don't want to put the work into it whether it be learning regex patterns or just plain laziness.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real Examples
&lt;/h2&gt;

&lt;p&gt;Let me show you some real examples I've seen and talked to people about (company names redacted to protect the guilty):&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 1: The Length Validator
&lt;/h3&gt;

&lt;p&gt;A major social media platform rejected the name "José" because it required a minimum of 4 characters. José is one of the most common Spanish names in the world, used by over 6 million people in the United States alone. It is a 4-letter word. So what the hell is going on? A dev couldn't be bothered to get out of their own little bubble to make this work and a manager was too busy with paperwork and meetings to actually check and see what was going on. Peer reviews didn't happen because everyone had their heads down and faces in a keyboard. No accountability.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 2: The Diacritic Stripper
&lt;/h3&gt;

&lt;p&gt;An online retailer automatically stripped accent marks from names, turning "Müller" into "Muller" and "François" into "Francois." When customers received packages addressed to "Muller" instead of their actual name, delivery drivers couldn't find them in apartment directories. Again, a fundamental breakdown in systems, checks and balances, and accountability for devs who could not be bothered to take into consideration names and their origins.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 3: The Character Set Disaster
&lt;/h3&gt;

&lt;p&gt;A banking application using an outdated database encoding turned Chinese names into question marks. Users named 张伟 (Zhang Wei, one of the most common Chinese names) saw their bank statements addressed to "???." So why the absolute failure by financial institutions? Because someone couldn't be bothered to fix it or even find out if it needed fixing. (It needed to be fixed).&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 4: The Punctuation Police
&lt;/h3&gt;

&lt;p&gt;A government service portal rejected names containing apostrophes or hyphens, making it impossible for people named D'Angelo, Mary-Kate, or Jean-Luc to use the service. The error message? "Special characters are not allowed." Because a dev just did not know how to do something. Plain and simple. Instead of making it work and educating themselves, they took the easy way out and closed the door on &lt;em&gt;many&lt;/em&gt; people. Great attitude to have in a government job, and par for the course apparently.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 5: The Western Format Enforcer
&lt;/h3&gt;

&lt;p&gt;An HR system required separate "first name" and "last name" fields with no way to leave either blank. This made the system completely unusable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indonesian users (many have single names like Sukarno)&lt;/li&gt;
&lt;li&gt;Icelandic users (who use patronymics, not surnames)&lt;/li&gt;
&lt;li&gt;Chinese users (whose family name comes first)&lt;/li&gt;
&lt;li&gt;Anyone else who doesn't follow Western naming conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't edge cases. Combined, these examples affect &lt;strong&gt;billions of people&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;"Well! People always have two names, right?" No Kevin, no they do not. Head in the sand syndrome is a horrible affliction.&lt;/p&gt;

&lt;p&gt;So yes, I am being critical. &lt;strong&gt;Very critical&lt;/strong&gt; because this &lt;em&gt;still&lt;/em&gt; goes on to this day. Just this morning I read a post on Bluesky about this very topic, so I had to write this. Because as long as the Web has (questionably) existed, this has been going on because devs are lazy (especially with the advent of AI, LLM's and 'vibe coding'). Do better. Here's how!&lt;/p&gt;


&lt;h2&gt;
  
  
  Understanding Names Globally
&lt;/h2&gt;

&lt;p&gt;To build better forms, we first need to understand how names actually work around the world. Let's bust some myths. (Puts his Mythbusters shirt on).&lt;/p&gt;
&lt;h3&gt;
  
  
  Myth 1: Everyone Has a First Name and Last Name
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Naming conventions vary wildly across cultures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indonesian Names:&lt;/strong&gt; &lt;a href="https://www.ibtimes.com/sukarno-suharto-megawati-why-do-some-indonesians-have-only-one-name-1408204" rel="noopener noreferrer"&gt;Many Indonesians have a single name with no family name&lt;/a&gt;. Famous examples include Sukarno and Suharto, former presidents of Indonesia. When forced to fill out forms with separate first/last name fields, they often have to make something up or repeat their name in both fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Icelandic Patronymics:&lt;/strong&gt; Icelanders don't use family names. Instead, &lt;a href="https://www.icls.edu/blog/icelandic-naming-system" rel="noopener noreferrer"&gt;they use patronymics&lt;/a&gt;—a given name plus their father's (or sometimes mother's) name with "son" or "dóttir" added. The singer Björk's full name is Björk Guðmundsdóttir, meaning "Björk, daughter of Guðmundur." If she had a son, he might be named "Jón Björksson"—note that the family doesn't share a surname.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chinese Naming Convention:&lt;/strong&gt; In Chinese culture, &lt;a href="https://culturalatlas.sbs.com.au/chinese-culture/chinese-culture-naming" rel="noopener noreferrer"&gt;the family name comes first&lt;/a&gt;, followed by the given name. Zhang Wei means Family Name: Zhang, Given Name: Wei. Many Chinese people adopt a Western order when dealing with international contexts, but this can create confusion and inconsistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spanish Naming:&lt;/strong&gt; In Spanish-speaking cultures, &lt;a href="https://www.icls.edu/blog/why-do-people-in-spanish-speaking-countries-have-so-many-last-names" rel="noopener noreferrer"&gt;people typically have two surnames&lt;/a&gt;—one from each parent. María García López has García from her father and López from her mother. When she marries, she might add her husband's surname, becoming María García López de Martínez.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Burmese Names:&lt;/strong&gt; People from Myanmar typically have &lt;a href="https://culturalatlas.sbs.com.au/myanmar-burmese-culture/burmese-myanmar-culture-naming" rel="noopener noreferrer"&gt;no family name at all&lt;/a&gt; and use a system where names indicate generation and personal identity.&lt;/p&gt;
&lt;h3&gt;
  
  
  Myth 2: Names Fit in ASCII
&lt;/h3&gt;

&lt;p&gt;ASCII contains 128 characters, including uppercase and lowercase English letters. That's it. No accents, no umlauts, no characters from non-Latin scripts.&lt;/p&gt;

&lt;p&gt;Here are names that don't fit in ASCII:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vietnamese:&lt;/strong&gt; Nguyễn (with tone marks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arabic:&lt;/strong&gt; محمد (right-to-left script)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chinese:&lt;/strong&gt; 王 (logographic characters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;German:&lt;/strong&gt; Müller (umlaut)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hawaiian:&lt;/strong&gt; Kealiʻi (ʻokina - the glottal stop)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;French:&lt;/strong&gt; François (cedilla)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spanish:&lt;/strong&gt; José (acute accent)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polish:&lt;/strong&gt; Łukasz (l with stroke)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turkish:&lt;/strong&gt; Çağlar (c with cedilla)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Czech:&lt;/strong&gt; Dvořák (r with caron)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't exotic edge cases—they're normal names used by hundreds of millions of people every single day. &lt;strong&gt;ADD THEM!&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Myth 3: You Can Validate Names with Simple Rules
&lt;/h3&gt;

&lt;p&gt;Names can be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very Short:&lt;/strong&gt; &lt;a href="https://forebears.io/surnames/o" rel="noopener noreferrer"&gt;The surname "O" is common in China and Korea&lt;/a&gt;. Single-letter names exist in many cultures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very Long:&lt;/strong&gt; &lt;a href="https://surnames.behindthename.com/name/wolfeschlegelsteinhausenbergerdorff/submitted" rel="noopener noreferrer"&gt;Wolfeschlegelsteinhausenbergerdorff is a real German surname&lt;/a&gt;. Thai names can easily exceed 20 characters. The longest personal name on record is 747 characters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All Consonants:&lt;/strong&gt; &lt;a href="https://www.igenea.com/en/surnames/n/ng" rel="noopener noreferrer"&gt;Ng is a Chinese surname&lt;/a&gt;. Try pronouncing that according to English rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Numbers:&lt;/strong&gt; In some jurisdictions, people can legally change their name to &lt;a href="https://lawexpression.com/can-you-have-a-number-in-your-legal-name/" rel="noopener noreferrer"&gt;include numbers&lt;/a&gt;. For example, &lt;a href="https://www.jennifer8lee.com/" rel="noopener noreferrer"&gt;Jennifer 8. Lee&lt;/a&gt; is a legally registered name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Special Characters:&lt;/strong&gt; Apostrophes (O'Brien), hyphens (Jean-Luc), spaces (von Braun), and periods (St. John) all appear in legitimate names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capitalization Rules:&lt;/strong&gt; Names like "McDonald," "MacLeod," "von Neumann," and "de la Cruz" have internal capitalization that you can't predict with simple rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  Myth 4: You Need to Split Names into Fields
&lt;/h3&gt;

&lt;p&gt;This assumption causes immense problems because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Many cultures don't have a clear first name/last name distinction&lt;/li&gt;
&lt;li&gt;The meaning of "first" and "last" varies by culture&lt;/li&gt;
&lt;li&gt;Some people have multiple middle names or no middle name&lt;/li&gt;
&lt;li&gt;Asking people to incorrectly split their name is disrespectful&lt;/li&gt;
&lt;li&gt;Even "how should we address you?" requires cultural context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Icelandic phone book, for example, is sorted by first name because that's the most meaningful ordering in their culture.&lt;/p&gt;

&lt;p&gt;So why are we still sticking with the same old song and dance pattern of firstname/lastname fields (especially in the US) when some people in the world may not have a qualifier as we talked about earlier? Especially if your company deals with international businesses and people (internationalization-i18n anyone?)&lt;/p&gt;


&lt;h2&gt;
  
  
  The Technical Solution
&lt;/h2&gt;

&lt;p&gt;Now that we understand the problem (hopefully), let's look at how to solve it properly.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Input Validation: Be Permissive
&lt;/h3&gt;

&lt;p&gt;The golden rule: &lt;strong&gt;If you're not sure whether to accept something, accept it. Your users know their own names better than your regex does.&lt;/strong&gt; I cannot stress that enough. This isn't &lt;strong&gt;your&lt;/strong&gt; form! Stop treating it as such! This brings me to my saying, "It works on my machine so it must be correct!" Nope. No it is not.&lt;/p&gt;

&lt;p&gt;Here's what not to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Bad: ASCII only --&amp;gt;
&amp;lt;input
  type="text"
  name="name"
  pattern="[A-Za-z]+"
  title="Letters only"
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rejects &lt;strong&gt;billions&lt;/strong&gt; of legitimate names.&lt;/p&gt;

&lt;p&gt;Here's a much better inclusive and accessible pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Good: Unicode-aware --&amp;gt;
&amp;lt;input
  type="text"
  name="name"
  pattern="[\p{L}\p{M}\s'-.]+$"
  maxlength="150"
  title="Please enter your name"
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down that regex pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\p{L}&lt;/code&gt; - Matches any Unicode letter from any language&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\p{M}&lt;/code&gt; - Matches any Unicode mark (diacritics, accents, tone marks)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\s&lt;/code&gt; - Matches whitespace (spaces, which can appear in names)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'-.&lt;/code&gt; - Matches apostrophes, hyphens, and periods (common in names)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; - One or more of the above&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$&lt;/code&gt; - End of string&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: The &lt;code&gt;\p{}&lt;/code&gt; syntax works in modern JavaScript regex with the &lt;code&gt;u&lt;/code&gt; flag. For older browsers, you may need to be even more permissive or use a library.&lt;/p&gt;

&lt;p&gt;Even this pattern might be too restrictive. A truly inclusive approach would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function isValidName(name) {
  const trimmed = name.trim();

  // Check for reasonable length
  if (trimmed.length &amp;lt; 1 || trimmed.length &amp;gt; 255) {
    return false;
  }

  // Block only dangerous characters:
  // - Control characters (0x00-0x1F, 0x7F)
  // - HTML/XML special chars that could enable injection
  if (/[\x00-\x1F\x7F&amp;lt;&amp;gt;]/.test(trimmed)) {
    return false;
  }

  // Everything else is allowed
  return true;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach blocks only characters that pose actual security risks while accepting virtually all legitimate names.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Database Design
&lt;/h3&gt;

&lt;p&gt;Your database needs to support the full range of Unicode characters. (If it doesn't then maybe it is time it does.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE users (
  name VARCHAR(50) CHARACTER SET latin1
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This limits you to Western European characters and will corrupt or reject everything else. We are trying to get people to &lt;strong&gt;not&lt;/strong&gt; do this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE users (
  name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;utf8mb4&lt;/strong&gt; is the correct encoding for MySQL/MariaDB (the plain "utf8" in MySQL is actually a limited subset)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;utf8mb4_unicode_ci&lt;/strong&gt; provides case-insensitive collation for sorting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VARCHAR(255)&lt;/strong&gt; gives generous space for names (adjust as needed for your use case)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE users (
  name VARCHAR(255)
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostgreSQL uses UTF-8 by default, which is correct.&lt;/p&gt;

&lt;p&gt;For MongoDB, JavaScript, and most modern systems, UTF-8 support is built-in, but always verify your configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Form Field Design
&lt;/h3&gt;

&lt;p&gt;The best approach is to use a single name field when possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label for="full-name"&amp;gt;Full name&amp;lt;/label&amp;gt;
&amp;lt;input
  id="full-name"
  type="text"
  name="full_name"
  maxlength="150"
  autocomplete="name"
  required
&amp;gt;
&amp;lt;span class="help-text"&amp;gt;Your name as it appears on official documents&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works for all naming conventions&lt;/li&gt;
&lt;li&gt;Doesn't force incorrect splitting&lt;/li&gt;
&lt;li&gt;Respects how people identify themselves&lt;/li&gt;
&lt;li&gt;Simpler for users&lt;/li&gt;
&lt;li&gt;Easier to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When you must split names&lt;/strong&gt; (for example, government forms with legal requirements):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;fieldset&amp;gt;
  &amp;lt;legend&amp;gt;Your name&amp;lt;/legend&amp;gt;

  &amp;lt;label for="given-name"&amp;gt;Given name(s)&amp;lt;/label&amp;gt;
  &amp;lt;input
    id="given-name"
    type="text"
    name="given_name"
    autocomplete="given-name"
  &amp;gt;

  &amp;lt;label for="family-name"&amp;gt;Family name(s)&amp;lt;/label&amp;gt;
  &amp;lt;input
    id="family-name"
    type="text"
    name="family_name"
    autocomplete="family-name"
  &amp;gt;

  &amp;lt;p class="help-text"&amp;gt;
    If your name doesn't fit this format, enter your full name
    in the first field and leave the second field blank.
  &amp;lt;/p&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using "given name" and "family name" instead of "first" and "last"&lt;/li&gt;
&lt;li&gt;Neither field is required&lt;/li&gt;
&lt;li&gt;Clear help text explaining what to do if the format doesn't fit&lt;/li&gt;
&lt;li&gt;Proper autocomplete attributes for browser assistance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. The Preferred Name Pattern
&lt;/h3&gt;

&lt;p&gt;For many applications, you can solve multiple problems at once by asking for both legal name and preferred name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;fieldset&amp;gt;
  &amp;lt;legend&amp;gt;Your name&amp;lt;/legend&amp;gt;

  &amp;lt;label for="legal-name"&amp;gt;Legal name&amp;lt;/label&amp;gt;
  &amp;lt;input
    id="legal-name"
    type="text"
    name="legal_name"
    autocomplete="name"
    required
  &amp;gt;
  &amp;lt;span class="help-text"&amp;gt;As it appears on official documents&amp;lt;/span&amp;gt;

  &amp;lt;label for="preferred-name"&amp;gt;Preferred name (optional)&amp;lt;/label&amp;gt;
  &amp;lt;input
    id="preferred-name"
    type="text"
    name="preferred_name"
  &amp;gt;
  &amp;lt;span class="help-text"&amp;gt;What you'd like us to call you&amp;lt;/span&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accommodates legal requirements&lt;/li&gt;
&lt;li&gt;Respects personal identity&lt;/li&gt;
&lt;li&gt;Handles nicknames and chosen names&lt;/li&gt;
&lt;li&gt;Works across cultures&lt;/li&gt;
&lt;li&gt;Supports transgender users who may use a different name than their legal name&lt;/li&gt;
&lt;li&gt;Allows for informal names or anglicized versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Backend Validation
&lt;/h3&gt;

&lt;p&gt;Your server-side validation should match your client-side approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function validateName(name) {
  // Don't do this!!!
  if (!/^[A-Za-z\s]+$/.test(name)) {
    return { valid: false, error: "Name can only contain letters" };
  }

  // Do this instead!
  const trimmed = name.trim();

  if (trimmed.length &amp;lt; 1) {
    return { valid: false, error: "Please enter your name" };
  }

  if (trimmed.length &amp;gt; 255) {
    return { valid: false, error: "Name is too long" };
  }

  // Block control characters and HTML/XML special chars
  if (/[\x00-\x1F\x7F&amp;lt;&amp;gt;]/.test(trimmed)) {
    return {
      valid: false,
      error: "Name contains invalid characters"
    };
  }

  return { valid: true };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additional security considerations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Sanitize for display (prevent XSS)
function sanitizeForDisplay(name) {
  return name
    .replace(/&amp;amp;/g, '&amp;amp;amp;')
    .replace(/&amp;lt;/g, '&amp;amp;lt;')
    .replace(/&amp;gt;/g, '&amp;amp;gt;')
    .replace(/"/g, '&amp;amp;quot;')
    .replace(/'/g, '&amp;amp;#x27;');
}

// For SQL queries, use parameterized queries
// Never concatenate user input directly
const query = 'SELECT * FROM users WHERE name = ?';
db.query(query, [userName]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Display and Formatting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Never automatically transform names:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Bad: This breaks names like McDonald, von Neumann, de la Cruz
function formatName(name) {
  return name.toLowerCase()
    .split(' ')
    .map(word =&amp;gt; word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ');
}

// Good: Display exactly as entered
function displayName(name) {
  return name;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only acceptable transformation is trimming leading/trailing whitespace.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Sorting and Searching
&lt;/h3&gt;

&lt;p&gt;Sorting names across languages requires locale-aware collation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const names = ['Müller', 'Möller', 'Mueller', 'Moeller', 'Zhao', 'Zhang'];

// Bad: ASCII sort gives unpredictable results for non-ASCII
names.sort();

// Good: Locale-aware sort
names.sort((a, b) =&amp;gt; a.localeCompare(b, 'de-DE'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For search, consider using full-text search with proper language analyzers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Use a library like ElasticSearch or PostgreSQL full-text search
// that understands Unicode and language-specific rules

// Example: PostgreSQL with unaccent extension
SELECT * FROM users
WHERE unaccent(name) ILIKE unaccent('%' || $1 || '%');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Testing Strategy
&lt;/h2&gt;

&lt;p&gt;Testing names properly requires a comprehensive test suite with real-world examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Essential Test Cases
&lt;/h3&gt;

&lt;p&gt;Your test suite should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const testNames = [
  // Basic Latin with punctuation
  "O'Brien",
  "Mary-Kate",
  "St. John",
  "von Neumann",
  "de la Cruz",

  // Accented Latin characters
  "José García",
  "François",
  "Müller",
  "Dvořák",
  "Łukasz",

  // Non-Latin scripts
  "张伟", // Chinese
  "محمد", // Arabic
  "Nguyễn", // Vietnamese
  "Παύλος", // Greek
  "Владимир", // Cyrillic
  "ธนา", // Thai

  // Special cases
  "Kealiʻi", // Hawaiian (ʻokina)
  "Sukarno", // Mononym
  "X Æ A-XII", // Unusual characters
  "O", // Single character

  // Edge cases
  "Jean-François D'Aubigny de La Tour", // Long with multiple hyphens
  "Maria García López de Martínez", // Spanish double surname
  "Nguyễn Tấn Dũng", // Vietnamese with tone marks
];

describe('Name validation', () =&amp;gt; {
  testNames.forEach(name =&amp;gt; {
    it(`should accept ${name}`, () =&amp;gt; {
      expect(validateName(name).valid).toBe(true);
    });
  });

  it('should reject empty names', () =&amp;gt; {
    expect(validateName('').valid).toBe(false);
  });

  it('should reject names with HTML', () =&amp;gt; {
    expect(validateName('&amp;lt;script&amp;gt;alert("xss")&amp;lt;/script&amp;gt;').valid).toBe(false);
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manual Testing Checklist
&lt;/h3&gt;

&lt;p&gt;Beyond automated tests, manually test your forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✓ Copy-paste names from different scripts&lt;/li&gt;
&lt;li&gt;✓ Test with a screen reader&lt;/li&gt;
&lt;li&gt;✓ Try names with various combinations of special characters&lt;/li&gt;
&lt;li&gt;✓ Verify database storage and retrieval&lt;/li&gt;
&lt;li&gt;✓ Check email generation and display&lt;/li&gt;
&lt;li&gt;✓ Test PDF generation if applicable&lt;/li&gt;
&lt;li&gt;✓ Verify sorting and searching work correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real User Testing
&lt;/h3&gt;

&lt;p&gt;The best way to catch issues is to test with people who have diverse names:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recruit testers from different cultural backgrounds&lt;/li&gt;
&lt;li&gt;Ask employees with non-ASCII names to test&lt;/li&gt;
&lt;li&gt;Run a bug bounty specifically for name handling issues&lt;/li&gt;
&lt;li&gt;Monitor support tickets for name-related problems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Questions and Edge Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "What about legal requirements?"
&lt;/h3&gt;

&lt;p&gt;Some forms genuinely need to match government formats. In these cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explain why you need the specific format&lt;/li&gt;
&lt;li&gt;Provide clear instructions&lt;/li&gt;
&lt;li&gt;Offer a way to contact support if their name doesn't fit&lt;/li&gt;
&lt;li&gt;Consider storing both a legal name (in required format) and actual name (as they write it)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  "How do I handle sorting?"
&lt;/h3&gt;

&lt;p&gt;Use locale-aware collation in your database and &lt;code&gt;localeCompare()&lt;/code&gt; in JavaScript. For international applications, let users choose their preferred locale for sorting.&lt;/p&gt;

&lt;h3&gt;
  
  
  "What about performance?"
&lt;/h3&gt;

&lt;p&gt;Unicode-aware regex and collation are slightly slower than ASCII operations, but the difference is negligible in modern applications. Don't optimize prematurely—correctness matters more than nanoseconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Should I use a name validation library?"
&lt;/h3&gt;

&lt;p&gt;Most name validation libraries are too restrictive. If you use one, verify it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts all Unicode letters&lt;/li&gt;
&lt;li&gt;Doesn't enforce Western name formats&lt;/li&gt;
&lt;li&gt;Has been tested with diverse real names&lt;/li&gt;
&lt;li&gt;Is actively maintained&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Libraries like &lt;code&gt;validator.js&lt;/code&gt; can help with basic sanitization, but their name validation often falls short.&lt;/p&gt;

&lt;h3&gt;
  
  
  "How do I handle display names vs. legal names?"
&lt;/h3&gt;

&lt;p&gt;Use the preferred name pattern shown earlier. Store both and use the preferred name for all user-facing interactions, falling back to legal name only when legally required.&lt;/p&gt;

&lt;h3&gt;
  
  
  "What about email addresses?"
&lt;/h3&gt;

&lt;p&gt;Email addresses have stricter rules defined by RFC 5321. The local part (before @) can contain letters, numbers, and certain special characters. Handle email validation separately from name validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Should I allow emoji in names?"
&lt;/h3&gt;

&lt;p&gt;Some jurisdictions now allow emoji in legal names. Unless you have a specific reason to block them, accept emoji. They're valid Unicode characters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Accessibility Considerations
&lt;/h2&gt;

&lt;p&gt;Handling names correctly intersects with web accessibility:&lt;/p&gt;

&lt;h3&gt;
  
  
  Proper Labels
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Good: Explicit label association --&amp;gt;
&amp;lt;label for="name-input"&amp;gt;Full name&amp;lt;/label&amp;gt;
&amp;lt;input id="name-input" type="text" name="name"&amp;gt;

&amp;lt;!-- Bad: No label or implicit association --&amp;gt;
&amp;lt;input type="text" name="name" placeholder="Enter name"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error Messages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label for="name"&amp;gt;Full name&amp;lt;/label&amp;gt;
&amp;lt;input
  id="name"
  type="text"
  name="name"
  aria-describedby="name-error"
  aria-invalid="true"
&amp;gt;
&amp;lt;span id="name-error" role="alert"&amp;gt;
  Please enter your name
&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Help Text
&lt;/h3&gt;

&lt;p&gt;Provide clear, visible help text for complex fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label for="name"&amp;gt;Legal name&amp;lt;/label&amp;gt;
&amp;lt;input
  id="name"
  type="text"
  name="name"
  aria-describedby="name-help"
&amp;gt;
&amp;lt;span id="name-help" class="help-text"&amp;gt;
  Enter your name exactly as it appears on your passport or ID
&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Implementation Roadmap
&lt;/h2&gt;

&lt;p&gt;Ready to fix your forms? Here's a practical implementation plan:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Audit (1-2 days)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Find all name input fields in your application&lt;/li&gt;
&lt;li&gt;Check database character set and collation&lt;/li&gt;
&lt;li&gt;Review validation rules&lt;/li&gt;
&lt;li&gt;Test with non-ASCII names&lt;/li&gt;
&lt;li&gt;Document problems found&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 2: Database Migration (1-3 days)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Check current encoding
SHOW CREATE TABLE users;

-- Backup first!
mysqldump -u user -p database &amp;gt; backup.sql

-- Migrate to UTF-8
ALTER TABLE users
  MODIFY COLUMN name VARCHAR(255)
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phase 3: Validation Updates (2-5 days)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Update backend validation to accept Unicode&lt;/li&gt;
&lt;li&gt;Update frontend validation patterns&lt;/li&gt;
&lt;li&gt;Remove overly restrictive rules&lt;/li&gt;
&lt;li&gt;Add comprehensive test cases&lt;/li&gt;
&lt;li&gt;Update error messages&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 4: UI Improvements (2-3 days)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Consider consolidating split name fields&lt;/li&gt;
&lt;li&gt;Add preferred name fields where appropriate&lt;/li&gt;
&lt;li&gt;Update help text&lt;/li&gt;
&lt;li&gt;Improve error messages&lt;/li&gt;
&lt;li&gt;Test with screen readers&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 5: Monitoring (Ongoing)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Track validation failures&lt;/li&gt;
&lt;li&gt;Review support tickets&lt;/li&gt;
&lt;li&gt;Monitor user feedback&lt;/li&gt;
&lt;li&gt;Keep test suite updated with new cases&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resources and Further Reading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Essential Reading
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Falsehoods Programmers Believe About Names&lt;/strong&gt; by Patrick McKenzie&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/" rel="noopener noreferrer"&gt;https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A must-read list of 40+ incorrect assumptions about names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal Names Around the World&lt;/strong&gt; - W3C&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.w3.org/International/questions/qa-personal-names" rel="noopener noreferrer"&gt;https://www.w3.org/International/questions/qa-personal-names&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comprehensive guide to cultural naming conventions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unicode Character Database&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://unicode.org/" rel="noopener noreferrer"&gt;https://unicode.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The definitive source for Unicode character properties.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tools and Libraries
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Unicode Regular Expressions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Most modern languages support &lt;code&gt;\p{}&lt;/code&gt; patterns for Unicode-aware regex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ICU (International Components for Unicode)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Libraries for proper Unicode handling in various languages.&lt;/p&gt;
&lt;h3&gt;
  
  
  Database Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MySQL UTF-8 Guide: &lt;a href="https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html" rel="noopener noreferrer"&gt;https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL Character Sets: &lt;a href="https://www.postgresql.org/docs/current/multibyte.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/current/multibyte.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Testing Resources
&lt;/h3&gt;

&lt;p&gt;Create a test file with diverse names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// names-test-data.js
export const realWorldNames = [
  { name: "O'Brien", culture: "Irish", notes: "Apostrophe" },
  { name: "José García", culture: "Spanish", notes: "Accent marks" },
  { name: "张伟", culture: "Chinese", notes: "Chinese characters" },
  { name: "Nguyễn", culture: "Vietnamese", notes: "Tone marks" },
  { name: "Müller", culture: "German", notes: "Umlaut" },
  { name: "محمد", culture: "Arabic", notes: "Right-to-left script" },
  { name: "Kealiʻi", culture: "Hawaiian", notes: "ʻOkina" },
  { name: "Sukarno", culture: "Indonesian", notes: "Mononym" },
  // Add more as you encounter them
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Responsibility And Where It Lies
&lt;/h2&gt;

&lt;p&gt;So where does the responsibility lie when we come across all these examples of laziness, overlooking, and plain irresponsibility? Look no further than:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Developer: Whether it is laziness, lack of knowledge or education, or the "Well, I am not allowed to make changes like that because..." take the Nike approach and &lt;strong&gt;Just Do It&lt;/strong&gt;! The Sisyphus Effect, or the eternal struggle to make change and there is resistance above you is real, I get it. Make your case! If that doesn't work, throw it in there! I bet BRad has so many meetings and so much paperwork that he really won't ever notice. If so, then we cross that bridge when we get there. Trust me, you'll get the avalanche of crap raining down on you in the end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Manager: Oh yes. My favorite part. Managerial decision-making. Whether you have the best manager since sliced bread or you have the worst manager that can stumble backwards into horse shit and come out smelling like roses, this is on them! They oversee a group of devs, they &lt;em&gt;should&lt;/em&gt; know what they are doing, but should and do are two entirely different things. The onus lies with the manager though.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Designer: A small part in this play, but a part nonetheless. If they don't design for this pattern then they aren't practicing accessible design and are shutting out billions potentially. Everything starts from a design doesn't it? Then the designer is the root of the problem somewhat. The root of the problem lies next.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Conception of the Project: You know that meeting you all have (I hope) where you all get together and plan out what you will do and draw out the roadmap with all the cool tools you use? &lt;strong&gt;THAT&lt;/strong&gt; is where this all starts. Conception of project. It's not going to be accessible if you don't start practicing accessibility from &lt;strong&gt;the very start&lt;/strong&gt;! "We can go back and..." Great, now you have wasted resources, time, money, and more. Just because you didn't take that first step. The most important one. Accessibility and inclusivity.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Handling names correctly is fundamentally about &lt;strong&gt;respect&lt;/strong&gt;. Every time someone encounters a form that rejects their name, they're not thinking &lt;em&gt;"this is a technical limitation."&lt;/em&gt; They're thinking &lt;em&gt;"this company doesn't care about people like me."&lt;/em&gt; They feel left out. Not included. A sense of &lt;em&gt;"this company doesn't want me."&lt;/em&gt; and they aren't wrong. You don't if you keep shutting people out for whatever reasons.&lt;/p&gt;

&lt;p&gt;The technical solution &lt;strong&gt;isn't&lt;/strong&gt; complicated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use UTF-8 everywhere&lt;/li&gt;
&lt;li&gt;Accept Unicode letters and common punctuation&lt;/li&gt;
&lt;li&gt;Store exactly what users enter&lt;/li&gt;
&lt;li&gt;Don't enforce Western name formats&lt;/li&gt;
&lt;li&gt;Test with diverse real names&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the impact is profound. Good name handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Makes your product accessible to billions more people&lt;/li&gt;
&lt;li&gt;Reduces support costs and user frustration&lt;/li&gt;
&lt;li&gt;Demonstrates respect for cultural diversity&lt;/li&gt;
&lt;li&gt;Improves your brand reputation&lt;/li&gt;
&lt;li&gt;Can be legally required in many jurisdictions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start today. Pick one form in your application. Test it with the names in this article. Fix what's broken. Then move to the next form.&lt;/p&gt;

&lt;p&gt;Your users will notice. They'll appreciate being treated as the whole, complete people they are—with names that belong to them, not to your validation rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Take Action
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Audit your forms today&lt;/strong&gt; using the test names provided in this article&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share this guide&lt;/strong&gt; with your team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update your validation&lt;/strong&gt; to be more inclusive&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add diverse names to your test suite&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor and improve&lt;/strong&gt; based on real user feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every person deserves to have their name accepted, stored correctly, and displayed with respect. It's not an edge case. It's not a nice-to-have. It's a fundamental requirement for building inclusive software.&lt;/p&gt;

&lt;p&gt;Get names right, and you're telling your users: &lt;strong&gt;you belong here&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Have you encountered name validation issues? Found a name that breaks systems? &lt;a href="https://bsky.app/profile/toddl.dev" rel="noopener noreferrer"&gt;Share your stories with me on Bluesky.&lt;/a&gt;
&lt;/h3&gt;

</description>
      <category>data</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>ux</category>
    </item>
    <item>
      <title>Building a Production-Ready Nuxt Module From Idea to Published</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/building-a-production-ready-nuxt-module-from-idea-to-published-4b5f</link>
      <guid>https://dev.to/colabottles/building-a-production-ready-nuxt-module-from-idea-to-published-4b5f</guid>
      <description>&lt;h2&gt;
  
  
  How I built &lt;a class="mentioned-user" href="https://dev.to/colabottles"&gt;@colabottles&lt;/a&gt;/center-div - a complete journey from problem to published package
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Impetus
&lt;/h3&gt;

&lt;p&gt;My background allows me to pick up on programming pretty good these days, that said, I don't have an eidetic memory, I have a 40-plus year trove of what I call "space junk" floating around in my head, real life things to think about, but I understand the fundamentals and can understand and process by doing and reading. I figured this project is a great little thing to do. So I did it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Post I Saw
&lt;/h3&gt;

&lt;p&gt;I was on my usual jaunt through Bluesky seeing if there was anything positive or interesting to read and laid eyes &lt;a href="https://bsky.app/profile/stephfh.dev/post/3mbmrbat4os2u" rel="noopener noreferrer"&gt;on this comment&lt;/a&gt; and the reply to it by &lt;a href="https://roe.dev/" rel="noopener noreferrer"&gt;Daniel Roe&lt;/a&gt;, lead maintainer with the Nuxt core team. I thought to myself, &lt;em&gt;"This looks like a funny thing I can do, here is something I can challenge myself with."&lt;/em&gt; and thus I started doing the research.&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;del&gt;Problem&lt;/del&gt; Issue That Started It All
&lt;/h3&gt;

&lt;p&gt;If you've built anything with Nuxt (or anything with anything really), you've probably written this code (or something similar) dozens of times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div style="display: grid; place-items: center; min-height: 25vh"&amp;gt;
  &amp;lt;button&amp;gt;Perfectly Centered&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or a version of this in your preferred programming language.&lt;/p&gt;

&lt;p&gt;It's such a common pattern—centering content on a page—yet we repeat the same CSS (Cascading Style Sheets) Grid boilerplate over and over. Worse, when you try to abstract it into a component, you often run into &lt;strong&gt;hydration mismatches&lt;/strong&gt; that make your console light up with warnings.&lt;/p&gt;

&lt;p&gt;I decided to try and solve this once and for all by building &lt;code&gt;@colabottles/center-div&lt;/code&gt;, a simple Nuxt module for accessible, hydration-safe centering. Here's what I learned building and publishing a production-ready Nuxt module.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Journey: From Idea to npm
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Day 1: The Hydration Nightmare
&lt;/h3&gt;

&lt;p&gt;My first attempt was straightforward—create a Vue component that applies centering styles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script setup&amp;gt;
const props = defineProps({
  minHeight: String
})
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;div
    :style="{
      display: 'grid',
      placeItems: 'center',
      minHeight: minHeight
    }"
  &amp;gt;
    &amp;lt;slot /&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, right? &lt;strong&gt;Wrong. Hydration errors everywhere.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem: Vue was applying styles differently on the server versus the client, causing the dreaded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hydration completed but contains mismatches.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Solution: Timing is Everything
&lt;/h3&gt;

&lt;p&gt;After researching (and a lot of trial and error), I discovered the issue was about &lt;strong&gt;when&lt;/strong&gt; styles get applied. The fix involved two key changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Use &lt;code&gt;computed&lt;/code&gt; styles instead of reactive object spreads:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script setup lang="ts"&amp;gt;
import { computed } from 'vue'

const computedStyle = computed(() =&amp;gt; {
  const baseStyle: Record&amp;lt;string, string&amp;gt; = { display: 'grid' }

  switch (props.axis) {
    case 'horizontal':
      baseStyle.justifyItems = 'center'
      break
    case 'vertical':
      baseStyle.alignItems = 'center'
      break
    default:
      baseStyle.placeItems = 'center'
  }

  if (props.minBlockSize) {
    baseStyle.minBlockSize = props.minBlockSize
  }

  return baseStyle
})
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;component :is="as" :style="computedStyle"&amp;gt;
    &amp;lt;slot /&amp;gt;
  &amp;lt;/component&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. For the directive, use &lt;code&gt;beforeMount&lt;/code&gt; instead of &lt;code&gt;mounted&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default defineNuxtPlugin((nuxtApp) =&amp;gt; {
  nuxtApp.vueApp.directive('center', {
    beforeMount(el: HTMLElement) {
      el.style.display = 'grid'
      el.style.placeItems = 'center'
      el.style.height = '100dvh'
      el.style.width = '100%'
    }
  })
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Zero hydration warnings. The component rendered identically on server and client.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making It Accessible: WCAG (Web Content Accessibility Guidelines) 2.2 Compliance
&lt;/h2&gt;

&lt;p&gt;Centering seems simple, but accessibility matters. I wanted this module to be usable by everyone, including users with disabilities. Here's what I focused on:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Preserving DOM (Document Object Model) Order
&lt;/h3&gt;

&lt;p&gt;Many centering techniques use absolute positioning or flexbox in ways that change visual order without changing DOM order. This breaks screen readers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My approach:&lt;/strong&gt; Pure CSS Grid with &lt;code&gt;place-items: center&lt;/code&gt;. No position manipulation, no reordering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.nuxt-center-div {
  display: grid;
  place-items: center;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Usage of Logical Properties
&lt;/h3&gt;

&lt;p&gt;Instead of &lt;code&gt;min-height&lt;/code&gt;, I used &lt;code&gt;min-block-size&lt;/code&gt; to respect writing modes and text direction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;CenterDiv min-block-size="25vh"&amp;gt;
  Content
&amp;lt;/CenterDiv&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works correctly for RTL (Right-to-Left) languages and vertical writing modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Never Manipulate ARIA (Accessible Rich Internet Applications)
&lt;/h3&gt;

&lt;p&gt;The component doesn't add any ARIA attributes, change roles, or trap focus. It's purely presentational—exactly what a layout utility should be. The less the ARIA, the better I say.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Support Semantic HTML (HyperText Markup Language)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;as&lt;/code&gt; prop lets users choose the correct semantic element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Default: &amp;lt;section&amp;gt; --&amp;gt;
&amp;lt;CenterDiv&amp;gt;Content&amp;lt;/CenterDiv&amp;gt;

&amp;lt;!-- Use &amp;lt;main&amp;gt; for main content --&amp;gt;
&amp;lt;CenterDiv as="main"&amp;gt;Content&amp;lt;/CenterDiv&amp;gt;

&amp;lt;!-- Use &amp;lt;article&amp;gt; for articles --&amp;gt;
&amp;lt;CenterDiv as="article"&amp;gt;Content&amp;lt;/CenterDiv&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's face it, semantic HTML is an art form and one we don't see too often these days that are all about "build fast and break things". That is complete malarkey by the way. I'll explain more in a future blog post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standards met:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ WCAG 1.3.2 - Meaningful Sequence&lt;/li&gt;
&lt;li&gt;✅ WCAG 1.4.10 - Reflow (supports 400% zoom)&lt;/li&gt;
&lt;li&gt;✅ WCAG 2.4.3 - Focus Order&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Testing: The Foundation of Confidence
&lt;/h2&gt;

&lt;p&gt;I learned that &lt;strong&gt;tests aren't optional&lt;/strong&gt; for published packages. Users depend on your code working correctly. Here's the testing stack I built:&lt;/p&gt;

&lt;h3&gt;
  
  
  Unit Tests (Vitest + Vue Test Utils)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import CenterDiv from '../../src/runtime/components/CenterDiv.vue'

describe('CenterDiv', () =&amp;gt; {
  it('renders with default props', () =&amp;gt; {
    const wrapper = mount(CenterDiv, {
      slots: {
        default: '&amp;lt;button&amp;gt;Test&amp;lt;/button&amp;gt;',
      },
    })

    expect(wrapper.find('section').exists()).toBe(true)
    expect(wrapper.find('button').text()).toBe('Test')
  })

  it('applies minBlockSize prop', () =&amp;gt; {
    const wrapper = mount(CenterDiv, {
      props: { minBlockSize: '100vh' },
    })

    const el = wrapper.element as HTMLElement
    expect(el.style.minBlockSize).toBe('100vh')
  })
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Coverage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component rendering&lt;/li&gt;
&lt;li&gt;Props (axis, as, minBlockSize)&lt;/li&gt;
&lt;li&gt;Style application&lt;/li&gt;
&lt;li&gt;7 tests total&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  E2E Tests (Playwright)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { test, expect } from '@playwright/test'

test('component renders and centers content', async ({ page }) =&amp;gt; {
  await page.goto('/')
  await page.waitForLoadState('networkidle')

  const centerDiv = page.locator('.nuxt-center-div').first()
  await expect(centerDiv).toBeVisible()

  const styles = await centerDiv.evaluate((el) =&amp;gt; {
    const computed = window.getComputedStyle(el)
    return {
      display: computed.display,
      placeItems: computed.placeItems,
    }
  })

  expect(styles.display).toBe('grid')
  expect(styles.placeItems).toBe('center')
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tests verify the component works in &lt;strong&gt;actual browsers&lt;/strong&gt; , not just in Node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility Tests (vitest-axe)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { axe } from 'vitest-axe'

it('has no accessibility violations', async () =&amp;gt; {
  const wrapper = mount(CenterDiv, {
    slots: {
      default: '&amp;lt;button&amp;gt;Accessible Button&amp;lt;/button&amp;gt;',
    },
  })

  const results = await axe(wrapper.element)
  expect(results.violations).toHaveLength(0)
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This caught issues I might have missed, like missing ARIA labels or incorrect heading hierarchy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final count:&lt;/strong&gt; 11 tests, 100% passing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Module Structure: Following Best Practices
&lt;/h2&gt;

&lt;p&gt;The official Nuxt module template provides excellent scaffolding. Here's the structure I ended up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;center-div-module/
├── src/
│ ├── module.ts # Module registration
│ └── runtime/
│ ├── components/
│ │ └── CenterDiv.vue # Component
│ ├── plugin.ts # Directive
│ └── types.ts # TypeScript definitions
├── playground/ # Local development
│ ├── app.vue
│ └── nuxt.config.ts
├── test/
│ ├── unit/
│ │ └── CenterDiv.test.ts
│ └── e2e/
│ └── CenterDiv.spec.ts
├── package.json
├── tsconfig.json
└── vitest.config.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Files Explained
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;src/module.ts&lt;/code&gt;&lt;/strong&gt; - Registers the component and plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { defineNuxtModule, addComponent, addPlugin, createResolver } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'center-div',
    configKey: 'centerDiv',
  },
  setup(_options, _nuxt) {
    const resolver = createResolver(import.meta.url)

    addComponent({
      name: 'CenterDiv',
      filePath: resolver.resolve('./runtime/components/CenterDiv.vue'),
    })

    addPlugin({
      src: resolver.resolve('./runtime/plugin'),
      mode: 'client',
    })
  },
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;playground/&lt;/code&gt;&lt;/strong&gt; - Critical for development. Run &lt;code&gt;pnpm dev&lt;/code&gt; and you get a live Nuxt app with your module loaded. Instant feedback loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Build Process: Getting Ready for npm (Node PAckage Manager)
&lt;/h2&gt;

&lt;p&gt;Building the module involves several steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Module Builder
&lt;/h3&gt;

&lt;p&gt;Nuxt provides &lt;code&gt;nuxt-module-build&lt;/code&gt; which handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bundling (ESM (ECMAScript Modules) + CommonJS)&lt;/li&gt;
&lt;li&gt;TypeScript compilation&lt;/li&gt;
&lt;li&gt;Type definitions generation
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm run prepack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the &lt;code&gt;dist/&lt;/code&gt; folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/
├── module.mjs # ESM entry
├── module.cjs # CommonJS entry
├── module.d.ts # TypeScript definitions
└── runtime/
    ├── components/
    │ └── CenterDiv.vue
    └── plugin.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Package Configuration
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;package.json&lt;/code&gt; tells npm what to publish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "@colabottles/center-div",
  "version": "0.1.2",
  "type": "module",
  "exports": {
    ".": {
      "types": "./dist/types.d.ts",
      "import": "./dist/module.mjs",
      "require": "./dist/module.cjs"
    }
  },
  "files": [
    "dist"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Only the &lt;code&gt;dist/&lt;/code&gt; folder gets published.&lt;/strong&gt; This keeps the package size tiny (4.4 kB).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Publishing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm publish --access public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--access public&lt;/code&gt; flag is required for scoped packages (@username/package-name).&lt;/p&gt;




&lt;h2&gt;
  
  
  CI/CD: Automating Quality
&lt;/h2&gt;

&lt;p&gt;GitHub Actions runs tests on every push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: ci
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version: 20
      - run: corepack enable
      - name: Install dependencies
        run: pnpm install
      - name: Prepare playground
        run: pnpm run dev:prepare
      - name: Test
        run: pnpm run test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This catches issues &lt;strong&gt;before&lt;/strong&gt; they reach users.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges I Faced (And How I Solved Them)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: TypeScript Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Tests failed in CI because &lt;code&gt;tsconfig.json&lt;/code&gt; extended &lt;code&gt;.nuxt/tsconfig.json&lt;/code&gt; which doesn't exist until you run the dev server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Create a standalone &lt;code&gt;tsconfig.json&lt;/code&gt; that doesn't depend on generated files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "Bundler",
    "strict": true,
    "types": ["node", "vitest"]
  },
  "include": ["src/ **/*", "test/** /*"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Challenge 2: Vite Version Conflicts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Vitest and @vitejs/plugin-vue used different Vite versions, causing type errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Add a type assertion to ignore the incompatibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default defineConfig({
  // @ts-expect-error - Vite version conflict
  plugins: [vue()],
  test: {
    environment: 'happy-dom',
  }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Challenge 3: ESLint Checking Generated Files
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; ESLint was throwing 2,825 errors from generated files in &lt;code&gt;playwright-report/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Add ignore patterns to &lt;code&gt;eslint.config.mjs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default createConfigForNuxt({
  // ...
}).append({
  ignores: [
    ' **/dist/**',
    ' **/node_modules/**',
    ' **/.nuxt/**',
    ' **/playwright-report/**',
    ' **/test-results/**',
  ],
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-World Usage
&lt;/h2&gt;

&lt;p&gt;Once published, using the module is straightforward:&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @colabottles/center-div
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@colabottles/center-div']
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Component Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;!-- Full viewport centering --&amp;gt;
  &amp;lt;CenterDiv min-block-size="100vh"&amp;gt;
    &amp;lt;button&amp;gt;Click Me&amp;lt;/button&amp;gt;
  &amp;lt;/CenterDiv&amp;gt;

  &amp;lt;!-- Horizontal only --&amp;gt;
  &amp;lt;CenterDiv axis="horizontal" min-block-size="50vh"&amp;gt;
    &amp;lt;nav&amp;gt;Navigation&amp;lt;/nav&amp;gt;
  &amp;lt;/CenterDiv&amp;gt;

  &amp;lt;!-- Custom semantic element --&amp;gt;
  &amp;lt;CenterDiv as="main"&amp;gt;
    &amp;lt;h1&amp;gt;Main Content&amp;lt;/h1&amp;gt;
  &amp;lt;/CenterDiv&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Directive Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;div v-center&amp;gt;
    Quick full-viewport centering
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Developer Experience Matters
&lt;/h3&gt;

&lt;p&gt;Small details make a huge difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear prop names (&lt;code&gt;minBlockSize&lt;/code&gt; vs &lt;code&gt;minHeight&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;TypeScript autocomplete&lt;/li&gt;
&lt;li&gt;Helpful README with examples&lt;/li&gt;
&lt;li&gt;Fast development server&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Tests Give Confidence
&lt;/h3&gt;

&lt;p&gt;Every test I wrote caught a real bug. The time invested in testing paid off immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Accessibility Isn't Optional (Which I Already Knew)
&lt;/h3&gt;

&lt;p&gt;Building accessible components from the start is easier than retrofitting them later. Using semantic HTML and CSS Grid made accessibility almost automatic.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Nuxt Ecosystem is Excellent
&lt;/h3&gt;

&lt;p&gt;The module template, build tools, and documentation made this process smooth. The Nuxt team has done incredible work.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Community Feedback is Essential
&lt;/h3&gt;

&lt;p&gt;Reaching out to experienced developers provides invaluable perspective before launching.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Metrics
&lt;/h2&gt;

&lt;p&gt;The final package is &lt;strong&gt;tiny&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Package size: 4.4 kB (compressed)
Unpacked size: 10.3 kB
Files: 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For comparison, that's smaller than a single medium-resolution image. Zero dependencies beyond Nuxt itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;Ideas for future versions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gap prop&lt;/strong&gt; for spacing between centered items:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Animation support&lt;/strong&gt; for smooth centering transitions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Max inline size&lt;/strong&gt; for constraining width:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nuxt DevTools integration&lt;/strong&gt; to visualize all CenterDiv instances on a page&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;The module is live on npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @colabottles/center-div
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@colabottles/center-div" rel="noopener noreferrer"&gt;npm:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/colabottles/center-div-module" rel="noopener noreferrer"&gt;GitHub:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentation: &lt;em&gt;See README on GitHub&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways for Building Your Own Module
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with the official template:&lt;/strong&gt; &lt;code&gt;npx nuxi init my-module -t module&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test from day one:&lt;/strong&gt; Unit, E2E, and accessibility tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the playground:&lt;/strong&gt; Instant feedback beats blind development&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focus on DX:&lt;/strong&gt; Clear APIs, good docs, TypeScript support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make it accessible:&lt;/strong&gt; Follow WCAG guidelines from the start&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep it small:&lt;/strong&gt; Every kilobyte matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automate everything:&lt;/strong&gt; CI/CD catches issues early&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Get feedback:&lt;/strong&gt; Community review prevents bad patterns&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a Nuxt module taught me more about Vue, TypeScript, testing, and accessibility than any tutorial could. The process of taking an idea from concept to published package—with real users able to &lt;code&gt;npm install&lt;/code&gt; it—is incredibly rewarding.&lt;/p&gt;

&lt;p&gt;If you have a common pattern in your Nuxt projects, consider extracting it into a module. The ecosystem benefits, and you'll learn a ton in the process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What patterns do you find yourself repeating in Nuxt?&lt;/strong&gt; Maybe your next module idea is already in your codebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nuxt/starter/tree/module" rel="noopener noreferrer"&gt;&lt;strong&gt;Nuxt Module Template:&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nuxt.com/docs/guide/going-further/modules" rel="noopener noreferrer"&gt;&lt;strong&gt;Nuxt Module Author Guide:&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/WCAG21/quickref/" rel="noopener noreferrer"&gt;&lt;strong&gt;WCAG Guidelines:&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitest.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Vitest Documentation:&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Playwright Testing:&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>vue</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Architecture of Anxiety and Shame, Part Two</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/the-architecture-of-anxiety-and-shame-part-two-47mg</link>
      <guid>https://dev.to/colabottles/the-architecture-of-anxiety-and-shame-part-two-47mg</guid>
      <description>&lt;h2&gt;
  
  
  Part Two, Deception vs. Bad Design or Bad user experience
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Roach Motels
&lt;/h2&gt;

&lt;p&gt;A &lt;em&gt;roach motel&lt;/em&gt; is a deceptive pattern to which it is easy to sign up for a service or subscription, but extremely difficult to cancel. This pattern usually involves hiding or obscuring the cancellation option, requiring users to call customer services to cancel, and in turn, makes the process of cancelling overly complex and time-consuming. This pattern can cause users to give up trying to cancel, and continue paying for the service for a longer period that they do not necessarily want to pay for any longer.&lt;/p&gt;

&lt;p&gt;These roach motels are not the kind you book that are not clean and are not great to stay in or the ones that trap those nasty little bugs that may crawl around a house or business but these are nonetheless just as gross. The roach motels that are laid out all over to trap users into and like the Eagles said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can check out any time you like, but you can never leave.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is a couple examples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftodhmpfbb7sz788wvquv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftodhmpfbb7sz788wvquv.png" alt="A roach motel from the New York Times that forced a user to recruit three people to start paid subscriptions to the paper. The text says, quote. Learn about the different ways you can cancel your New York Times subscription. Refer three paid subscribers to cancel. End quote. Then three input boxes are available to enter three friends emails and another button at the bottom to verify the active referrals." width="364" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pg0aszxy2u6y3l9t143.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pg0aszxy2u6y3l9t143.png" alt="A roach motel from the New York Times that says, quote. There are several ways to unsubscribe from The Times. Once your subscription has been cancelled you will have limited access to The New York Times content. Speak with a Customer Care Advocate. Call us 866-273-3612 if you are in the U.S. Our hours are 1 a.m. to 10 p.m. E.T. Monday to Friday, and 7 a.m. to 3 p.m. on weekends and holidays. Please see our international contact information if you are outside the U.S. End quote. International content information is a link that leads you to another page. The text goes on to read, quote. Chat with a Customer Care Advocate. Click on the Chat button to the right or bottom of this page to chat with a Care Advocate. Chat is accessible 24 hours a day, 7 days a week. For more information about our cancellation policy, see our Terms of Sale. End quote. Terms of sale is also a link to another page. End quote. Then three input boxes are available to enter three friends emails and another button at the bottom to verify the active referrals." width="410" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fun huh?&lt;/p&gt;

&lt;p&gt;The pattern with roach motels focuses in on wearing a user out. Making you so tired, exhausted, irritated, mad, angry so that you give up and just say to hell with it, that you are not going to unsubscribe because it is a pain in the ass. Period.&lt;/p&gt;

&lt;p&gt;That pattern, to trap you, to make you think twice. To make you stop and say, "Is it worth the hassle?" That stopping cue is what these companies don't want you to access or find.&lt;/p&gt;

&lt;p&gt;Roach motels rely on a blend of cognitive fatigue and emotional pressure. The more friction a user encounters, the more their mental resources drain. At a certain point, anxiety rises ("What if I mess something up?"), frustration spikes, and shame creeps in ("Why is this so hard? Is it just me?"). This emotional cocktail is exactly what the pattern relies on to keep you trapped.&lt;/p&gt;

&lt;p&gt;Deceptive patterns like "roach motels" are not just annoyances — they’re part of a larger ecosystem of manipulative design that exploits cognitive fatigue, shame, and decision friction. These patterns weaponize user psychology in subtle ways, and the result is often emotional exhaustion, frustration, and a breakdown of trust in digital products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why These Patterns Work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cognitive Fatigue&lt;/strong&gt;: People give up when their executive function is depleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decision Friction&lt;/strong&gt;: Intentionally adding micro-obstacles increases abandonment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Loss Aversion&lt;/strong&gt;: "You’ll lose access to ___" prompts trigger anxiety.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shame Activation&lt;/strong&gt;: Feeling "irresponsible" or "incompetent" makes users hesitate to continue cancellation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Forced Continuity
&lt;/h2&gt;

&lt;p&gt;Forced continuity is the operational engine behind a roach motel. Once the user is trapped, continuity keeps them there — through auto-renewals, hidden opt-outs, or the removal of natural stopping points.&lt;/p&gt;

&lt;p&gt;This goes hand in hand with the roach motel, as well as other deceptive patterns. Infinite scroll again, for example. That forced continuity when the stopping cue (in this case the "load more" prompt or button) and the developer/designer has you in the palm of their hand.&lt;/p&gt;

&lt;p&gt;You are forced to continue the pattern you did not want to go down and find yourself exhausted, frustrated, angry, mad by the time you get to where you need to go but you have either given up and left or you have just said, "To hell with it" and you are done. Or you're so exhausted you don't remember what you were doing and you just give in and stay subscribed, or you keep scrolling, or you keep clicking, or you keep doing whatever it is you are doing.&lt;/p&gt;

&lt;p&gt;Forced continuity is your captor. The roach motel is where you are being kept hostage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stopping Cue
&lt;/h2&gt;

&lt;p&gt;The stopping cue is that point in the interaction where you are stopped. Whether it is an infinite scroll that the developer or designer has taken away (I will get to that in another post soon) or a roach motel that wears you out so you stop. That's the cue we need to get rid of regarding these patterns.&lt;/p&gt;

&lt;p&gt;Anti-pattern or deceptive pattern, that cue, needs to go if it is used for nefarious reasons and they usually are used just for that. From an interview with Aza Raskin, the inventor of infinite scroll;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I regret that I didn’t think more about how this thing would be used," he told The Times. He compares the feature to a study in 2005 that gave users bowls of soups that constantly refilled via a tube underneath the bowl. Participants ate 70 per cent more soup than those with normal bowls and did not even notice.&lt;/p&gt;

&lt;p&gt;"I know as a designer that by taking away the stopping cue, I can make you do what I want you to do," Mr Raskin, a former head of user design at the browser Mozilla, said.&lt;/p&gt;

&lt;p&gt;Mr. Raskin went on to say; "I contributed to this and I have been complicit," he said. "This story that we had all been telling ourselves that we were making the world better with technology, that story has been undone, I can’t tell myself that story any more." He added: "This is a profound moment in our species. We are losing control of the tools we made."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Stopping cues are the natural pauses in an experience — the end of a page, the bottom of a list, the confirmation of a completed action. When designers remove these cues, the user’s brain loses its moment to reset. Infinite scroll, autoplay, and friction-filled cancellation flows all target this vulnerability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of Stopping Cues
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Pagination
&lt;/h4&gt;

&lt;p&gt;Example: A "Next page" button at the end of search results.&lt;br&gt;
What it does: Forces a conscious choice: "Do I want to keep going?"&lt;br&gt;
Removed version: Infinite scroll keeps feeding content endlessly, removing the reflection point.&lt;/p&gt;

&lt;h4&gt;
  
  
  End of an Article or Section
&lt;/h4&gt;

&lt;p&gt;Example: Reaching the end of a blog post.&lt;br&gt;
Stopping cue: A natural break — the reading task is complete.&lt;br&gt;
Removed version: Auto-loading the next article, keeping users from feeling "finished."&lt;/p&gt;

&lt;h4&gt;
  
  
  A Confirm or Complete Button
&lt;/h4&gt;

&lt;p&gt;Example: "Submit," "Finish," "Place order," "Cancel subscription."&lt;br&gt;
Stopping cue: Allows users to finalize a mental task and move on.&lt;br&gt;
Removed version: Breaking the action into multiple hidden steps without confirming completion.&lt;/p&gt;

&lt;h4&gt;
  
  
  Load More Button
&lt;/h4&gt;

&lt;p&gt;Example: Social media pages showing a limited number of posts with a "Load more" option.&lt;br&gt;
Stopping cue: Users take stock before loading more content.&lt;br&gt;
Removed version: Infinite scroll (removes the deliberate choice to continue).&lt;/p&gt;

&lt;h4&gt;
  
  
  Checkout Review Screen
&lt;/h4&gt;

&lt;p&gt;Example: A summary of your cart before payment.&lt;br&gt;
Stopping cue: Encourages review, consideration, and intention.&lt;br&gt;
Removed version: One-click purchasing that bypasses reflection and increases impulse behavior.&lt;/p&gt;

&lt;h4&gt;
  
  
  End-of-Video Playback
&lt;/h4&gt;

&lt;p&gt;Example: A video ends and pauses.&lt;br&gt;
Stopping cue: The user chooses whether to watch more.&lt;br&gt;
Removed version: Auto-play automatically begins the next video, bypassing the decision point.&lt;/p&gt;

&lt;h4&gt;
  
  
  Session Timeout Prompts
&lt;/h4&gt;

&lt;p&gt;Example: "Are you still watching?" / "Still browsing?"&lt;br&gt;
Stopping cue: Signals a check-in moment and chance to disengage.&lt;br&gt;
Removed version: Sites that never pause playback or activity, encouraging passive overuse.&lt;/p&gt;

&lt;h4&gt;
  
  
  Natural End of a Workflow
&lt;/h4&gt;

&lt;p&gt;Example: Completing a form returns the user to a dashboard.&lt;br&gt;
Stopping cue: Signals the task is complete.&lt;br&gt;
Removed version: Forms that loop users into upsells, surveys, or optional extras that look mandatory.&lt;/p&gt;

&lt;h4&gt;
  
  
  Breaks Between Notifications
&lt;/h4&gt;

&lt;p&gt;Example: A notification digest that comes once a day.&lt;br&gt;
Stopping cue: Encourages controlled re-engagement.&lt;br&gt;
Removed version: Real-time, continuous notifications that keep pulling users back.&lt;/p&gt;

&lt;h4&gt;
  
  
  Physical World Stopping Cues
&lt;/h4&gt;

&lt;p&gt;These can help illustrate your point with a relatable analogy:&lt;br&gt;
The last page of a book&lt;br&gt;
The credits rolling at the end of a movie&lt;/p&gt;

&lt;p&gt;The bottom of a bowl (Aza Raskin’s soup analogy)&lt;/p&gt;

&lt;p&gt;When tech removes these cues, it removes the user’s natural ability to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Avoid the Pitfalls
&lt;/h2&gt;

&lt;p&gt;So how does a user avoid all this garbage? Because once you’re in a roach motel or caught in a forced continuity loop, it feels like the product has all the power and you have none. The good news is: you do have options. Designers may remove stopping cues, but you can reintroduce your own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recognize the pattern early
&lt;/h3&gt;

&lt;p&gt;If a service made it extremely easy to sign up and suddenly very hard to leave, that’s not an accident. The moment you see emotional language ("You’re going to miss out!"), multi-step cancellation hoops, or links that keep getting smaller and smaller, you’re in a deceptive pattern. Awareness kills half of the manipulation right there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypass the interface entirely
&lt;/h3&gt;

&lt;p&gt;Most roach motels rely on you trying to find the exit inside their maze. Don’t. A quick search for "&lt;em&gt;service name&lt;/em&gt; cancel subscription" often leads straight to the hidden cancellation page. Or cancel through your bank, your credit card, or your phone’s app store. These systems don’t care about the company’s friction, and they let you escape without the drama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use your own stopping cues
&lt;/h3&gt;

&lt;p&gt;If the interface won’t give you a moment to pause, create one. Slow down. Step back. Remind yourself why you came to the page in the first place. Infinite scroll, autoplay, and buried cancellation flows all depend on you reacting instead of deciding. When you reintroduce intention, the pattern loses its leverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set reminders before free trials end
&lt;/h3&gt;

&lt;p&gt;Forced continuity preys on forgetfulness. A calendar reminder set at the moment you sign up replaces the stopping cue the product intentionally removed. Don’t give them the luxury of you forgetting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use virtual or single-use cards
&lt;/h3&gt;

&lt;p&gt;Some banks and privacy tools allow temporary or merchant-locked card numbers. If the company makes it difficult—or impossible—to cancel, you can simply cut off the payment source. They can’t force continuity if they can’t charge you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check your rights
&lt;/h3&gt;

&lt;p&gt;In many regions, companies are legally required to provide a simple cancellation mechanism. Sometimes it’s buried in the footer under "Legal" or "Your Rights." It may not be prominent, but it exists—because it has to.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contact support as a last resort
&lt;/h3&gt;

&lt;p&gt;Support agents often have access to a straightforward cancellation tool the UI deliberately hides. A quick chat or email can end what the design tries to drag out.&lt;/p&gt;

&lt;p&gt;At the end of the day, avoiding these traps is about reclaiming control—your time, your attention, and your autonomy. If the design won’t respect those things, you have to put the stopping cues back in yourself.&lt;/p&gt;

&lt;p&gt;These traps work because they hijack executive function, shame, and emotional energy. The best way to escape them is to step outside the interface — cognitively or literally — and reclaim your control. When you reintroduce your own stopping cues, the manipulation loses its leverage.&lt;/p&gt;

&lt;p&gt;For users with anxiety, ADHD, or executive function challenges, these patterns aren’t just annoying — they’re debilitating. What might be a minor irritation for a designer becomes a source of spiraling frustration or shame for someone already struggling with emotional regulation.&lt;/p&gt;

&lt;p&gt;When systems are designed to trap us, the emotional cost is real. Anxiety spikes as we try to fight the interface, and shame sets in when we feel like the failure is ours rather than the design’s. Recognizing these patterns is the first step in resisting them — and the first step toward designing something better.&lt;/p&gt;

</description>
      <category>design</category>
      <category>ui</category>
      <category>ux</category>
    </item>
    <item>
      <title>The Architecture of Anxiety and Shame, Part One</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Tue, 07 Oct 2025 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/the-architecture-of-anxiety-and-shame-part-one-164f</link>
      <guid>https://dev.to/colabottles/the-architecture-of-anxiety-and-shame-part-one-164f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftm46v6qmubdzmue2081u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftm46v6qmubdzmue2081u.jpg" alt="A man with his hands to his face in shame." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part One, The Scarcity and Pressure to Make Decisions and Placing Guilt in the Users Lap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Humanity and the Choices People Make
&lt;/h3&gt;

&lt;p&gt;In the work and research I have done for a number of years now, I have found that the choices we make as developers, technologists, organizations and companies, founders and CEOs has come down to compromising humanity. There are very few instances I have found where the lines are drawn in the sand and never crossed by anyone I just mentioned, which is why the work I have done to bring perhaps a little bit of change to the WCAG (Web Content Accessibility Guidelines) 3 document (which is still in development and not a standard, please refer to &lt;a href="https://www.w3.org/TR/WCAG22/" rel="noopener noreferrer"&gt;WCAG 2.2&lt;/a&gt; &lt;a href="https://www.w3.org/TR/WCAG21/" rel="noopener noreferrer"&gt;or 2.1&lt;/a&gt;) that we can mitigate some of the damage that has been done in the decades of grift and deceit that have been laid over the foundation of the Web as we know it.&lt;/p&gt;

&lt;p&gt;“In the name of growth and profit!” is the steady battle cry that is silently shouted as the battle horns are sounded from the tops of the towers that CEOs and companies use as a bastion of corporate greed and capitalism and whatever methods they need to employ and deploy, they will certainly get all their workers that fall into line, they will do that for their fearless leaders who strut their stuff once, maybe twice a year on a stage with a big theatrical show for all to see.&lt;/p&gt;

&lt;p&gt;Lost is the humanity I can see clearly. How that kid that just wanted to code, grew up to want to take over the world and throw away any kind of humanity though, that is the part that baffles me. Where does that get lost and at what point does something inside a person's head just snap and say, 'Let's do evil things today!'? As I try to answer those questions I have, I also look to help others that are the targets of these deceptive practices now so that they do not fall prey to the silent hunter that is literally stalking them.&lt;/p&gt;

&lt;p&gt;I wanted to go over four patterns, four of many patterns, that are used to play with people psychologically, that draw out the anxiety and fear, the guilt and shame, and how these patterns are used and what we can do to combat them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Amigos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Timed-based urgency/Fake urgency/Confirmshaming
&lt;/h3&gt;

&lt;p&gt;The exploitation of FOMO (Fear of Missing Out) and social comparison is used a lot. Literally everywhere in a digital space where there is some kind of revenue involved. Social anxiety is something that is used to pressure people into action. Many deceptive patterns come in pairs. Some, come in groups, like The Outsiders (a great movie and book by the way).&lt;/p&gt;

&lt;p&gt;Fake scarcity (FOMO), time pressure (anxiety), and confirmshaming (guilt/social inadequacy) are used to target the social fears that are very real that affect 1 in 10 Americans. The economic and emotional/psychological cost is massive and any design that amplifies that anxiety for-profit isn't bad business. It is an ethical attack on the public's well-being. Businesses that use these patterns should never have business and people should never deal with companies that use these patterns for-profit against them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Data and Key Points
&lt;/h3&gt;

&lt;p&gt;The condition of social anxiety isn't just a rare shyness, it is actually &lt;a href="https://socialphobia.org/social-anxiety-disorder-definition-symptoms-treatment-therapy-medications-insight-prognosis" rel="noopener noreferrer"&gt;the third largest mental health care problem globally according to the Social Anxiety Association&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;According to sources from the National Institute of Mental Health, Yale Medicine, Mental Health America, and the American Psychological Association, 12.1% of adults experience &lt;a href="https://www.mayoclinic.org/diseases-conditions/social-anxiety-disorder/symptoms-causes/syc-20353561" rel="noopener noreferrer"&gt;Social Anxiety Disorder (SAD)&lt;/a&gt; at some point in their lives. An estimated 7.1% of adults in the U.S. had SAD in the past year, which is approximately 15 million people. Of those adults with SAD in the past year, 29.9% of those people had serious impairment, and 38.8% had moderate impairment in their lives. The onset of SAD typically begins during childhood or teenage years with the median age being 13 years old.&lt;/p&gt;

&lt;p&gt;The impact on function, work, and education can limit a person's participation in society, which is exactly where deceptive patterns in consumer tech can inflict the most damage. For instance individuals with SAD are over two times more likely to be unemployed than those without the disorder. Approximately 20% os people with SAD reported declining a job offer or promotion due to social fears.&lt;/p&gt;

&lt;p&gt;Patients with SAD report greater absenteeism and reduced productivity due to social fears compared to control groups. Individuals with SAD are significantly less likely to aspire to social jobs suggesting they pre-emptively narrow their careers paths to avoid social scrutiny. SAD is consistently linked to lowered educational attainment, reduced income, and financial dependence.&lt;/p&gt;

&lt;p&gt;The presence of SAD makes people vulnerable to other issues which is exactly the vulnerability that deceptive patterns seek to exploit in people. 66% of people with SAD have one or more additional mental health disorders, most common is clinical depression. An estimated one-fifth of people with SAD also struggle with alcohol use disorder. Women are more likely to have SAD than men, 8% to 6.1% past-year prevalence in U.S. adults.&lt;/p&gt;

&lt;p&gt;Passive social media usage has been directly linked to an increase in social anxiety symptoms in some people.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fake Scarcity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Pattern:&lt;/strong&gt; Creating a false sense of limited availability of a product to pressure a user into an immediate purchase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Sources:&lt;/strong&gt; Booking and travel websites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Case:&lt;/strong&gt; You have seen them in your digital travels. Many major flight and hotel booking platforms that display messages like “Only 4 rooms left!” or “Only 2 seats remaining!” Even, “6 people are booking this flight right now!”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Deception:&lt;/strong&gt; Often, the price is not the only price or the scarcity is only for a specific, non-essential room type, for instance. The key manipulation is the weaponization of FOMO to get the user to skip comparison shopping, to get them to make a rash decision, or even review the cancellation policy. The war cry here is “Get the sale by any means necessary!”&lt;/p&gt;

&lt;h3&gt;
  
  
  Time Pressure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Pattern:&lt;/strong&gt; Usage of countdown timer or short windows of expiration that are often meaningless or reset easily, preventing rational-based decision-making.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Sources:&lt;/strong&gt; Flash sales and countdown clocks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Case:&lt;/strong&gt; A popular e-commerce site uses a platform that is the widely used platform for e-com websites. That popular e-com platform has a plugin store, and that plugin store has a plugin for flash sales. “Sale ends in 11:34:21!” that is thrown in your face, you cannot miss the component this thing has been designed by. In fact, this is a plugin that got banned from this very widely-used e-com platform's plugin store, yet they still exist as a standalone product! You can go into the (plugin, at the time) administration panel and choose to restart the timer and just restart it whenever you feel the desire to. A 24 hour flash sale could, in reality, last as long as the company wants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Deception:&lt;/strong&gt; The deal usually reappears the next day or the timer magically resets if the user refreshes the page or the user returns later. The pattern is aimed at inducing anxiety and panic, thus making the cognitive load so high, that the user clicks that buy button before they have time to consider anything about what impact buying the product will have on them financially, the necessity of having that product, or even the actual value of owning that product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confirmshaming
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Pattern:&lt;/strong&gt; Insulting the target user or guilt-tripping them into opting into a service or remaining in a subscription they don't want or a mailing list they didn't sign up for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Sources:&lt;/strong&gt; E-mail opt-outs and newsletter subscriptions and pop-ups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Case:&lt;/strong&gt; When presented with an offer (usually a pop-up) to join a newsletter, the user clicks the “No” or “Decline” option, but the next pop-up or message shown is of text that is written to make the user seem foolish, selfish, morally inferior, or even less-than. A horrible individual even.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Deception:&lt;/strong&gt; Instead of a very simple, “No thanks”, the button or message reads, “No thanks, I don't want to save money today.” or “No, I don't care about that and prefer to stay in the dark.” Some even use cartoon or animated mascots or animals shedding a tear (looking at a very prolific language-learning platform who did this in the past and your green mascot).&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;To wrap this part one of a multi-part series on deceptive patterns and the weaponization behind them, I urge people to take their time and slow down. I know in the fast-paced world our lives are a mile-a-minute kind of speed where we have things to do and get things done. There is only twenty-four hours in a day and there isn't time to stray from the course. But you &lt;strong&gt;can&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Take time out and just do your due diligence. I know it is easy for me to say. Me, the author of this article, but I have experienced this very thing myself. SAD, FOMO, being manipulated by capitalism and corporate greed, deceptive patterns. I have lived this! Take your time, put an extra 15 minutes or more aside when you need to do a task online that involved &lt;strong&gt;your money&lt;/strong&gt;. I don't let these companies take my money freely anymore. Neither should you.&lt;/p&gt;

&lt;p&gt;Noticing the signs can be the first step to minimizing the impact these deceptive patterns have on us. Educating yourselves to make the right choice and steer clear of any company using these tactics, not doing business with the companies, can have a profound effect on a person. I can attest to this. The freedom I have now to spot the pattern and stay away from that temptation is great. It does not mean I don't occasionally fall prey to it, because I still do. This is why I wrote this article and I am writing more parts to this, and why I chose to deep dive into this to educate people.&lt;/p&gt;

&lt;p&gt;Hopefully, this helps someone and we can fight these practices and learn, grow, and become aware that fighting deceptive patterns and practices can lead to better mental health, better choices, retaining our finances, and a little bit less stress, anxiety, shame, guilt, and fear in our lives. It can also show companies and corporations that the long-standing practice of eroding the general public's mental health is over and that we will not be subjected to these practices for the betterment of our lives.&lt;/p&gt;

&lt;p&gt;Hero Image Photo by &lt;a href="https://unsplash.com/@felirbe?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;@felirbe&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/man-covering-his-face-with-both-hands-BUkU-VhzW-s?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>userexperience</category>
      <category>deceptivepatterns</category>
      <category>a11y</category>
      <category>ux</category>
    </item>
    <item>
      <title>AI and Accessibility, Transforming Digital Access for People with Disabilities</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Thu, 12 Oct 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/ai-and-accessibility-transforming-digital-access-for-people-with-disabilities-2lbk</link>
      <guid>https://dev.to/colabottles/ai-and-accessibility-transforming-digital-access-for-people-with-disabilities-2lbk</guid>
      <description>&lt;h2&gt;
  
  
  The Promise of AI-Powered Accessibility
&lt;/h2&gt;

&lt;p&gt;AI has fundamentally changed what's possible in assistive technology. Machine learning models can now perform tasks that once required human intervention or were simply impossible. Screen readers have become more sophisticated, accurately interpreting complex web layouts and dynamically generated content. Image recognition allows blind users to understand visual content in real-time through their smartphones. Speech recognition has reached accuracy levels that make voice control a viable alternative to traditional input methods for people with motor disabilities.&lt;/p&gt;

&lt;p&gt;The adaptive nature of AI represents perhaps its greatest strength. These systems learn from individual users, adjusting to speech patterns, writing styles, and interaction preferences. A person with atypical speech can train voice recognition to understand them specifically. Someone with cognitive disabilities can receive content simplified to their comprehension level. The technology molds itself to the person rather than forcing the person to adapt to rigid systems.&lt;/p&gt;

&lt;p&gt;Real-time processing capabilities have opened new doors. Live captioning powered by AI makes spontaneous conversations, video calls, and streaming content accessible to deaf and hard-of-hearing individuals in ways that were previously limited to scripted, pre-captioned content. Predictive text and autocomplete features help people with dyslexia, motor impairments, or cognitive disabilities communicate more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Concerns and Limitations
&lt;/h2&gt;

&lt;p&gt;However, AI accessibility tools carry significant drawbacks that cannot be ignored. Accuracy remains inconsistent, particularly for users from marginalized groups. Voice recognition systems frequently misunderstand accents, dialects, and non-standard speech patterns. Image description algorithms often misidentify objects or miss crucial context, potentially providing misleading information to blind users who rely on these descriptions to understand their environment.&lt;/p&gt;

&lt;p&gt;The bias embedded in AI systems poses serious equity concerns. Training data often under-represents disabled people, people of color, women, and other marginalized groups. This results in systems that work better for some users than others, effectively creating a two-tiered accessibility experience. A voice assistant that struggles to understand a person with cerebral palsy or someone speaking with a strong regional accent fails at its fundamental purpose.&lt;/p&gt;

&lt;p&gt;Privacy concerns loom large. Many AI accessibility tools require constant data collection to function effectively, continuously listening, watching, or tracking user behavior. For disabled people who may have no alternative way to access certain services, this creates a coercive dynamic where privacy must be sacrificed for basic access. The data collected could reveal sensitive information about a person's disability, health conditions, or daily activities.&lt;/p&gt;

&lt;p&gt;Cost and infrastructure present additional barriers. Advanced AI tools often require expensive devices, high-speed internet connections, and ongoing subscription fees. This excludes disabled people who face higher rates of poverty and unemployment. The digital divide within the disabled community risks widening as AI-powered accessibility becomes the standard expectation.&lt;/p&gt;

&lt;p&gt;Over-reliance on AI can also lead to the neglect of fundamental accessibility principles. Companies may treat AI as a silver bullet, using it to patch inaccessible designs rather than building accessibility into products from the ground up. Automated image descriptions, for example, should supplement rather than replace proper alt text written by content creators who understand context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Long-Standing AI Accessibility Tools
&lt;/h2&gt;

&lt;p&gt;Several AI-powered accessibility tools have maintained presence for years now, demonstrating both longevity and continued evolution. &lt;a href="https://www.android.com/accessibility/live-transcribe/" rel="noopener noreferrer"&gt;Google's Live Transcribe&lt;/a&gt;, launched in 2019, uses speech recognition to provide real-time captioning on Android devices. &lt;a href="https://www.microsoft.com/en-us/garage/wall-of-fame/seeing-ai/" rel="noopener noreferrer"&gt;Microsoft's Seeing AI&lt;/a&gt;, also released in 2017, narrates the visual world for blind and low-vision users through their smartphone cameras, identifying objects, reading text, and describing scenes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/accessibility/voiceover/" rel="noopener noreferrer"&gt;Apple's VoiceOver&lt;/a&gt; screen reader has incorporated machine learning elements since at least 2019, using AI to improve image recognition and provide better descriptions of on-screen content. &lt;a href="https://www.nuance.com/dragon.html" rel="noopener noreferrer"&gt;Dragon NaturallySpeaking&lt;/a&gt;, now &lt;em&gt;Dragon Professional&lt;/em&gt;, has used various forms of AI and machine learning for speech recognition since well before 2020, continuously improving its accuracy and adaptability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://otter.ai/" rel="noopener noreferrer"&gt;Otter.ai&lt;/a&gt;, launched in 2016, provides AI-powered transcription services used by deaf and hard-of-hearing students and professionals. While primarily a transcription tool, its accessibility applications have made it valuable in educational and workplace settings. Windows' built-in voice typing and dictation features have incorporated increasingly sophisticated AI since their introduction in Windows 10.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bemyeyes.com/" rel="noopener noreferrer"&gt;Be My Eyes&lt;/a&gt; represents a particularly innovative approach to AI accessibility. Originally launched in 2015 as a platform connecting blind and low-vision users with sighted volunteers through video calls, the service evolved significantly with the introduction of its Virtual Volunteer feature in 2023. This AI-powered assistant uses advanced vision models to analyze images captured by users and answer questions about their surroundings, read labels, provide navigation guidance, and assist with countless daily tasks.&lt;/p&gt;

&lt;p&gt;The integration of AI hasn't replaced the human volunteer network but rather complements it, offering immediate assistance when volunteers aren't available or for quick queries that don't require human judgment. This hybrid model demonstrates how AI can enhance rather than eliminate human connection in accessibility services, providing both technological efficiency and the warmth of community support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact on the Disabled Community
&lt;/h2&gt;

&lt;p&gt;The impact of AI on disabled people's lives has been profound and multifaceted. For many, these tools have enabled independence that was previously difficult or impossible. A blind person can now identify currency, read handwritten notes, or navigate unfamiliar spaces with smartphone apps. Someone with severe motor impairments can control their entire digital environment through voice commands.&lt;br&gt;&lt;br&gt;
Educational access has improved dramatically. Students who struggle with traditional note-taking can use AI transcription. Those with reading disabilities benefit from text-to-speech that sounds natural rather than robotic. Language translation powered by AI helps deaf individuals who use sign language access content in spoken languages.&lt;/p&gt;

&lt;p&gt;Employment opportunities have expanded as AI tools enable disabled people to perform tasks that were once barriers to certain careers. Voice recognition allows those who cannot type to work in writing-intensive fields. Screen readers with better AI understanding enable blind programmers to navigate complex codebases more efficiently.&lt;/p&gt;

&lt;p&gt;However, the community remains divided on the net impact. Some disability advocates worry that AI perpetuates a "medical model" approach, trying to "fix" disabled people rather than addressing societal barriers. Others note that AI accessibility often focuses on individual solutions rather than pushing for universal design that benefits everyone.&lt;/p&gt;

&lt;p&gt;The rapid pace of AI development has created anxiety about being left behind. Disabled people and advocacy organizations often lack the resources to evaluate new tools, provide feedback, or influence development priorities. When AI systems are deployed without adequate testing with disabled users, the results can be frustrating or even dangerous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;The future of AI in accessibility will likely depend on how well the technology industry addresses current shortcomings. Meaningful involvement of disabled people in design and testing processes remains essential. Training data must become more representative. Privacy protections need strengthening. Business models should ensure that cost doesn't become a barrier to access.&lt;/p&gt;

&lt;p&gt;AI holds genuine potential to create a more accessible world, but only if deployed thoughtfully and ethically. The goal should not be to replace human-created accessibility or fundamental design principles, but to augment them. AI works best as one tool among many in a comprehensive approach to accessibility that centers the needs, preferences, and expertise of disabled people themselves.&lt;/p&gt;

&lt;p&gt;The conversation about AI and accessibility must continue to include the voices of those most affected. Their lived experiences provide insights that no algorithm can replicate, and their perspectives are essential for ensuring that technological progress truly serves everyone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>ux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Whataboutism</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Fri, 15 Sep 2023 14:24:52 +0000</pubDate>
      <link>https://dev.to/colabottles/whataboutism-3mj2</link>
      <guid>https://dev.to/colabottles/whataboutism-3mj2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;What about it? This doesn’t need accessibility. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The amount of ego doesn’t surprise me when the conversation of accessible code arises. Code, in any stage, from alpha all the way to production needs to be, should be, and can be made accessible. But a subset of the developer community, a rather large subset seems to think otherwise. &lt;/p&gt;

&lt;p&gt;Thinking that there is no such thing as a disabled developer is on par with thinking we are the only living organism in the entire universe. That level of ego makes part of the reason why the Web and digital world is inaccessible. Those people would rather go to the grave thinking they are right, rather than be wrong. &lt;/p&gt;

&lt;p&gt;We don’t talk about it much these days. &lt;/p&gt;

&lt;p&gt;“This product uses AI and it will ship production-ready code!” but when challenged, they (the developer subset with egoism at the forefront) come out of the woodwork to attack people and argue with people that are pointing out the fact  that is in fact a falsity.&lt;/p&gt;

&lt;p&gt;That’s just one example of why without education and research, the Web is doomed to be inaccessible even more than it already is. &lt;/p&gt;

&lt;p&gt;If those who egos aren’t checked at the door had their way, they’d ship their own computers and call it a day because, “It works on my machine!”. Hey Blaine, we’re not shipping YOUR machine. &lt;/p&gt;

&lt;p&gt;If there were less ego from those that would rather die on the cross they make for themselves then maybe, just perhaps there would be a little more accessibility in the digital world. Yet, here we are and here I am writing what I can imagine will ignite some kind of firestorm in some ecosystem of keyboard wunderkind who can’t see beyond their own screens.&lt;/p&gt;

&lt;p&gt;“Oh, I agree there needs to be accessibility but…” You ended the hate with the key word in that sentence. “But”. A “but” is an underlying statement to prove to yourselves you are correct. The reassurance that you are right and the other side of the argument is wrong no matter what the facts are or what the data is. &lt;/p&gt;

&lt;p&gt;So when an accessibility professional says, “Hey, I just wanted to bring to your attention there are issues here. Accessibility concerns you want to address before making a a statement such as…” Stop going into a defensive posture and on the attack immediately.&lt;/p&gt;

&lt;p&gt;That’s not an attack, it is someone telling you there are issues that need to be fixed to make your product, your brand, your app, your site, accessible to people with disabilities.&lt;/p&gt;

&lt;p&gt;You created something more likely to make you money. That’s how tech works isn’t it? Then why would you shut out a subset of the population for whatever reasons because you didn’t want to make it accessible? Do a search for “disposable income of disabled persons”. You’d be surprised. &lt;/p&gt;

&lt;p&gt;And to devs that wonder why it matters so. Think of these times when and if you ever become disabled because it could happen at any time to any of us.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>career</category>
      <category>webdev</category>
      <category>community</category>
    </item>
    <item>
      <title>Dear Molly</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Wed, 06 Sep 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/dear-molly-46jc</link>
      <guid>https://dev.to/colabottles/dear-molly-46jc</guid>
      <description>&lt;h2&gt;
  
  
  CW: Death
&lt;/h2&gt;

&lt;p&gt;Molly Holzschlag passed away yesterday at age 60 in Tucson, Arizona. As I sit and type and get choked up, I cannot even begin to tell you about how someone I looked to and who helped me become who I am today, meant to me, especially after corresponding with Molly the last three years. Two, with me in Arizona.&lt;/p&gt;

&lt;p&gt;I learned of Molly's passing through social media yesterday and for some reason, although we had talked and chatted since at least 2004, it has hit me harder than most passings I have been through.&lt;/p&gt;

&lt;p&gt;We had always chatted about the Web, I had interviewed Molly for the podcast, and we chatted and were friends on Facebook where we exchanged messages.&lt;/p&gt;

&lt;p&gt;I had always said to Molly, &lt;em&gt;"When I can I want to come out to Arizona and meet you and just talk about the good old days of the Web."&lt;/em&gt; and in Molly fashion we went into a dive into the good and the bad of the Web.&lt;/p&gt;

&lt;p&gt;Those were our conversations. Then I moved to Phoenix in 2021. I had got in touch and had tried unsuccessfully a few times to see Molly, but either she wasn't feeling well, it wasn't a good time for her, I respected the fact she was going through what she went through and we had cancelled a few times.&lt;/p&gt;

&lt;p&gt;When we did exchange telephone numbers and speak on the phone, I could hear the pain and said, &lt;em&gt;"It is okay. There will be another day."&lt;/em&gt; Well, there will not be another day and this makes me incredibly sad.&lt;/p&gt;

&lt;p&gt;When we had our chat for the podcast, before and after we talked about the people that she blazed the trail with. Dave Shea, Eric Meyer, Jeffrey Zeldman, and the list goes on and on. &lt;a href="https://twitter.com/mholzschlag/status/1528580765675450374?s=20" rel="noopener noreferrer"&gt;The face-to-face showdowns with Bill Gates numerous times about Internet Explorer&lt;/a&gt;, calling her "the annoying web standards girl", the conferences and speaking, and owning the stage.&lt;/p&gt;

&lt;p&gt;We discussed behind the scenes with Aaron Gustafson about reviving the Web Standards Project and wanted to do something(time permitting) starting near the end of the year or next year.&lt;/p&gt;

&lt;p&gt;If you knew Molly and knew her well, I envy you. She was a bright light and a magnum opus all her own. If you did not know Molly, or are new to the game of the Web, familiarize yourself with what Molly was able to accomplish in her lifetime that would take others countless lifetimes. We would not be here if it was not for the tour de force Molly was.&lt;/p&gt;

&lt;p&gt;Molly has been described as &lt;em&gt;"a force of nature"&lt;/em&gt; and I have to say, nature doesn't have anything on what and who Molly was and forever will be. She leaves an indelible mark on the Web.&lt;/p&gt;

&lt;p&gt;Molly was one of the first few I got the courage to converse with via comments on her site and although I never got to attend a conference she spoke at, I followed her with the fervor she had when she advocated for web standards. She taught me from far away as much as she taught me the last two years in the same state mere hours away.&lt;/p&gt;

&lt;p&gt;The world is a little less brighter, the world has lost a force never seen before and maybe never will. Molly is looking from beyond and still telling us to get our shit together. She looked death in the face and laughed. She is finally with her Ray now.&lt;/p&gt;

&lt;p&gt;Rest easy, dear Molly. Rest peacefully. ♥&lt;/p&gt;

</description>
      <category>molly</category>
      <category>godmother</category>
      <category>web</category>
      <category>life</category>
    </item>
    <item>
      <title>The Perpetual Circle of Accessibility</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Tue, 05 Sep 2023 19:15:44 +0000</pubDate>
      <link>https://dev.to/colabottles/the-perpetual-circle-of-accessibility-5df4</link>
      <guid>https://dev.to/colabottles/the-perpetual-circle-of-accessibility-5df4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zb04rxp357y86xotao6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zb04rxp357y86xotao6.jpg" alt="A man holding his glasses in his hands while rubbing the bridge of his nose in frustration." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The History
&lt;/h2&gt;

&lt;p&gt;In the time I have been practicing accessibility, whether it was behind-the-scenes in a not-so-public way of putting myself out there like I did for most of my career or whether it is like it is now with me. Writing articles, giving conference talks, appearances on podcasts and streams.&lt;/p&gt;

&lt;p&gt;The fact of the matter is this. I have had to repeat myself it seems a million times over. And over. And over it seems year after year after year since 1999. That's 24 years if you're keeping score.&lt;/p&gt;

&lt;p&gt;It is the same items of order. Low contrast of text, alternative text of images, empty buttons or input labels. Empty links and missing document language attributes.&lt;/p&gt;

&lt;p&gt;Sound familiar&amp;amp;quest; Well if it does, then you know. If it does not, then &lt;a href="https://webaim.org/projects/million/" rel="noopener noreferrer"&gt;I shall point you to the WebAIM Million Report&lt;/a&gt; which only goes back the past five years. I can tell you with conviction that I have been harping these things over and over for longer than that. Ten-plus years at least.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Question
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Why do accessibility professionals scream at us when we…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am not going to speak for the accessibility community as a whole, but if my colleagues and accessibility professionals agree, then you can bank on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We have told you over and over again. Time after time, year after year. Most of you do not listen or care enough to listen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or when you see something we post, like &lt;em&gt;"Hey, if you're doing this, please don't. Please do that."&lt;/em&gt; and then you post:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbi4y87rrehsk9dc03eq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbi4y87rrehsk9dc03eq.jpg" alt="A post about accessibility professionals not telling developers what to do when something is not done to their understanding" width="655" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you see in my reply, I have told you. I have posted on my blogs, on other sites, on message boards and in social media circles about what to do but you do not listen or you do not care enough to listen. Maybe you do?!&lt;/p&gt;

&lt;p&gt;Maybe, you care enough to actually see it, but you do not retain the information, and then when you see another post, you ask me again (yes, this happens!).&lt;/p&gt;

&lt;p&gt;I have told you. I have seen the suggestions, the tutorials, the guides on how to make something accessible without mucking it up and yet, 95-99% of the internet is &lt;em&gt;still&lt;/em&gt; inaccessible (I lean towards 99%).&lt;/p&gt;

&lt;p&gt;The reasons are your own, but when you snap back at me with "Why do you scream at us, tell us what we're doing wrong!" I have. I mean, &lt;strong&gt;I have&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;This&lt;/span&gt; &lt;span class="nt"&gt;is&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nt"&gt;cool&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is more accessible and easier to implement than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
  &lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"button"&lt;/span&gt;
  &lt;span class="nt"&gt;aria-label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"A button as a CTA"&lt;/span&gt;
  &lt;span class="nt"&gt;aria-labelledby&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"IdOfSomethingUnrelated"&lt;/span&gt;
  &lt;span class="nt"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"Do something JavaScripty()"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;This&lt;/span&gt; &lt;span class="nt"&gt;is&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="nt"&gt;disguised&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A div has no semantic meaning. More often, you see a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; as a "wrapper" in the times since HTML5. That one container to rule them all. Then you get into your HTML5 landmark elements (e.g., &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;, etc.). But I &lt;strong&gt;have&lt;/strong&gt; told you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Examples
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Please put alternative text on the image you posted on Twitter.&lt;/p&gt;

&lt;p&gt;Please use better contrast for the text on this because I cannot read it.&lt;/p&gt;

&lt;p&gt;Screen reader technology will not read a label because you have forgotten it.&lt;/p&gt;

&lt;p&gt;You are not shipping your machine. A screen reader will skip over all this.&lt;/p&gt;

&lt;p&gt;Who do you want to exclude when you make this inaccessible?&lt;/p&gt;

&lt;p&gt;Please use the button element. It is more accessible than a div.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One example: Flashing video content on the former Twitter. I asked the original poster (OP), &lt;em&gt;"Please add a content warning for people that are prone to epileptic seizures and other vestibular issues, thank you."&lt;/em&gt; Just to have some clown reply with &lt;em&gt;"Well then don't watch the video."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, it is easy for someone that is abled to say that and dismiss the disabled community with their ableism and ignorance. They do it every day online. Developers and designers included. More in the developer space than the designer space. Because &lt;em&gt;"move fast and break things"&lt;/em&gt; or &lt;em&gt;"coding is my life, here are ten reasons why you should do what I list here on Twitter."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're going to blatantly dismiss the disabled community and exclude them, then prepare for that backlash. Because it is deserve and justified. Since the internet became public and more and more disabled people try to gain access, &lt;strong&gt;you&lt;/strong&gt; are the barrier.&lt;/p&gt;

&lt;p&gt;and there are many more examples. You don't have to look too far to find them on Twitter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Burnout
&lt;/h2&gt;

&lt;p&gt;Developers will experience burnout if they are not cognizant of the amount of work they are doing. It is inevitable. Well, accessibility professionals do too. Tenfold.&lt;/p&gt;

&lt;p&gt;I'm tired. I'm burnt out. I'm sad, depressed, struggling, tired, tired, tired. I am the parent, developers and designers, and everyone at the organization(s) that I have to tell over and over again, are the child.&lt;/p&gt;

&lt;p&gt;I have scolded you, I've finger-wagged, I've publicly shamed, I have educated, I have suggested, I have done everything in my power until I am blue in the face and angry,  exhausted, and exasperated to try and get it through to you that accessibility for disabled people matters. You, most of you. The majority of you, have not listened. You don't care.&lt;/p&gt;

&lt;p&gt;I am burnt out. I'm the beyond tired parent with all the children running around wreaking havoc. I need a vacation from you but I cannot because I have got to look over you and make sure you're not burning the house down. Yet, I don't know about the small fires that have already been set around the house. Only the small fires I can see in the room I'm in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Education
&lt;/h2&gt;

&lt;p&gt;There are those that are happy to help and answer questions because they are passionate about accessibility and want a more accessible Web and a level playing field for people with disabilities. I'm always happy to say, "Here is why this isn't an accessible solution..."&lt;/p&gt;

&lt;p&gt;There are those that will virtually spat at you and block you or admonish you, or scold you, or tell you to &lt;em&gt;"fuck off"&lt;/em&gt; (Yes, this has happened to me). Whatever their personal issues, leaving those aside, they are fed up way beyond what anyone can comprehend. Because they have been repeating themselves over and over and over again.&lt;/p&gt;

&lt;p&gt;The one's that help, the helpers? Just send me a DM, or a post and ask. Or do an internet search (search engines still exist. Fewer now than when I went online, but they are there!) for the solution! If you question that, please ask!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Ask. Simply stated. Ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;There is a group of people that need a fair and equal Web, the disabled community. For decades, they have been fighting on and off the Web for equal access. Hardly anyone listens. If anyone does listen, how many of them act on that? A few.&lt;/p&gt;

&lt;p&gt;You see a post, it suggests something but doesn't explain why, but you don't use the back channels to ask. That is on &lt;strong&gt;you&lt;/strong&gt; that is not on the person that posted the suggestion without a solution. Just because you cannot see it does not mean that it is not there. It is.&lt;/p&gt;

&lt;p&gt;It is a never-ending perpetual circle of grief and pain for me that I have to look at something online and pass it by because I have said it a billion times, &lt;em&gt;"Use alternative text for your images for people who use screen reader technologies or assistive tech, please"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's the constant merry-go-round that you get spinning so fast, you jump on and spin for an hour and you feel ill and like you are going to throw up.&lt;/p&gt;

&lt;p&gt;That is the current state of accessibility. Every time someone ignores a suggestion, I get ill. Because that person doesn't care. Accessibility is a right, &lt;strong&gt;NOT&lt;/strong&gt; a privilege.&lt;/p&gt;

&lt;p&gt;That said, you wonder why we shout it out on socials? Read this article again.&lt;/p&gt;

&lt;p&gt;Hero Image Photo by &lt;a href="https://unsplash.com/@elisa_ventur?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Elisa Ventur&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/bmJAXAz6ads?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Article Heading Photo by &lt;a href="https://unsplash.com/@towfiqu999999?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Towfiqu barbhuiya&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/NwIExsCqXdM?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>html</category>
      <category>development</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Main-ly Speaking</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Thu, 24 Aug 2023 14:04:54 +0000</pubDate>
      <link>https://dev.to/colabottles/main-ly-speaking-39np</link>
      <guid>https://dev.to/colabottles/main-ly-speaking-39np</guid>
      <description>&lt;p&gt;I tweeted/posted out a half-joking question the other day about the usage of the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; tag still.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq5nwvqarc38o5pech27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq5nwvqarc38o5pech27.png" alt="A post on X that asks, " width="644" height="159"&gt;&lt;/a&gt; element to hold the content of their sites in?""/&amp;gt;&lt;/p&gt;

&lt;p&gt;Then I started a small conversation. Then I got to thinking. Why are devs not using &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; more often?&lt;/p&gt;

&lt;h2&gt;
  
  
  The "why"
&lt;/h2&gt;

&lt;p&gt;I've concluded my accessibility auditing career as of yesterday when I audited an education platform that was extremely inaccessible. The documentation was over 100 pages that I sent back to the client. That is a lot. Not the most, but it is a lot. Usually 100 pages are par for any high-level audit that I have done as a solo consultant.&lt;/p&gt;

&lt;p&gt;The fact that I saw usage of the &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; elements, yet so sign of &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; was there. The elements from HTML5 used were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; as far as the eyes could see.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakaciom2zzwhyfiq0r4k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakaciom2zzwhyfiq0r4k.jpg" alt="A man standing on a mountaintop scanning the horizon at sunrise." width="640" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I mean there was no sign of the element to be found.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdrvauq4xfsnqtves6u8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdrvauq4xfsnqtves6u8.jpg" alt="A milk carton with information about missing main elements" width="462" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The "What"
&lt;/h2&gt;

&lt;p&gt;Is it fear? I mean, I know it really isn't fear, but is it lack of education (yes) or is it lack of understanding semantic HTML and the benefits of using semantic HTML over an element that has no semantic meaning?&lt;/p&gt;

&lt;p&gt;I have seen a lot of replies when I have asked this in the past and in 25 years of asking it is usually the same repsonses:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't have time to deal with HTML.&lt;/p&gt;

&lt;p&gt;Not enough time to deal with it now.&lt;/p&gt;

&lt;p&gt;It's X framework and I can't change that. (You can if it is open source).&lt;/p&gt;

&lt;p&gt;It's habit and I just do it that way.&lt;/p&gt;

&lt;p&gt;What is semantic HTML?&lt;/p&gt;

&lt;p&gt;I'm using native apps, not hybrid/web app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are among a lot of reasons. I get it, but I got it 20 years ago. 10 years ago. 5 years ago maybe. But in 2023? Now that HTML5 has been out since 2008 (15 years ago), developers &lt;em&gt;should&lt;/em&gt; know about HTML5.&lt;/p&gt;

&lt;p&gt;Whether they know is one thing. They should. You should. Whether they care or whether you care, is another. You all should care.&lt;/p&gt;

&lt;p&gt;I mean if you're using other HTML5 elements, why omit &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;? That says to me, that whomever it may be, you're being lazy if you know and if you are uneducated about HTML5, you're not doing the research. &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; is one of those elements that is widely known.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what? Big Deal.
&lt;/h2&gt;

&lt;p&gt;These "landmarks" have an impact on accessibility. If you have ever read the bulk of my articles, they are on accessibility. Using HTML5 landmarks as they are intended is  helping out people with disabilities by making the structure of the page accessible to screen reader technology and other assistive technology(AT) e.g., keyboard navigation.&lt;/p&gt;

&lt;p&gt;When I see this when I am creating a new project in a framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=""&amp;gt;
  &amp;lt;head&amp;gt;
    ...
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id="app"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'll tend to ask when doing an accessibility audit "why aren't you using &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;?" and only if it is a web or hybrid app knowing you'd have to file an issue and ask for the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; to be changed to &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; but that isn't something I'd expect to happen but I am not opposed to it at all.&lt;/p&gt;

&lt;p&gt;What I would like to see more of is this, if applicable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=""&amp;gt;
  &amp;lt;head&amp;gt;
    ...
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;main id="app"&amp;gt;&amp;lt;/main&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Benefits
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Skip to content links. When someone using keyboard navigation or AT wants to skip repeated content, they can easily skip to the &lt;code&gt;#main&lt;/code&gt; content area.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's the fresh, new, and cool wrapper div! I'd use &lt;code&gt;&amp;lt;div id="wrapper"&amp;gt;&lt;/code&gt; a lot until 2008, then I started to use &lt;code&gt;&amp;lt;main id="wrapper"&amp;gt;&lt;/code&gt; or whatnot when using HTML5 more often in projects. It's a landmark, why not use it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reader mode looks for the &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; element as well as headings and content structure when converting the content into reader view.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; is a lot easier for maintenance and code readability. You'll be able to visually spot a &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; element much faster than a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; within a vast sea of divs in that bowl of div chowder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; could also possibly save some bytes within your files (CSS or otherwise) in that you can use &lt;code&gt;main&lt;/code&gt; in the stylesheet instead of using classes or IDs (e.g., &lt;code&gt;.main&lt;/code&gt; or &lt;code&gt;#main&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Without &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; assistive technology cannot create an accurate outline (accessibility tree) of the page's content.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;and I am sure there are more that I'm not listing, but the fact is and let's face it, if you're going to use all the other HTML5 landmarks, just use the &lt;code&gt;main&lt;/code&gt; landmark in a web or hybrid web app or if you are authoring a Web page.&lt;/p&gt;

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

&lt;p&gt;That's it. Don't be scared of &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; and if you already weren't, just use it if it is applicable in the project.&lt;/p&gt;

&lt;p&gt;If you are not sure of how to use &lt;code&gt;main&lt;/code&gt;, educate yourself. You could &lt;a href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-main-element" rel="noopener noreferrer"&gt;read the spec&lt;/a&gt; or the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main" rel="noopener noreferrer"&gt;MDN docs which should be the de facto resource&lt;/a&gt; for researching anything HTML or CSS.&lt;/p&gt;

&lt;p&gt;I get that there are cases where it is a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; and what I am saying is moot. I know that, I understand that, I got it. But...&lt;/p&gt;

&lt;p&gt;If you can use &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, get it in there and make the experience just a little more accessible.&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@filmbetrachterin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Jas Min&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/egqR_zUd4NI?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>frontend</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Is Your Community Accessible?</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Sun, 18 Jun 2023 22:55:52 +0000</pubDate>
      <link>https://dev.to/colabottles/is-your-community-accessible-464b</link>
      <guid>https://dev.to/colabottles/is-your-community-accessible-464b</guid>
      <description>&lt;p&gt;As I was writing up some talks on a couple of topics having to do with accessibility, I stopped to think for a bit about community.&lt;/p&gt;

&lt;p&gt;We are all part of some community perhaps, online as we do our jobs. Especially in developer relations and developer experience. We hang out is the Discords and Slacks, we chat on Twitter and Mastodon and other socials. We all have a tie that binds us to community to learn, to grow, to communicate.&lt;/p&gt;

&lt;p&gt;As I thought about it more I kept thinking back to "how accessible and inclusive are those communities?" and I felt the need to write about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;To the point of accessibility, how accessible is the platform of the community you are engaged in? Most of the communities we are a part of have their issues. Hell, 99% of the Web is inaccessible. Do we have a way to make it better? Indirectly we do. We ask for improvements, we file bug reports, feature requests (accessibility is not a feature), and we file pull requests.&lt;/p&gt;

&lt;p&gt;We don't have much pull perhaps when it comes to the Twitters and the other sites we log into. But we can use our voices to help improve them. If we want everyone to be able to participate, that's advocacy for the betterment of our spaces. Listen to those people that have a request and share it, spread it around. Help make those communities a little bit better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inclusion
&lt;/h2&gt;

&lt;p&gt;Which brings me to my next point, inclusion. We all want everyone to enjoy our communities (generally speaking). So we want to welcome those with open arms and make them feel like they are in a space where they can learn, thrive, and share.&lt;/p&gt;

&lt;p&gt;Let's make sure those folks are included. That also ties into accessibility. You make the person feel included, that makes the community accessible to them. If you don't have that feeling of inclusion, you make the community inaccessible. Those people that are feeling excluded won't want to be a part of a bigger thing. Period.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Part Of
&lt;/h2&gt;

&lt;p&gt;I want as many people to feel like they belong to a community as best as I can. I too, also want to feel included and have access to communities that I want to learn from.&lt;/p&gt;

&lt;p&gt;I can tell you from the experiences I have had, many online communities are welcoming and inclusive. Yes, there are those we all know about that aren't so good at being inclusive and accessible to everyone. We have the power to change that though.&lt;/p&gt;

&lt;p&gt;A great example is the Ionic Discord community. I started learning Ionic a few months ago, joined the community, and it is a very welcoming and inclusive community. I haven't been too engaging there of late, but from my brief interactions it is a terrific community. That spills over to the GitHub side and the Discourse forums as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Making folks, &lt;strong&gt;part of&lt;/strong&gt; instead of &lt;strong&gt;apart from&lt;/strong&gt; helps everyone in the long run. If you have control over your communities, make sure they are as accessible and as inclusive as they can be. If you don't have control, help make those communities accessible and inclusive.&lt;/p&gt;

&lt;p&gt;Accessibility starts with "access" and inclusive contains "us".&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@timmossholder?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Tim Mossholder&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/ZFXZ_xMYTZs?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>inclusion</category>
      <category>community</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Staying on the Course</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Sat, 03 Jun 2023 20:01:44 +0000</pubDate>
      <link>https://dev.to/colabottles/staying-on-the-course-12e5</link>
      <guid>https://dev.to/colabottles/staying-on-the-course-12e5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This comes from a place of learning and constructive comments and discussion are welcome. Let's keep it to the level that I am sort of "getting my feet wet" in the understanding of all things to do with each position and that I don't have the full length and breadth of knowledge some of you may have. Keep it civil in the comments, thanks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My latest adventure has me transitioning out of the accessibility auditing and remediation space and trying my hand at either developer relations or developer experience. Two fields I know of that have a lot of great people who speak at a lot of events on a wide range of topics.&lt;/p&gt;

&lt;p&gt;But in the final stages of a career that I have had that has lasted a quarter of a century, it's not as easy at it seems. There are a lot of things I don't know or understand yet about the two spaces I am looking to move to, I am sure. I am halfway there according to a lot of terrific people I know though.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advocacy
&lt;/h2&gt;

&lt;p&gt;I've advocated for accessibility and making things accessible for disabled people for a long time now and advocacy I get it. I understand it. That is the part that is done. I know how to work (for the most part) social media channels to spread that advocacy.&lt;/p&gt;

&lt;p&gt;Talking about it is half the battle. Getting people to understand and adopt or adapt is the other half. I have had relatively good success over the years in adapting or people adopting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminology
&lt;/h2&gt;

&lt;p&gt;What is Developer Relations? Developer Experience? Is it the same? Is it two separate entities?&lt;/p&gt;

&lt;p&gt;Let's break this into pieces.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is Developer Relations?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That, to me, is getting a product or a brand out there and setting up the collaboration between community and company.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is Developer Experience?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To me, that is the events of bringing community and company together and the experience developer have with the brand or product.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is it the same? Is it two separate entities?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To me, it is both. Confused? I'll try to explain.&lt;/p&gt;

&lt;p&gt;With all the underlying things that happens in both spaces that I may not know about, I think Developer Relations ("&lt;strong&gt;DevRel&lt;/strong&gt;" going forward) is under the umbrella of Developer Experience ("&lt;strong&gt;DX&lt;/strong&gt;" going forward). It appears to me that there are more moving parts in DX rather than DevRel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://theworst.dev/developer-experience" rel="noopener noreferrer"&gt;Kurt Kemple has a great article on their website&lt;/a&gt; about this which I wholeheartedly agree with.&lt;/p&gt;

&lt;p&gt;I'm still learning, so that is the path I am taking. The learning path to something better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Search Commences
&lt;/h2&gt;

&lt;p&gt;My 20 years of job searches concluded before the last position of an average from a spreadsheet I kept of 4 jobs from 2,643 resumes. If that was a batting average in baseball, that would be .0012 and that is the worst. that's a tenth of a percent success rate for me.&lt;/p&gt;

&lt;p&gt;So far, in my search for something outside of development/accessibility, I am 0 for 20 for DevRel or DX job applications. I knew it would be rough because the job market is rough. People are getting laid off at record paces and companies are getting rid of people for people that aren't asking for as much money. The job market sucks.&lt;/p&gt;

&lt;p&gt;It's not a good time to be looking. But I see a lot of people more so now changing roles or finding new jobs, which is promising. Maybe I can too. I got 10-12 good years left in me.&lt;/p&gt;

&lt;p&gt;The moral of this? Don't give up and stay the course. You'll find your job too if you're looking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goals
&lt;/h2&gt;

&lt;p&gt;I've set three goals for the rest of 2023. Those are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find a role in DevRel or DX,&lt;/li&gt;
&lt;li&gt;Get back to my programming roots,&lt;/li&gt;
&lt;li&gt;Find a role with a company I have had my eye on now since January.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set your goals and obtain them. I believe in myself and you should believe in yourself as well. You can do this and so can I. Even at 52 years old.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Age Thing
&lt;/h2&gt;

&lt;p&gt;It sticks with me, ageism, companies looking for younger people, and on and on. I've managed to self-teach everything I know, as well as learn from many countless people who are amazing.&lt;/p&gt;

&lt;p&gt;I also know I bring value and an intangible. Accessibility. So there should be a role somewhere where I can use that intangible. What is your intangible? Ask yourself that question. What is your thing you're known for?&lt;/p&gt;

&lt;p&gt;The age thing doesn't scare me but it does concern me. As us grey beards advanced and the finish line of retirement draws closer, I keep telling myself, "One more. There's one more role out there waiting for you to take it and succeed".&lt;/p&gt;

&lt;p&gt;I hope so. I may be 52 in years, but having come out of burnout and back into the coding and the programming and the learning and experimenting in the past two months, I feel like I'm 16 again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Whether You're New or Not...
&lt;/h2&gt;

&lt;p&gt;Stay the course. If you're in a position that you love and the company you work for treats you good, hold on, but always be looking behind you. Your job doesn't love you, and as we have seen recently, neither do the decision-makers. You, as am I, are replaceable at any given time.&lt;/p&gt;

&lt;p&gt;If you're looking around for a home, find one that your gut tells you is it, is the one (for now). A lot of people follow the money, but listen to your gut. I wish I had a time or two in the past.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you're going through Hell, keep going".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not sure where that originated, there is debate. Churchill, others? But it is apropos to what we do in tech. We get done with a company, we keep going. We go through hell at a job, we keep going until we find a good place to work. I believe there are some of these companies out there. One is the one I have my eye on for a role there this year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I jotted these things down as a reminder to myself that it's just not all about hammering away at a keyboard or spending countless hours moving pixels in Figma. It's not all about scrums and waterfalls, sprints or all-hands brainstorming meetings. It's about staying the course and making sure we are taking care of ourselves.&lt;/p&gt;

&lt;p&gt;I'm looking back on 25 years and am a little amazed how I navigated my career. When you look back, as we all do, look back and smile knowing you succeeded. I do for the most part. The majority of my time has been contracting and working for myself. Those times I did work in a company and a team were amazing and some were not so much.&lt;/p&gt;

&lt;p&gt;I've seen a lot of failure on my end and success as you will too. I've worked under some amazing people and then I have worked under some people whom I wonder if they accidentally tripped and fell into the role they are in and wonder what dumb luck it must be to fail upwards. That's tech.&lt;/p&gt;

&lt;p&gt;All I know is this. I hope to obtain the final three goals I have for this year and then assess in 2024 where I am at, if anywhere.&lt;/p&gt;

&lt;p&gt;Stop and take a look around and see where you're at. If you're succeeding, stay the course. If not, then reach inside and stay the course. You'll get there. I hope I will.&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/ja/@dmey503?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Dan Meyers&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/hluOJZjLVXc?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>discuss</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Ionic and Vue, Part Two (File Structure)</title>
      <dc:creator>Todd Libby</dc:creator>
      <pubDate>Tue, 25 Apr 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/colabottles/ionic-and-vue-part-two-3010</link>
      <guid>https://dev.to/colabottles/ionic-and-vue-part-two-3010</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foh2cl7qcx4yurkh1eu6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foh2cl7qcx4yurkh1eu6l.png" alt="The Ionic Framework logo, a blue circle enclosed in a thick blue, incomplete line with a small blue ball rotating around the center circle, next to the Vue JS logo, a V-shaped logo with a light green V and a slate grey blue smaller V sitting inside the large V-shape." width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has been a bit, but following up on the &lt;a href="https://toddl.dev/posts/ionic-and-vue-part-one/" rel="noopener noreferrer"&gt;first part&lt;/a&gt; of this series, I'm going to be diving into file structure, so pitter patter, let's get at 'er!&lt;/p&gt;

&lt;h2&gt;
  
  
  File Structure
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: This is an introductory overview and this section is from the generated files and folders from running the ionic start command. There are more folders and more comprehensive ways to set things up. This is my experience through the Ionic CLI.&lt;/p&gt;

&lt;p&gt;This also takes into consideration you have familiarity with the node_modules folder and test folder if you're testing with Jest and/or Cypress. I will be going over the testing stuff later on in this series.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  src
&lt;/h2&gt;

&lt;p&gt;This folder is where the bulk of the work will be done to create your application. This folder is where much of the work, and frankly nearly all of the work will be done in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsiz60dr8p1b4kfw3nk2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsiz60dr8p1b4kfw3nk2.png" alt="The file structure shown for a Vue and Ionic template showing files in the src folder." width="159" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  router
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;router&lt;/code&gt; folder is where all the routes are kept, added, and each route has its View component with route name. So the &lt;code&gt;index.ts&lt;/code&gt; file will point to the &lt;code&gt;HomePage.vue&lt;/code&gt; file. The route points to the HomePage view.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Home&lt;/code&gt; route is defined as the default path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import HomePage from '../views/HomePage.vue'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  theme
&lt;/h2&gt;

&lt;p&gt;This is the folder that holds the stylesheets for your project. You can &lt;a href="https://ionicframework.com/docs/theming/basics" rel="noopener noreferrer"&gt;find out more about theming&lt;/a&gt; from the Ionic docs here.&lt;/p&gt;

&lt;p&gt;Global theming for the project can be defined here, Ionic has such names as &lt;code&gt;success&lt;/code&gt;, &lt;code&gt;danger&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt;, and more for colors for different elements in the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  views
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;views&lt;/code&gt; folder is what is render for what page. &lt;code&gt;HomePage.vue&lt;/code&gt; is rendered when the &lt;code&gt;Home&lt;/code&gt; route is defined in the &lt;code&gt;index.ts&lt;/code&gt; file. The same would be for &lt;code&gt;ContactPage.vue&lt;/code&gt;, &lt;code&gt;AboutPage.vue&lt;/code&gt;, and others.&lt;/p&gt;

&lt;p&gt;The home page code looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;ion-page&amp;gt;
    &amp;lt;ion-header :translucent="true"&amp;gt;
      &amp;lt;ion-toolbar&amp;gt;
        &amp;lt;ion-title&amp;gt;Blank&amp;lt;/ion-title&amp;gt;
      &amp;lt;/ion-toolbar&amp;gt;
    &amp;lt;/ion-header&amp;gt;

    &amp;lt;ion-content :fullscreen="true"&amp;gt;
      &amp;lt;ion-header collapse="condense"&amp;gt;
        &amp;lt;ion-toolbar&amp;gt;
          &amp;lt;ion-title size="large"&amp;gt;Blank&amp;lt;/ion-title&amp;gt;
        &amp;lt;/ion-toolbar&amp;gt;
      &amp;lt;/ion-header&amp;gt;

      &amp;lt;div id="container"&amp;gt;
        &amp;lt;strong&amp;gt;Ready to create an app?&amp;lt;/strong&amp;gt;
        &amp;lt;p&amp;gt;Start with Ionic
          &amp;lt;a
          target="_blank"
          rel="noopener noreferrer"
          href="https://ionicframework.com/docs/components"&amp;gt;
          UI Components
          &amp;lt;/a&amp;gt;
        &amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/ion-content&amp;gt;
  &amp;lt;/ion-page&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup lang="ts"&amp;gt;
import { 
  IonContent, 
  IonHeader, 
  IonPage, 
  IonTitle, 
  IonToolbar 
} from '@ionic/vue';
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
#container {
  text-align: center;
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
}

#container strong {
  font-size: 20px;
  line-height: 26px;
}

#container p {
  font-size: 16px;
  line-height: 22px;
  color: #8c8c8c;
  margin: 0;
}

#container a {
  text-decoration: none;
}
&amp;lt;/style&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I won't go into the specifics here until another installment of this series, but it won't be too long before I dive into that part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Again, this was a very high-level overview of the file structure of the Ionic/Vue application and the major parts of the folder structure.&lt;/p&gt;

&lt;p&gt;I'll get more into the deeper parts of the template files, router, and more later in the series.&lt;/p&gt;

</description>
      <category>ionic</category>
      <category>vue</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
