<?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.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>How I Transformed VS Code Into a Cozy, Minimalist Workspace (Full Setup Guide)</title>
      <dc:creator>Marian</dc:creator>
      <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/dudychmarian/how-i-transformed-vs-code-into-a-cozy-minimalist-workspace-full-setup-guide-id</link>
      <guid>https://dev.to/dudychmarian/how-i-transformed-vs-code-into-a-cozy-minimalist-workspace-full-setup-guide-id</guid>
      <description>&lt;p&gt;If you've ever opened VS Code and felt like you were staring at the cockpit of a spaceship - activity bars, status bars, breadcrumbs, line numbers, a minimap, sidebars - you're not alone. Out of the box, VS Code is &lt;em&gt;powerful&lt;/em&gt;, but it can also feel really cluttered, especially when all you want to do is sit down and write some code.&lt;/p&gt;

&lt;p&gt;I've been tweaking my setup for a while now, and I finally landed on something that feels genuinely calm and focused. No unnecessary noise. Just the code, a nice font, and (okay, a little pet running around in the sidebar). In this post, I'm going to walk you through my exact setup - step by step - so you can recreate it yourself, even if you're fairly new to VS Code.&lt;/p&gt;

&lt;p&gt;By the end of this guide, you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clean, distraction-free editor layout&lt;/li&gt;
&lt;li&gt;A beautiful minimal theme and icon pack&lt;/li&gt;
&lt;li&gt;A set of must-have extensions&lt;/li&gt;
&lt;li&gt;My full &lt;code&gt;settings.json&lt;/code&gt; you can copy and paste in 30 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Starting With (And Where We're Going)
&lt;/h2&gt;

&lt;p&gt;Here's the thing: the default VS Code UI isn't &lt;em&gt;bad&lt;/em&gt;, it's just designed to show everything at once. For beginners, that's actually helpful - you can see all the buttons and options. But once you know where things are, a lot of that UI becomes visual noise.&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%2Foijj9b2oeg3u5i170g72.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%2Foijj9b2oeg3u5i170g72.png" alt="Standard VS Code preview" width="800" height="533"&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%2Fdudych.com%2Fimages%2F20260306175528.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%2Fdudych.com%2Fimages%2F20260306175528.png" alt="Clean minimalist VS Code setup" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The transformation is pretty dramatic. And the best part? You're not &lt;em&gt;removing&lt;/em&gt; functionality. Everything is still there. You're just hiding what you don't need on a day-to-day basis, so you can focus on what actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Open Your settings.json File
&lt;/h2&gt;

&lt;p&gt;Everything in this guide lives in a single file called &lt;code&gt;settings.json&lt;/code&gt;. This is VS Code's main config file, and editing it is the fastest way to customize your entire editor.&lt;/p&gt;

&lt;p&gt;Here's how to open it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Mac:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Cmd + Shift + P&lt;/code&gt; to open the Command Palette&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;Open User Settings (JSON)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the result - it looks like &lt;code&gt;Preferences: Open User Settings (JSON)&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;On Windows/Linux:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + Shift + P&lt;/code&gt; to open the Command Palette&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;Open User Settings (JSON)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the result&lt;/li&gt;
&lt;/ol&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%2Furyu2cc5895h8kqon1i8.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%2Furyu2cc5895h8kqon1i8.png" alt="Screenshot of Command Palette with " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll see a file that 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;{
  "editor.fontSize": 14,
  "workbench.colorTheme": "Default Dark+"
}

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

&lt;/div&gt;



&lt;p&gt;This is where all your configuration lives. Throughout this guide, I'll be showing you settings to add or update here. At the very bottom of the post, you'll find my &lt;strong&gt;complete settings.json&lt;/strong&gt; that you can copy and paste all at once if you prefer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install a Beautiful Font
&lt;/h2&gt;

&lt;p&gt;One of the biggest upgrades you can make to your coding experience is switching to a better monospace font. The default VS Code font is fine, but it's not &lt;em&gt;inspiring&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Brass Mono (My Pick)
&lt;/h3&gt;

&lt;p&gt;Brass Mono is the font I currently use. It's clean, well-spaced, and has a slightly warm, organic feel to it - very different from the cold, technical look of most coding fonts. It makes long coding sessions way more comfortable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download it here:&lt;/strong&gt; &lt;a href="https://github.com/fonsecapeter/brass_mono" rel="noopener noreferrer"&gt;github.com/fonsecapeter/brass_mono&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%2Fgithub.com%2Ffonsecapeter%2Fbrass_mono%2Fraw%2Fmain%2Fdocumentation%2Fsample.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%2Fgithub.com%2Ffonsecapeter%2Fbrass_mono%2Fraw%2Fmain%2Fdocumentation%2Fsample.png" alt="Brass Mono font preview" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: Fira Code (Great if You Want Ligatures)
&lt;/h3&gt;

&lt;p&gt;If you want &lt;strong&gt;font ligatures&lt;/strong&gt; - where symbols like &lt;code&gt;=&amp;gt;&lt;/code&gt;, &lt;code&gt;!==&lt;/code&gt;, and &lt;code&gt;-&amp;gt;&lt;/code&gt; merge into a single, cleaner glyph - then Fira Code is an excellent choice. It's one of the most popular coding fonts in the world for a reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download it here:&lt;/strong&gt; &lt;a href="https://github.com/tonsky/FiraCode" rel="noopener noreferrer"&gt;github.com/tonsky/FiraCode&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%2Fgithub.com%2Ftonsky%2FFiraCode%2Fraw%2Fmaster%2Fextras%2Flogo.svg" 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%2Fgithub.com%2Ftonsky%2FFiraCode%2Fraw%2Fmaster%2Fextras%2Flogo.svg" alt="Fira Code font preview with ligatures" width="1764" height="1008"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Install a Font
&lt;/h3&gt;

&lt;p&gt;Once you've downloaded your chosen font:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unzip the downloaded file&lt;/li&gt;
&lt;li&gt;Open the font file (usually a &lt;code&gt;.ttf&lt;/code&gt; or &lt;code&gt;.otf&lt;/code&gt; file)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Install&lt;/strong&gt; (Mac will show a Font Book preview; Windows shows an Install button)&lt;/li&gt;
&lt;li&gt;Restart VS Code so it picks up the new font&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then add this to your &lt;code&gt;settings.json&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;"editor.fontFamily": "Brass Mono, monospace",
"editor.fontSize": 14,
"editor.lineHeight": 1.6,
"editor.letterSpacing": 0.3

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; The &lt;code&gt;lineHeight: 1.6&lt;/code&gt; setting is underrated. It adds a little breathing room between lines of code, which makes it much easier to read at a glance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3: Install a Minimal Theme
&lt;/h2&gt;

&lt;p&gt;The theme controls the colors of everything - your syntax highlighting, background, sidebar, and more. I use &lt;strong&gt;Min Theme&lt;/strong&gt; , which is exactly what it sounds like: minimal, clean, and available in both dark and light variants.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Min Theme
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the Extensions panel with &lt;code&gt;Cmd/Ctrl + Shift + X&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Min Theme&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click Install&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Cmd/Ctrl + K&lt;/code&gt;, then &lt;code&gt;Cmd/Ctrl + T&lt;/code&gt; to open the theme picker&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Min Dark&lt;/strong&gt; or &lt;strong&gt;Min Light&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or add this to your &lt;code&gt;settings.json&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;"workbench.colorTheme": "Min Dark"

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

&lt;/div&gt;



&lt;p&gt;That said - theme is 100% personal preference. If you have one you love already, keep it! The rest of this guide will still apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Install a Minimal Icon Pack
&lt;/h2&gt;

&lt;p&gt;The file icons in VS Code's sidebar make it easier to tell files apart at a glance. The default icons are okay, but &lt;strong&gt;Symbols&lt;/strong&gt; is a much cleaner option - simple, monochrome shapes that don't fight for attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Symbols
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Extensions: &lt;code&gt;Cmd/Ctrl + Shift + X&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Symbols&lt;/strong&gt; (by Miguel Solorio)&lt;/li&gt;
&lt;li&gt;Click Install&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then add to &lt;code&gt;settings.json&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;"workbench.iconTheme": "symbols"

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Clean Up the UI Layout
&lt;/h2&gt;

&lt;p&gt;This is the core of the minimalist transformation. We're going to hide a bunch of UI chrome that you probably haven't thought about much, but that's quietly adding clutter to your editor every single day.&lt;/p&gt;

&lt;p&gt;Here's what we're hiding and why:&lt;/p&gt;

&lt;h3&gt;
  
  
  Hide the Status Bar
&lt;/h3&gt;

&lt;p&gt;The status bar at the bottom shows things like your current branch, language mode, and encoding. Useful sometimes - but you can get all that information on demand anyway.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"workbench.statusBar.visible": false

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Move the Activity Bar to the Top
&lt;/h3&gt;

&lt;p&gt;By default the activity bar (with icons for Explorer, Search, Git, Extensions, etc.) sits on the left side and takes up a vertical column of space. Moving it to the top frees up horizontal space for your code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"workbench.activityBar.location": "top"

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Disable the Command Center
&lt;/h3&gt;

&lt;p&gt;VS Code added a big search bar in the title bar called the Command Center. If you use &lt;code&gt;Cmd/Ctrl + Shift + P&lt;/code&gt; to run commands (which you should), you don't need this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"window.commandCenter": false

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Turn Off Breadcrumbs
&lt;/h3&gt;

&lt;p&gt;Breadcrumbs show you the file path and symbol hierarchy at the top of the editor. Handy for navigating large codebases, but just noise for most day-to-day work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"breadcrumbs.enabled": false

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Disable the Minimap
&lt;/h3&gt;

&lt;p&gt;The minimap is that tiny birds-eye view of your code on the right side of the editor. It looks cool, but in practice almost nobody uses it for navigation once they know keyboard shortcuts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.minimap.enabled": false

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hide Line Numbers
&lt;/h3&gt;

&lt;p&gt;This one's controversial - I know! But hear me out. Once you're comfortable with VS Code, you rarely actually &lt;em&gt;need&lt;/em&gt; to see line numbers. Removing them gives the editor a much cleaner, document-like feel. Error messages still tell you the line number; you can jump to any line with &lt;code&gt;Ctrl + G&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;"editor.lineNumbers": "off"

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Not ready to go lineless?&lt;/strong&gt; Try &lt;code&gt;"editor.lineNumbers": "relative"&lt;/code&gt; instead - it shows numbers relative to your cursor position, which is super useful if you use Vim motions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Remove Indentation Guides
&lt;/h3&gt;

&lt;p&gt;Those faint vertical lines that show indentation levels? Gone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.guides.indentation": false

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove Code Folding Arrows
&lt;/h3&gt;

&lt;p&gt;Those little arrows in the gutter that let you collapse blocks of code. If you don't use them, they're just visual clutter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.folding": false

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Set Up the Terminal to Match
&lt;/h2&gt;

&lt;p&gt;If you use the integrated terminal (and you should - it's really handy), make sure it matches your editor's font so everything looks consistent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"terminal.integrated.fontFamily": "Brass Mono, monospace",
"terminal.integrated.fontSize": 14,
"terminal.integrated.lineHeight": 1.6

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7: Configure Your Code Formatting
&lt;/h2&gt;

&lt;p&gt;Good formatting settings mean you spend less time thinking about whitespace and more time thinking about code. I use &lt;strong&gt;Prettier&lt;/strong&gt; for automatic formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Prettier
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Extensions: &lt;code&gt;Cmd/Ctrl + Shift + X&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Prettier - Code formatter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click Install&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then add these settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.defaultFormatter": "esbenp.prettier-vscode",
"prettier.tabWidth": 2,
"prettier.useTabs": false,
"editor.formatOnSave": false,
"editor.tabSize": 2,
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note on &lt;code&gt;formatOnSave&lt;/code&gt;:&lt;/strong&gt; I keep this set to &lt;code&gt;false&lt;/code&gt; because I prefer to format manually when I'm ready. If you want your code auto-formatted every time you save (which a lot of people prefer!), change this to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Suppress Tailwind CSS Warnings
&lt;/h3&gt;

&lt;p&gt;If you use Tailwind CSS, you'll get annoying "Unknown at-rule" warnings for things like &lt;code&gt;@tailwind&lt;/code&gt; and &lt;code&gt;@apply&lt;/code&gt;. Silence them with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"css.lint.unknownAtRules": "ignore",
"scss.lint.unknownAtRules": "ignore",
"less.lint.unknownAtRules": "ignore"

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 8: Improve Navigation Behavior
&lt;/h2&gt;

&lt;p&gt;These small tweaks make navigating your codebase feel snappier and less interrupting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.gotoLocation.multipleReferences": "goto",
"editor.gotoLocation.multipleDefinitions": "goto",
"editor.gotoLocation.multipleDeclarations": "goto",
"editor.gotoLocation.multipleImplementations": "goto",
"editor.gotoLocation.multipleTypeDefinitions": "goto",
"workbench.editor.enablePreviewFromQuickOpen": false

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

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;goto&lt;/code&gt; settings mean that when you press &lt;code&gt;F12&lt;/code&gt; to go to a definition, VS Code jumps straight there instead of showing you a picker - much less friction. The &lt;code&gt;enablePreviewFromQuickOpen: false&lt;/code&gt; setting stops VS Code from opening files in "preview mode" (that italic tab title) when you open them with &lt;code&gt;Ctrl/Cmd + P&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Install Must-Have Extensions
&lt;/h2&gt;

&lt;p&gt;These are the extensions I consider essential for a great development experience. Most of them work quietly in the background and just make things better without getting in the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Code Quality
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Lens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows errors and warnings inline next to your code, instead of making you hover over the red squiggles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SonarQube for IDE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Catches bugs, code smells, and security vulnerabilities as you type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Spell Checker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Catches typos in your code and comments (more useful than you'd think!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pretty TypeScript Errors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Makes TypeScript error messages actually readable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  For Workflow
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitLens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supercharges the built-in Git integration - shows who wrote each line, rich history, and much more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prettier - Code formatter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic, opinionated code formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto Rename Tag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatically renames the closing HTML/JSX tag when you rename the opening one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Import Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows the file size of imported packages inline - great for keeping bundle sizes down&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  For Specific Tech
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tailwind CSS IntelliSense&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Autocomplete, linting, and hover previews for Tailwind classes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Preview&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows a thumbnail of image files in the gutter and on hover&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  For Fun 🐾
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;vscode-pets&lt;/strong&gt; - This one doesn't make you more productive at all. It adds a little pet (cat, dog, snake, and more) that runs around in a panel while you work. You can set the background theme, pet size, and even throw a ball with your mouse. It's ridiculous and I love it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"vscode-pets.theme": "forest",
"vscode-pets.throwBallWithMouse": true,
"vscode-pets.petSize": "small"

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 10: Hide Clutter from the File Explorer
&lt;/h2&gt;

&lt;p&gt;If you're working on a JavaScript/TypeScript project, your &lt;code&gt;node_modules&lt;/code&gt; and &lt;code&gt;.next&lt;/code&gt; folders are constantly showing up in the explorer and it's really annoying. Hide them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"files.exclude": {
  "**/.next": true,
  "**/node_modules": true
}

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

&lt;/div&gt;



&lt;p&gt;You can add any folders or file patterns here that you never want to see in the explorer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Complete settings.json
&lt;/h2&gt;

&lt;p&gt;Here's everything in one place. Open your &lt;code&gt;settings.json&lt;/code&gt; (&lt;code&gt;Cmd/Ctrl + Shift + P&lt;/code&gt; → &lt;code&gt;Open User Settings (JSON)&lt;/code&gt;) and paste this in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  // ─────────────────────────────────────────────
  // WORKBENCH / UI LAYOUT
  // ─────────────────────────────────────────────

  "workbench.activityBar.location": "top", // Move the activity bar (Explorer, Git, etc.) to the top
  "window.commandCenter": false, // Disable the large command center search bar
  "workbench.iconTheme": "symbols", // Minimal icon pack
  "workbench.colorTheme": "Min Dark", // Color theme
  "workbench.statusBar.visible": false, // Hide the status bar for a cleaner UI
  "window.newWindowDimensions": "inherit", // New windows inherit the current window size
  "window.nativeFullScreen": true, // Use OS native fullscreen behavior
  "breadcrumbs.enabled": false, // Disable breadcrumbs navigation bar

  // ─────────────────────────────────────────────
  // FONTS &amp;amp; TYPOGRAPHY
  // ─────────────────────────────────────────────

  "editor.fontFamily": "Brass Mono, monospace", // Main editor font
  "editor.fontSize": 14, // Editor font size
  "editor.lineHeight": 1.6, // Improve readability of code spacing
  "editor.letterSpacing": 0.3, // Slight spacing between letters (optional aesthetic tweak)

  // ─────────────────────────────────────────────
  // TERMINAL APPEARANCE
  // ─────────────────────────────────────────────

  "terminal.integrated.fontFamily": "Brass Mono, monospace", // Terminal font
  "terminal.integrated.fontSize": 14, // Terminal font size
  "terminal.integrated.lineHeight": 1.6, // Extra spacing for terminal readability

  // ─────────────────────────────────────────────
  // FORMATTER / CODE STYLE
  // ─────────────────────────────────────────────

  "editor.defaultFormatter": "esbenp.prettier-vscode", // Use Prettier as the default formatter
  "prettier.tabWidth": 2, // Number of spaces per indentation level
  "prettier.useTabs": false, // Use spaces instead of tabs

  "editor.formatOnSave": false, // Format files automatically when saving
  "editor.insertSpaces": false, // Use spaces instead of tabs
  "editor.tabSize": 2, // Number of spaces per indentation level

  "files.trimTrailingWhitespace": true, // Remove trailing whitespace when saving
  "files.insertFinalNewline": true, // Ensure every file ends with a newline (POSIX standard)
  "files.trimFinalNewlines": true, // Remove multiple blank lines at end of file

  "css.lint.unknownAtRules": "ignore", // Ignore Tailwind warnings
  "scss.lint.unknownAtRules": "ignore", // Ignore Tailwind warnings
  "less.lint.unknownAtRules": "ignore", // Ignore Tailwind warnings

  // ─────────────────────────────────────────────
  // EDITOR BEHAVIOR
  // ─────────────────────────────────────────────

  "editor.detectIndentation": false, // Disable indentation auto-detection, Forces your manual indentation rules
  "editor.snippetSuggestions": "top", // Place snippets at top of autocomplete suggestions
  "editor.emptySelectionClipboard": true, // Copy line if nothing is selected
  "editor.copyWithSyntaxHighlighting": false, // Copy plain text instead of colored syntax

  // ─────────────────────────────────────────────
  // MINIMALIST UI (REMOVE VISUAL NOISE)
  // ─────────────────────────────────────────────

  "editor.minimap.enabled": false, // Disable minimap on right side
  "editor.lineNumbers": "off", // Hide line numbers
  "editor.guides.indentation": false, // Remove vertical indentation guides
  "editor.folding": false, // Optional: remove code folding controls

  // ─────────────────────────────────────────────
  // DIFF / GIT COMPARISON
  // ─────────────────────────────────────────────

  "diffEditor.ignoreTrimWhitespace": false, // Show whitespace differences in git diffs
  "diffEditor.renderSideBySide": true, // Side-by-side diff view instead of inline

  // ─────────────────────────────────────────────
  // NAVIGATION BEHAVIOR
  // ─────────────────────────────────────────────

  "editor.gotoLocation.multipleReferences": "goto", // If multiple results exist, jump directly instead of showing picker
  "editor.gotoLocation.multipleDefinitions": "goto", // If multiple results exist, jump directly instead of showing picker
  "editor.gotoLocation.multipleDeclarations": "goto", // If multiple results exist, jump directly instead of showing picker
  "editor.gotoLocation.multipleImplementations": "goto", // If multiple results exist, jump directly instead of showing picker
  "editor.gotoLocation.multipleTypeDefinitions": "goto", // If multiple results exist, jump directly instead of showing picker

  "workbench.editor.enablePreviewFromQuickOpen": false, // Prevent preview tabs from Quick Open (Ctrl+P)

  // ─────────────────────────────────────────────
  // AI / EXTENSIONS
  // ─────────────────────────────────────────────

  "gitlens.ai.model": "vscode", // GitLens AI model configuration
  "gitlens.ai.vscode.model": "copilot:gpt-4.1", // GitLens AI model configuration

  // ─────────────────────────────────────────────
  // FUN (VS CODE PETS)
  // ─────────────────────────────────────────────

  "vscode-pets.theme": "forest", // Pet theme
  "vscode-pets.throwBallWithMouse": true, // Allow throwing ball with mouse
  "vscode-pets.petSize": "small", // Smaller pet size

  // ─────────────────────────────────────────────
  // FILE EXPLORER
  // ─────────────────────────────────────────────

    "files.exclude": {
        "**/.next": true,
        "**/node_modules": true
    },
}

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Heads up:&lt;/strong&gt; This will replace your existing settings. If you have settings you want to keep, copy specific sections instead of pasting the whole file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Quick Reference: What Each Section Does
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;activityBar.location: "top"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Moves icons from the side to the top&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;statusBar.visible: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hides the bottom bar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;minimap.enabled: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes the code overview on the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lineNumbers: "off"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hides line numbers for a cleaner look&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;breadcrumbs.enabled: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes the navigation path above the editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;editor.folding: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes code folding arrows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;editor.lineHeight: 1.6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds breathing room between code lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;files.trimTrailingWhitespace: true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Automatically cleans up whitespace on save&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Will hiding the status bar mean I can't see my Git branch?&lt;/strong&gt; A: You'll still see it in the activity bar when you open the Source Control panel. And GitLens gives you much richer Git info anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What if I need line numbers back temporarily?&lt;/strong&gt; A: Just open the Command Palette (&lt;code&gt;Cmd/Ctrl + Shift + P&lt;/code&gt;) and search for "Toggle Line Numbers" - no need to edit settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I use a different theme instead of Min Dark?&lt;/strong&gt; A: Absolutely! The theme setting is completely independent from everything else. Popular alternatives include Tokyo Night, Catppuccin, Dracula, and One Dark Pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: My font isn't showing up after installation.&lt;/strong&gt; A: Make sure you restarted VS Code after installing the font. Also double-check that the font name in &lt;code&gt;settings.json&lt;/code&gt; exactly matches the font's name as installed on your system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Some of my extensions seem to conflict with these settings.&lt;/strong&gt; A: The most common culprits are other formatter extensions. Make sure &lt;code&gt;editor.defaultFormatter&lt;/code&gt; is set to Prettier, and disable any other formatters that might be interfering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The goal of a setup like this isn't to look cool on Twitter (although, yeah, it does look pretty nice). It's to reduce the cognitive load of your environment so your brain can focus on the actual problem you're trying to solve.&lt;/p&gt;

&lt;p&gt;Once you get used to working in a clean, minimal editor, going back to the default VS Code layout feels genuinely overwhelming. Give it a week and I promise you won't look back.&lt;/p&gt;

&lt;p&gt;Happy coding! 🎉&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this helpful? Share it with a fellow developer who's drowning in VS Code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Originally posted here: &lt;a href="https://dudych.com/blog/how-i-transformed-vs-code-into-a-cozy-minimalist-workspace-full-setup-guide" rel="noopener noreferrer"&gt;https://dudych.com/blog/how-i-transformed-vs-code-into-a-cozy-minimalist-workspace-full-setup-guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>vscode</category>
      <category>development</category>
      <category>ide</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>
