<?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: Varun Manjunath</title>
    <description>The latest articles on DEV Community by Varun Manjunath (@vj_2_108).</description>
    <link>https://dev.to/vj_2_108</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%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg</url>
      <title>DEV Community: Varun Manjunath</title>
      <link>https://dev.to/vj_2_108</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vj_2_108"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:26:06 +0000</pubDate>
      <link>https://dev.to/vj_2_108/-1j2m</link>
      <guid>https://dev.to/vj_2_108/-1j2m</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-story__hidden-navigation-link"&gt;Brain Rot&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/vj_2_108" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg" alt="vj_2_108 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/vj_2_108" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Varun Manjunath
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Varun Manjunath
                
              
              &lt;div id="story-author-preview-content-4161719" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/vj_2_108" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Varun Manjunath&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 17&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" id="article-link-4161719"&gt;
          Brain Rot
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reviews"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reviews&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Fri, 17 Jul 2026 09:25:49 +0000</pubDate>
      <link>https://dev.to/vj_2_108/-c0i</link>
      <guid>https://dev.to/vj_2_108/-c0i</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-story__hidden-navigation-link"&gt;Brain Rot&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/vj_2_108" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg" alt="vj_2_108 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/vj_2_108" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Varun Manjunath
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Varun Manjunath
                
              
              &lt;div id="story-author-preview-content-4161719" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/vj_2_108" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Varun Manjunath&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 17&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" id="article-link-4161719"&gt;
          Brain Rot
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reviews"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reviews&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Fri, 17 Jul 2026 01:31:19 +0000</pubDate>
      <link>https://dev.to/vj_2_108/-m97</link>
      <guid>https://dev.to/vj_2_108/-m97</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-story__hidden-navigation-link"&gt;Brain Rot&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/vj_2_108" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg" alt="vj_2_108 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/vj_2_108" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Varun Manjunath
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Varun Manjunath
                
              
              &lt;div id="story-author-preview-content-4161719" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/vj_2_108" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3980626%2Ff959a176-6e6a-448a-a248-ce4dcc58b4d7.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Varun Manjunath&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 17&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" id="article-link-4161719"&gt;
          Brain Rot
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reviews"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reviews&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vj_2_108/brain-rot-3gb2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Brain Rot</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Fri, 17 Jul 2026 01:29:28 +0000</pubDate>
      <link>https://dev.to/vj_2_108/brain-rot-3gb2</link>
      <guid>https://dev.to/vj_2_108/brain-rot-3gb2</guid>
      <description>&lt;p&gt;My kid asked to watch one Bluey episode. Auto-play had other plans. Forty-five minutes later it was unboxing videos, a bedtime meltdown, and me wondering why a video platform built for "watching what you want" had quietly turned into a platform that decides for you.&lt;/p&gt;

&lt;p&gt;That's the problem I set out to fix with &lt;a href="https://nosuggest.com" rel="noopener noreferrer"&gt;NoSuggest&lt;/a&gt;, a free, open-source PWA that strips YouTube down to just the channels you choose. No recommendations, no Shorts, no auto-play, no trending feed, no algorithmic rabbit holes.&lt;/p&gt;

&lt;p&gt;Kids only ever see content from channels a parent explicitly added. There's a dedicated Kids Mode with a 6-digit PIN, and it hides anything that could lead to an accidental tap outside curated content.&lt;/p&gt;

&lt;p&gt;It's not a parental-control gimmick bolted onto an ad-supported product.&lt;/p&gt;

&lt;p&gt;There's no ad tier to protect, no engagement metric to hit. Free forever, no data collection, no premium version waiting behind a paywall.&lt;/p&gt;

&lt;p&gt;If you're a developer, parent, or just tired of losing an hour to a feed you never asked for, take a look at the code or try it yourself in &lt;a href="https://github.com/No-Suggest/NoSuggest" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7pvdwd9dq6w9qmpdv1mm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7pvdwd9dq6w9qmpdv1mm.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>reviews</category>
    </item>
    <item>
      <title>How I approached accessibility in a single-page PWA — and what I still need help with</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Wed, 15 Jul 2026 01:43:08 +0000</pubDate>
      <link>https://dev.to/vj_2_108/how-i-approached-accessibility-in-a-single-page-pwa-and-what-i-still-need-help-with-4eae</link>
      <guid>https://dev.to/vj_2_108/how-i-approached-accessibility-in-a-single-page-pwa-and-what-i-still-need-help-with-4eae</guid>
      <description>&lt;p&gt;I built &lt;a href="https://nosuggest.com" rel="noopener noreferrer"&gt;NoSuggest&lt;/a&gt; — a free, open-source Progressive Web App that lets you watch YouTube without the algorithm. No recommendations, no Shorts, no auto-play. Just the channels you explicitly choose.&lt;/p&gt;

&lt;p&gt;It started as a personal tool. Then teachers started using it in classrooms. Then it got listed on the ISTE EdTech Index. Suddenly accessibility wasn't optional, it was the right thing to do, and genuinely important for the people using it.&lt;/p&gt;

&lt;p&gt;I want to share what I actually did, what was harder than expected, and where I got it wrong the first time. And at the end — an honest ask.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture that made accessibility tricky
&lt;/h2&gt;

&lt;p&gt;NoSuggest is a &lt;strong&gt;single HTML file&lt;/strong&gt;. No framework. No build step. All screens are &lt;code&gt;position:absolute&lt;/code&gt; divs that toggle &lt;code&gt;opacity&lt;/code&gt; and &lt;code&gt;pointer-events&lt;/code&gt;. This meant the usual accessibility patterns didn't apply cleanly — I had to think carefully about what "navigation" even means when there's no page load.&lt;/p&gt;

&lt;p&gt;The biggest early mistake: &lt;strong&gt;inactive screens were still in the Tab order&lt;/strong&gt;. You would Tab through the Feed screen and silently end up inside the Settings screen — completely invisible to a sighted user but reachable by keyboard. Classic SPA trap.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I fixed, and how
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;inert&lt;/code&gt; for inactive screens
&lt;/h3&gt;

&lt;p&gt;The fix was the &lt;code&gt;inert&lt;/code&gt; attribute — it removes an entire element's subtree from Tab order and screen reader traversal in one shot, with no JavaScript loop needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;screens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;activeScreen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Progressive enhancement: browsers without &lt;code&gt;inert&lt;/code&gt; support just ignore it and fall back to the previous behaviour. No breakage.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Modal focus trapping
&lt;/h3&gt;

&lt;p&gt;Every modal in the app (Export Backup, Kids Mode PIN, iOS install sheet, video player) now traps Tab inside it and returns focus to the triggering element on close. One shared utility handles all of them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;a11yOpenModal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;modalEl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;closeFn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;_a11yLastFocused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeElement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// focus first focusable inside modal&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;a11yCloseModal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;_a11yLastFocused&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// return focus&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Escape closes any open modal from anywhere — consistent and expected.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Skip links
&lt;/h3&gt;

&lt;p&gt;The Feed screen can have 10+ channels, each with 10 videos and a bookmark button — that's potentially 200+ Tab stops before you reach the nav. Two skip link patterns helped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;"Skip to main content"&lt;/strong&gt; link as the very first focusable element on the page&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;per-channel skip link&lt;/strong&gt; on the Feed, hidden until focused, that jumps straight to the next channel — chainable, so you can skip several in a row with Enter, Enter, Enter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both use the classic off-screen-until-focused pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.skip-link&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-9999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.skip-link&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. The YouTube iframe problem
&lt;/h3&gt;

&lt;p&gt;The video player uses the YouTube IFrame API. Once focus enters the iframe, it disappears into a cross-origin document — our Tab trap can't see it, so focus could wander through however many controls YouTube exposes before returning.&lt;/p&gt;

&lt;p&gt;Fix: set &lt;code&gt;tabIndex = -1&lt;/code&gt; on the iframe element itself once the player is ready. Our own Close and Save buttons remain in the Tab order; the iframe content is excluded entirely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;onReady&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iframeEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ytPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getIframe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;iframeEl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;iframeEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. &lt;code&gt;prefers-reduced-motion&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;One media query, applied globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;*,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;animation-duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.001ms&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition-duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.001ms&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All screen transitions, modal fades, and the install prompt pulse animation still function — they just happen near-instantly. No vestibular triggers.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. iOS PWA nav bar gap — an unexpected accessibility-adjacent fix
&lt;/h3&gt;

&lt;p&gt;On iOS in standalone (Add to Home Screen) mode, &lt;code&gt;overflow:hidden&lt;/code&gt; on the app shell caused &lt;code&gt;position:fixed&lt;/code&gt; children — including the bottom nav — to be clipped relative to the app container rather than the true viewport. The nav appeared to hover above the bottom of the screen with a visible gap.&lt;/p&gt;

&lt;p&gt;The fix: &lt;code&gt;overflow:clip&lt;/code&gt; doesn't create a new containing block for fixed children, so they anchor to the real viewport correctly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#app&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c"&gt;/* fallback */&lt;/span&gt;

&lt;span class="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;#app&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not strictly a WCAG issue, but a real usability barrier for people using the PWA on iPhone — worth documenting.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Programmatic focus outlines
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;showScreen()&lt;/code&gt; moves focus to the active screen's heading for screen reader announcement. But this triggered a visible focus ring on the heading for mouse and touch users too — confusing, since they didn't "Tab" there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;tabindex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"-1"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;tabindex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"-1"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nd"&gt;:focus-visible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Safe to suppress because &lt;code&gt;tabindex="-1"&lt;/code&gt; means the element is never reachable by Tab — only by script. Keyboard users are unaffected.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's documented
&lt;/h2&gt;

&lt;p&gt;All of this is on &lt;a href="https://nosuggest.com/accessibility" rel="noopener noreferrer"&gt;nosuggest.com/accessibility&lt;/a&gt; — an honest account of what's implemented and what isn't. I tried to write it the way I'd want to read it: specific, no vague compliance claims, and transparent about gaps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I need help
&lt;/h2&gt;

&lt;p&gt;I'm applying for the &lt;strong&gt;CAST / Digital Promise "Accessibility Baseline" certification&lt;/strong&gt; (required for the ISTE EdTech listing to show a verified badge).&lt;/p&gt;

&lt;p&gt;The one thing I'm missing: a &lt;strong&gt;third-party WCAG 2.1 AA conformance review (ACR/VPAT)&lt;/strong&gt; completed by someone independent. Self-assessment doesn't satisfy their requirement.&lt;/p&gt;

&lt;p&gt;NoSuggest is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single HTML file (one page, ~8 distinct "screens")&lt;/li&gt;
&lt;li&gt;No backend, no login, no data collected&lt;/li&gt;
&lt;li&gt;Completely free and open source — &lt;a href="https://github.com/No-Suggest/NoSuggest" rel="noopener noreferrer"&gt;github.com/No-Suggest/NoSuggest&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are an accessibility professional who does volunteer reviews, or know someone who does, I would genuinely appreciate hearing from you. The contact form is at &lt;a href="https://nosuggest.com/contact" rel="noopener noreferrer"&gt;nosuggest.com/contact&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if you've tackled similar SPA accessibility challenges — especially with focus management or skip link patterns — I'd love to hear what worked for you in the comments.&lt;/p&gt;

&lt;p&gt;Thank you very much!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>wcag</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Watch YouTube without algorithms - NoSuggest</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Mon, 22 Jun 2026 03:48:49 +0000</pubDate>
      <link>https://dev.to/vj_2_108/watch-youtube-without-algorithms-nosuggest-5chl</link>
      <guid>https://dev.to/vj_2_108/watch-youtube-without-algorithms-nosuggest-5chl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbw8c1mcfdaxxyv2m0xpx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbw8c1mcfdaxxyv2m0xpx.png" alt="App screenshot" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/No-Suggest/NoSuggest" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.nosuggest.com" rel="noopener noreferrer"&gt;App&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking forward for the constructive feedback.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Tired of the YouTube Doomscroll? Meet NoSuggest – A Quiet Act of Resistance</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Thu, 18 Jun 2026 00:42:40 +0000</pubDate>
      <link>https://dev.to/vj_2_108/tired-of-the-youtube-doomscroll-meet-nosuggest-a-quiet-act-of-resistance-5a2d</link>
      <guid>https://dev.to/vj_2_108/tired-of-the-youtube-doomscroll-meet-nosuggest-a-quiet-act-of-resistance-5a2d</guid>
      <description>&lt;p&gt;Have you ever opened YouTube intending to watch a quick 5-minute programming tutorial, only to snap out of a trance 90 minutes later after watching 12 unrelated videos? &lt;/p&gt;

&lt;p&gt;You are not alone. YouTube’s recommendation algorithm is beautifully engineered to do one thing: &lt;strong&gt;maximise your watch time.&lt;/strong&gt; Between auto-play, unending sidebar cards, what's-next suggestions, and the endless dopamine loop of Shorts, intentional watching has become almost impossible.&lt;/p&gt;

&lt;p&gt;To fight back against the algorithm, I want to highlight an awesome open-source project called &lt;strong&gt;&lt;a href="https://www.nosuggest.com/" rel="noopener noreferrer"&gt;NoSuggest&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚫 What is NoSuggest?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nosuggest.com/" rel="noopener noreferrer"&gt;NoSuggest&lt;/a&gt; is a completely free, privacy-first, distraction-free YouTube client. Its philosophy is simple: &lt;strong&gt;You decide what you watch before you open the app, not after the algorithm grabs hold of you.&lt;/strong&gt; It strips away the homepage feed, the recommended sidebars, the auto-play loops, and the Shorts tab. It forces an intentional, clean viewing experience built entirely around your curated choices.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Key Features Built for Digital Wellness
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your Channels, Your Feed:&lt;/strong&gt; Add any YouTube channel by name, handle, or URL. Your feed simply displays the latest videos from the channels you actually care about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure Search:&lt;/strong&gt; Use the search tab to look up exactly what you need without a wall of "recommended for you" filler creeping into the results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Privacy (No Sign-In Required):&lt;/strong&gt; No accounts, no cookies, no tracking pixels. All your data (followed channels and bookmarks) lives completely locally in your browser's &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile-Friendly PWA:&lt;/strong&gt; Unlike standard browser extensions that only work on desktops, NoSuggest is built as a Progressive Web App. You can install it straight to your home screen on Android, iPhone, iPad, or your laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PIN-Protected Kids Mode:&lt;/strong&gt; Parents can hand-pick educational channels or specific videos, then lock the app with a PIN. Kids get the great content without the risk of slipping into addictive algorithm loops.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠 How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;For the developers out there, NoSuggest retrieves publicly available data. Videos play using YouTube's official embed player. This ensures that content creators still receive their rightful watch time. You just get to watch without the cognitive payload of an AI trying to manipulate your next click. The frontend code is also fully open-source and inspect-able on &lt;a href="https://github.com/No-Suggest/NoSuggest" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;




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

&lt;p&gt;If you are looking to reclaim your focus, reduce your screen time, or just want a cleaner way to consume educational content, give &lt;a href="https://www.nosuggest.com/" rel="noopener noreferrer"&gt;NoSuggest&lt;/a&gt; a spin. It’s a great example of using web technology to build a healthier relationship with the tools we use daily.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you used any distraction-free tools for your daily tech consumption? Let’s talk about digital wellness and algorithmic resistance in the comments below!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>No Suggest - distraction-free YouTube client</title>
      <dc:creator>Varun Manjunath</dc:creator>
      <pubDate>Sat, 13 Jun 2026 00:52:30 +0000</pubDate>
      <link>https://dev.to/vj_2_108/no-suggest-distraction-free-youtube-client-9p7</link>
      <guid>https://dev.to/vj_2_108/no-suggest-distraction-free-youtube-client-9p7</guid>
      <description>&lt;p&gt;I have been frustrated with YouTube for a while. Not the content, but the everything around it. The homepage full of bait, the auto-play into things I didn't ask for, the Shorts that hijack your scroll, the recommendations that somehow know exactly what will keep you there longest.&lt;/p&gt;

&lt;p&gt;So I built NoSuggest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
A YouTube feed reader that shows you only the channels you follow, nothing else. No algorithm, no recommendations, no Shorts, no homepage, no auto-play, no endless side cards of videos. You add a channel, it fetches their latest videos, done.&lt;/p&gt;

&lt;p&gt;It lives at &lt;a href="https://nosuggest.com" rel="noopener noreferrer"&gt;nosuggest.com&lt;/a&gt; and installs as a PWA on any device — iPhone, Android, desktop — straight from the browser. No app store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interesting technical constraint: one HTML file&lt;/strong&gt;&lt;br&gt;
The entire app is a single index.html. No account setup, no sign-in, no data collection. Everything that needs to persist, your channel list, saved videos, settings lives in localStorage.&lt;/p&gt;

&lt;p&gt;No search history. No watch history. No "you might also like." No trending section. No notification badges designed to create anxiety. No dark patterns anywhere.&lt;/p&gt;

&lt;p&gt;Every time I was tempted to add something convenient, I asked: does this serve the user's intention, or does it serve engagement? If it was the latter, it didn't make the cut.&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
&lt;a href="https://nosuggest.com" rel="noopener noreferrer"&gt;nosuggest.com&lt;/a&gt; — Source Available &lt;a href="https://github.com/No-Suggest/NoSuggest" rel="noopener noreferrer"&gt;here&lt;/a&gt;, free forever.&lt;/p&gt;

&lt;p&gt;Curious what others think about this as useful.&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
