<?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: Marian</title>
    <description>The latest articles on DEV Community by Marian (@dudychmarian).</description>
    <link>https://dev.to/dudychmarian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F742549%2F853fa4b0-eb2b-4708-a5d5-b3f42537c5fc.jpeg</url>
      <title>DEV Community: Marian</title>
      <link>https://dev.to/dudychmarian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dudychmarian"/>
    <language>en</language>
    <item>
      <title>What Is Semantic HTML and Why Does It Matter?</title>
      <dc:creator>Marian</dc:creator>
      <pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/dudychmarian/what-is-semantic-html-and-why-does-it-matter-4gl0</link>
      <guid>https://dev.to/dudychmarian/what-is-semantic-html-and-why-does-it-matter-4gl0</guid>
      <description>&lt;p&gt;Early in my career I wrote a lot of &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; soup. Everything was a div. The header was a div. The nav was a div. The sidebar was a div with a class called &lt;code&gt;sidebar-right-wrapper&lt;/code&gt; because apparently I needed two words to describe something that could have just been an &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It worked. Browsers are incredibly forgiving. But a senior dev on one of my first real projects pulled up my markup in a code review and said something that stuck with me: &lt;em&gt;"Would a screen reader have any idea what's going on here?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I didn't have a good answer. That's when I actually learned semantic HTML — not the definition, but why it matters in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's more than just "best practice"
&lt;/h2&gt;

&lt;p&gt;When people say semantic HTML is a best practice, it sounds like one of those things you're supposed to do but nobody actually enforces. In reality there are three concrete reasons it affects real users and real outcomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility.&lt;/strong&gt; Screen readers navigate by semantic landmarks. A &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; element lets a blind user jump straight to navigation. A proper heading hierarchy lets them scan the document outline the same way a sighted user skims visually. Without those landmarks, the page is just one long wall of text read top to bottom.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://webaim.org/projects/million/" rel="noopener noreferrer"&gt;WebAIM Million report&lt;/a&gt; audits the top million websites every year. Every year, over 95% of home pages have detectable accessibility failures, and missing or incorrect semantic structure is always near the top. That's not a niche edge case — that's most of the web failing a basic test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEO.&lt;/strong&gt; I'm always cautious about SEO claims because a lot of them are snake oil. This one isn't. Search crawlers parse your HTML to understand what a page is about. A &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; element tells Google where the actual content starts. &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt; signals a standalone piece worth indexing independently. Heading tags communicate hierarchy and topic structure. None of this is magic, but it removes ambiguity for crawlers — and less ambiguity generally means better indexing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintainability.&lt;/strong&gt; Honestly, this is the one I care about most day to day. &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; is just faster to read than &lt;code&gt;&amp;lt;div class="page-header-outer-wrapper"&amp;gt;&lt;/code&gt;. When I open a codebase I haven't touched in a year, semantic structure tells me what's going on without me having to trace CSS class names back to some stylesheet. Future-me always appreciates past-me using the right tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tags I actually use regularly
&lt;/h2&gt;

&lt;p&gt;I'm not going to list every HTML5 semantic element — &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" rel="noopener noreferrer"&gt;MDN does that better than I ever could&lt;/a&gt;. These are the ones that come up in almost every project.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Not just for the top of the page. A &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; inside an &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt; is completely valid — it's the introductory part of that article, not the site header. I use it for both.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Dudych Blog&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The mistake I see most often: people treat &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; as a singleton, like there can only be one per page. There can be multiple. Each semantic section can have its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;One per page. Just one. It wraps the primary content — the stuff that's unique to this page and not repeated elsewhere. Your site-wide nav doesn't go in here. Your newsletter form that appears on every page doesn't go in here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- the actual post --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;This is also useful for accessibility — screen readers have a "jump to main content" shortcut that relies on this element existing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt; vs &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; — the one that trips everyone up
&lt;/h3&gt;

&lt;p&gt;These two cause more confusion than anything else. The distinction I use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you lift this content out, drop it on a completely different site, and have it still make sense?&lt;/strong&gt; If yes, it's an &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;. Blog posts, news articles, product cards, comments — all articles.&lt;/p&gt;

&lt;p&gt;If no — if it's a thematic chunk of &lt;em&gt;this&lt;/em&gt; page that doesn't stand on its own — it's a &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you can't even give it a meaningful name, it's a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Makes sense on another site entirely?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Named section that belongs to this page?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Just a layout container with no semantic meaning?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- A blog post listing --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;What Is Semantic HTML?&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;time&lt;/span&gt; &lt;span class="na"&gt;datetime=&lt;/span&gt;&lt;span class="s"&gt;"2026-03-07"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;March 7, 2026&lt;span class="nt"&gt;&amp;lt;/time&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Content...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- A section within a longer article --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Why It Matters&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tangentially related content. Sidebars, pull quotes, author bios, related posts. The key word is &lt;em&gt;tangentially&lt;/em&gt; — if the content is important to understanding the main article, it probably shouldn't be an &lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Navigation links. Not &lt;em&gt;all&lt;/em&gt; link groups — just the ones that constitute actual navigation. The main menu, yes. Breadcrumbs, yes. The three links in the footer (home, privacy policy, copyright)? Probably not worth wrapping in &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you have multiple &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; elements on a page, add &lt;code&gt;aria-label&lt;/code&gt; to distinguish them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Main navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Post pagination"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt; — the underrated one
&lt;/h3&gt;

&lt;p&gt;Nobody talks about this tag enough. Every date on your site should be in a &lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt; element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;time&lt;/span&gt; &lt;span class="na"&gt;datetime=&lt;/span&gt;&lt;span class="s"&gt;"2026-03-07T08:00:00Z"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;March 7, 2026&lt;span class="nt"&gt;&amp;lt;/time&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;datetime&lt;/code&gt; attribute gives machines an unambiguous timestamp. The text content stays human-readable in whatever format you want. Search engines use this for rich results. Screen readers use it to announce dates correctly. Takes five seconds to add. Worth it every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a properly structured page looks like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;What Is Semantic HTML? | Dudych Blog&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Main navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/blog"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Blog&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;What Is Semantic HTML and Why Does It Matter?&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
            By Marian Dudych ·
            &lt;span class="nt"&gt;&amp;lt;time&lt;/span&gt; &lt;span class="na"&gt;datetime=&lt;/span&gt;&lt;span class="s"&gt;"2026-03-07"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;March 7, 2026&lt;span class="nt"&gt;&amp;lt;/time&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Why It Matters&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;The Tags You Should Know&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Filed under: HTML, Accessibility&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;aside&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Related Posts&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;© 2026 Dudych Blog&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Notice the &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; nested inside &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;. Completely valid. The article header contains the title and byline. The article footer contains tags and metadata. It reads exactly like what it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing I see wrong most often
&lt;/h2&gt;

&lt;p&gt;Using semantic tags for their visual side effects rather than their meaning.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;blockquote&amp;gt;&lt;/code&gt; to indent arbitrary text. &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; to shift content left. &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt; because "that's about the right font size." I've done all of these. They're wrong.&lt;/p&gt;

&lt;p&gt;The browser's default rendering of semantic elements is a side effect, not the point. CSS handles visuals. HTML handles meaning. The moment you pick a tag based on how it looks in a browser without styles, you've introduced a bug — it's just a bug that doesn't throw an error.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A test I find useful: disable all CSS on the page. Does the document still communicate its structure clearly? Can you tell what's a heading, what's navigation, what's the main content? If yes, you're in good shape.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A checklist before I ship
&lt;/h2&gt;

&lt;p&gt;I don't always run through this explicitly, but it's what I'm checking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; per page, contains only page-specific content&lt;/li&gt;
&lt;li&gt;Heading hierarchy is sequential — no jumping from &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dates are in &lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt; elements with &lt;code&gt;datetime&lt;/code&gt; attributes&lt;/li&gt;
&lt;li&gt;Standalone content is in &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, thematic sections in &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Multiple &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; elements have &lt;code&gt;aria-label&lt;/code&gt; attributes&lt;/li&gt;
&lt;li&gt;No tag chosen for its visual appearance rather than its meaning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Worth learning properly
&lt;/h2&gt;

&lt;p&gt;This is one of those fundamentals that has an outsized return on investment. A few hours spent actually understanding the element spec pays off every time you write markup — better accessibility, better SEO, cleaner code.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" rel="noopener noreferrer"&gt;MDN HTML elements reference&lt;/a&gt; is where I go when I'm not sure about a specific element. The &lt;a href="https://html.spec.whatwg.org/multipage/sections.html" rel="noopener noreferrer"&gt;HTML Living Standard&lt;/a&gt; is more exhaustive if you want the full picture.&lt;/p&gt;

&lt;p&gt;Start with &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;. Get those right consistently and you're already ahead of most of the web.&lt;/p&gt;

&lt;p&gt;Originally posted here: &lt;a href="https://dudych.com/blog/what-is-semantic-html-and-why-does-it-matter" rel="noopener noreferrer"&gt;https://dudych.com/blog/what-is-semantic-html-and-why-does-it-matter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>a11y</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Is Your Email Already Compromised? How to Check in 30 Seconds</title>
      <dc:creator>Marian</dc:creator>
      <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/dudychmarian/is-your-email-already-compromised-how-to-check-in-30-seconds-46g5</link>
      <guid>https://dev.to/dudychmarian/is-your-email-already-compromised-how-to-check-in-30-seconds-46g5</guid>
      <description>&lt;p&gt;Most people find out their email was hacked the hard way — a suspicious login, a friend asking why you sent them a weird link, or a bank notification at 2am. But there's a good chance your credentials are already floating around on some hacker forum right now, and you have no idea.&lt;/p&gt;

&lt;p&gt;Here's how to check in under a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tool: Have I Been Pwned
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://haveibeenpwned.com" rel="noopener noreferrer"&gt;haveibeenpwned.com&lt;/a&gt; is a free service built by security researcher Troy Hunt. It maintains a massive database of email addresses and passwords that have been exposed in known data breaches — the kind that get dumped on hacker forums in batches of hundreds of thousands.&lt;/p&gt;

&lt;p&gt;The logic is simple: when a company gets breached, the stolen data almost always ends up publicly posted somewhere. Troy's team collects those dumps and indexes them so you can check if your email is in there.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Check
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://haveibeenpwned.com" rel="noopener noreferrer"&gt;haveibeenpwned.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Enter your email address&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;pwned?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll get one of two results:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 Bad news&lt;/strong&gt; — your email shows up in one or more breaches. The site tells you exactly which ones (LinkedIn, Adobe, Dropbox, etc.) and what data was exposed (passwords, usernames, phone numbers).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🟢 Good news&lt;/strong&gt; — &lt;em&gt;"Good news — no pwnage found!"&lt;/em&gt; Your email isn't in their database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Celebrate Too Early
&lt;/h2&gt;

&lt;p&gt;Here's the thing — a clean result doesn't mean you're safe. It just means your email hasn't shown up in a &lt;em&gt;known, public&lt;/em&gt; breach yet. There are plenty of breaches that never get published, credentials sold privately on the dark web, or leaks that haven't been indexed yet.&lt;/p&gt;

&lt;p&gt;You might already be compromised and just not know it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do If You're Pwned
&lt;/h2&gt;

&lt;p&gt;If your email shows up, don't panic — but do act fast:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Change your password immediately&lt;/strong&gt; on the breached service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change it everywhere else&lt;/strong&gt; where you used the same password (yes, all of them)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable 2FA&lt;/strong&gt; on your email and any important accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a password manager&lt;/strong&gt; — &lt;a href="https://bitwarden.com" rel="noopener noreferrer"&gt;Bitwarden&lt;/a&gt; is free and open source (My Choice)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The real danger isn't the breached site itself — it's credential stuffing. Hackers take your leaked email + password combo and automatically try it on hundreds of other sites (Gmail, Facebook, your bank). If you reuse passwords, one breach becomes every breach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth About Passwords
&lt;/h2&gt;

&lt;p&gt;If you're using the same password on more than one site, you're not securing your accounts — you're just hoping the weakest site in your list never gets breached.&lt;/p&gt;

&lt;p&gt;Spoiler: it will.&lt;/p&gt;

&lt;p&gt;Check your email now. It takes 30 seconds, and you might be very glad you did.&lt;/p&gt;

&lt;p&gt;Originally posted here: &lt;a href="https://dudych.com/blog/is-your-email-already-compromised-how-to-check-in-30-seconds" rel="noopener noreferrer"&gt;https://dudych.com/blog/is-your-email-already-compromised-how-to-check-in-30-seconds&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>privacy</category>
      <category>email</category>
      <category>password</category>
    </item>
    <item>
      <title>NPM vs Yarn vs pnpm vs Bun: Which Package Manager Should You Use in 2026?</title>
      <dc:creator>Marian</dc:creator>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/dudychmarian/npm-vs-yarn-vs-pnpm-vs-bun-which-package-manager-should-you-use-in-2026-3j2o</link>
      <guid>https://dev.to/dudychmarian/npm-vs-yarn-vs-pnpm-vs-bun-which-package-manager-should-you-use-in-2026-3j2o</guid>
      <description>&lt;p&gt;Every JavaScript project starts the same way: you need to install dependencies. But in 2026, you have four serious options — and the choice matters more than most people admit.&lt;/p&gt;

&lt;p&gt;I've shipped projects with all four. Here's my honest breakdown so you can pick one and stop second-guessing yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quick Answer
&lt;/h2&gt;

&lt;p&gt;If you just want a recommendation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🆕 &lt;strong&gt;Starting a new project?&lt;/strong&gt; → &lt;a href="https://pnpm.io" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt; or &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🏢 &lt;strong&gt;Working on an existing codebase?&lt;/strong&gt; → Stick with whatever it already uses&lt;/li&gt;
&lt;li&gt;🗂️ &lt;strong&gt;In a large monorepo?&lt;/strong&gt; → &lt;a href="https://pnpm.io/workspaces" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt; — nothing else comes close&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Want the absolute fastest installs?&lt;/strong&gt; → &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤷 &lt;strong&gt;Don't want to think about it?&lt;/strong&gt; → &lt;a href="https://www.npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt; is fine, really&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  npm — The One That Ships with Node
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt; comes pre-installed with &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;, which is both its biggest strength and the reason people take it for granted. It's everywhere — every tutorial, every CI pipeline, every Dockerfile you've ever copy-pasted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
npm &lt;span class="nb"&gt;install &lt;/span&gt;lodash

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

&lt;/div&gt;



&lt;p&gt;The problem? npm was notoriously slow for years, and it still writes a flat &lt;code&gt;node_modules&lt;/code&gt; folder that grows to terrifying sizes. The &lt;code&gt;node_modules&lt;/code&gt; meme exists because of npm.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 It's gotten much better since v7 (workspaces) and v9 (performance improvements), but it's still the slowest of the four when you benchmark a cold install.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Who should use it:&lt;/strong&gt; Beginners, solo projects, or situations where you genuinely can't add tooling. Otherwise, there are better options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yarn — The Veteran Challenger
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://yarnpkg.com" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt; was created by Facebook in 2016 specifically to fix npm's problems — mainly speed and reliability. It introduced &lt;code&gt;yarn.lock&lt;/code&gt;, parallel installs, and a notably nicer CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn &lt;span class="nb"&gt;install
&lt;/span&gt;yarn dev
yarn add lodash

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Yarn Classic (v1)&lt;/strong&gt; is still widely used and battle-tested — you'll find it in countless large open source projects. &lt;strong&gt;&lt;a href="https://yarnpkg.com/getting-started/migration" rel="noopener noreferrer"&gt;Yarn Berry (v2+)&lt;/a&gt;&lt;/strong&gt; is a complete rewrite with a radical feature called &lt;strong&gt;Plug'n'Play (PnP)&lt;/strong&gt; — it eliminates &lt;code&gt;node_modules&lt;/code&gt; entirely and resolves dependencies from a single &lt;code&gt;.pnp.cjs&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;I tried Yarn Berry on a project in 2022. The speed was impressive. The compatibility headaches with tools that assume &lt;code&gt;node_modules&lt;/code&gt; exists were... less impressive. Your mileage may vary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who should use it:&lt;/strong&gt; Teams already using it, or developers who want to experiment with PnP on a greenfield project with modern tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  pnpm — My Daily Driver
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pnpm.io" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt; is what npm should have been from the start. Instead of copying packages into every project's &lt;code&gt;node_modules&lt;/code&gt;, pnpm stores everything in a &lt;strong&gt;global content-addressable store&lt;/strong&gt; and uses hard links. Install &lt;code&gt;lodash&lt;/code&gt; in 10 projects — it only exists on disk once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev
pnpm add lodash

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

&lt;/div&gt;



&lt;p&gt;The structure looks 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;my-project/
  node_modules/
    .pnpm/ ← actual packages, stored as hard links
    lodash → .pnpm/lodash@4.17.21/node_modules/lodash

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

&lt;/div&gt;



&lt;p&gt;The results are real. On my MacBook, switching a large project from npm to pnpm cut install time by ~60% and freed up several gigabytes of disk space. If you've ever run &lt;a href="https://github.com/voidcosmos/npkill" rel="noopener noreferrer"&gt;&lt;code&gt;npx npkill&lt;/code&gt;&lt;/a&gt; and been horrified by how much space &lt;code&gt;node_modules&lt;/code&gt; was eating — pnpm solves that problem permanently.&lt;/p&gt;

&lt;p&gt;It also enforces &lt;strong&gt;strict dependency isolation&lt;/strong&gt; — you can't accidentally use a package you didn't explicitly declare. This has already caught implicit dependency bugs on two of my projects that would have caused subtle production issues.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🏆 This blog is built with pnpm. I switched from npm about two years ago and haven't looked back.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Who should use it:&lt;/strong&gt; Anyone starting a new project, monorepo teams, and developers who are serious about disk efficiency and dependency correctness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bun — The Exciting New Arrival
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; isn't just a package manager — it's an entire JavaScript runtime (like Node.js), bundler, test runner, and package manager in one. Written in &lt;a href="https://ziglang.org" rel="noopener noreferrer"&gt;Zig&lt;/a&gt;, it's engineered from the ground up for raw speed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bun &lt;span class="nb"&gt;install
&lt;/span&gt;bun dev
bun add lodash

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

&lt;/div&gt;



&lt;p&gt;The first time I ran &lt;code&gt;bun install&lt;/code&gt; on a large Next.js project, I genuinely thought something had gone wrong. It finished before the terminal had even scrolled. Installs that take 30+ seconds with npm can take under 3 seconds with Bun.&lt;/p&gt;

&lt;p&gt;It has its own lockfile (&lt;code&gt;bun.lockb&lt;/code&gt;) and is mostly compatible with the npm registry and existing &lt;code&gt;package.json&lt;/code&gt; files. The trade-off is maturity — edge cases and occasional compatibility issues still surface, especially with packages that rely on native Node.js internals.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚀 Bun is moving incredibly fast. Check the &lt;a href="https://bun.sh/blog" rel="noopener noreferrer"&gt;Bun changelog&lt;/a&gt; — major improvements ship almost every month.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Who should use it:&lt;/strong&gt; New projects where you want maximum speed and don't mind the occasional rough edge. Increasingly safe for production in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-Head Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://yarnpkg.com" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://pnpm.io" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Install speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🐢 Slow&lt;/td&gt;
&lt;td&gt;🚶 Medium&lt;/td&gt;
&lt;td&gt;🏃 Fast&lt;/td&gt;
&lt;td&gt;⚡ Fastest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disk usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;node_modules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flat&lt;/td&gt;
&lt;td&gt;Flat / PnP&lt;/td&gt;
&lt;td&gt;Linked&lt;/td&gt;
&lt;td&gt;Flat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monorepo support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lockfile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;package-lock.json&lt;/td&gt;
&lt;td&gt;yarn.lock&lt;/td&gt;
&lt;td&gt;pnpm-lock.yaml&lt;/td&gt;
&lt;td&gt;bun.lockb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maturity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very mature&lt;/td&gt;
&lt;td&gt;Mature&lt;/td&gt;
&lt;td&gt;Mature&lt;/td&gt;
&lt;td&gt;Newer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standalone runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The node_modules Problem, Visualised
&lt;/h2&gt;

&lt;p&gt;All four managers (except Yarn Berry with PnP) create a &lt;code&gt;node_modules&lt;/code&gt; folder. The difference is &lt;em&gt;how&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm / Yarn Classic&lt;/strong&gt; — copies everything. 10 projects means 10 full copies of React on your disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pnpm&lt;/strong&gt; — hard links from a global store. 10 projects, 1 copy of React&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bun&lt;/strong&gt; — similar global cache approach, comparably disk-efficient&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever cleaned up old projects with &lt;code&gt;npx npkill&lt;/code&gt; and freed 20GB in one go — pnpm prevents that accumulation from happening in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Actually Use
&lt;/h2&gt;

&lt;p&gt;This blog uses &lt;strong&gt;pnpm&lt;/strong&gt;. It's fast, saves disk space, and the strict dependency isolation has already prevented real bugs.&lt;/p&gt;

&lt;p&gt;If I were starting fresh today with no constraints, I'd take a hard look at &lt;strong&gt;Bun&lt;/strong&gt; — the speed is difficult to argue against, and the ecosystem compatibility story gets better with every release.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Bottom Line
&lt;/h2&gt;

&lt;p&gt;Don't lose sleep over this. The best package manager is the one your team already uses &lt;em&gt;consistently&lt;/em&gt;. Mixing package managers in one project — some devs on npm, others on Yarn — causes far more pain than any performance gap between them.&lt;/p&gt;

&lt;p&gt;That said, if you have the freedom to choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pragmatic pick&lt;/strong&gt; → &lt;a href="https://pnpm.io" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exciting pick&lt;/strong&gt; → &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe default&lt;/strong&gt; → &lt;a href="https://npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick one. Commit to it. Then focus on actually building things.&lt;/p&gt;

&lt;p&gt;Originally posted here: &lt;a href="https://dudych.com/blog/npm-vs-yarn-vs-pnpm-vs-bun-which-package-manager-should-you-use-in-2026" rel="noopener noreferrer"&gt;https://dudych.com/blog/npm-vs-yarn-vs-pnpm-vs-bun-which-package-manager-should-you-use-in-2026&lt;/a&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
