This service tests the validity of an RSS 2.0 feed, checking to see that it follows the rules of the RSS specification. For advice from the RSS Advisory Board on how to implement RSS and handle issues such as enclosures and HTML encoding, read the RSS Best Practices Profile. This checker is also a validator of Atom and RSS 1.0 feeds.

Use this tester regularly to ensure that your RSS feed continues to work well in the wide audience of RSS readers, podcast clients and other software that supports the format.

 

Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

  • line 12, column 42: Image not in required format [help]

    <url>https://valticus.pro/images/logo.webp</url>
                                              ^
  • line 193, column 0: content:encoded should not contain relative URL references: ../seo-vs-performance-how-to-balance-both/ (22 occurrences) [help]

    </content:encoded>

Source: https://valticus.pro/index.xml

  1. <?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  2. <channel>
  3. <title>Valticus</title>
  4. <link>https://valticus.pro/</link>
  5. <description>Expert insights on programming, technology, and software development. Discover practical code examples, development tools, and in-depth technical tutorials.Valticus</description>
  6. <generator>Hugo 0.162.1 -- gohugo.io</generator>
  7. <language>en-us</language>
  8. <managingEditor>valticus81@gmail.com (Val Paliy)</managingEditor>
  9. <webMaster>valticus81@gmail.com (Val Paliy)</webMaster>
  10. <lastBuildDate>Thu, 11 Jun 2026 13:13:46 +0000</lastBuildDate>
  11. <image>
  12. <url>https://valticus.pro/images/logo.webp</url>
  13. <title>Valticus</title>
  14. <link>https://valticus.pro/</link>
  15. </image><atom:link href="https://valticus.pro/index.xml" rel="self" type="application/rss+xml"/>
  16. <item>
  17. <title>Why SEO Is Mostly Dead (And What Replaced It)</title>
  18. <link>https://valticus.pro/posts/why-seo-is-mostly-dead-and-what-replaced-it/</link>
  19. <pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate>
  20. <guid isPermaLink="true">https://valticus.pro/posts/why-seo-is-mostly-dead-and-what-replaced-it/</guid>
  21. <description>An analysis of how traditional SEO has evolved in 2026, why keyword optimization no longer guarantees traffic, and the strategies that actually work for visibility now.</description>
  22. <category>Web Development</category><content:encoded>&lt;h2 id="the-seo-graveyard"&gt;The SEO Graveyard&lt;/h2&gt;
  23. &lt;p&gt;For two decades, &lt;strong&gt;SEO&lt;/strong&gt; was the golden ticket: research keywords, optimize
  24. content, build links, and watch traffic grow. That playbook is obsolete.
  25. Traditional &lt;strong&gt;SEO&lt;/strong&gt;—the kind that focuses on &amp;ldquo;tricking&amp;rdquo; a crawler into ranking a
  26. page—is fundamentally broken. In 2026, we aren&amp;rsquo;t just fighting for the top of
  27. the &amp;ldquo;10 Blue Links&amp;rdquo;; we are fighting for survival in an ecosystem that is
  28. increasingly hostile to external clicks.&lt;/p&gt;
  29. &lt;p&gt;The era of the &amp;ldquo;Search Portal&amp;rdquo; is over. We have entered the era of the &amp;ldquo;&lt;strong&gt;Answer
  30. Engine&lt;/strong&gt;,&amp;rdquo; where Google, Bing, and AI-native search tools like Perplexity aim to
  31. keep users on their own platforms.&lt;/p&gt;
  32. &lt;figure&gt;
  33. &lt;div class="progressive-image"&gt;
  34. &lt;img class="progressive-image__img"
  35. src="https://valticus.pro/images/why-seo-is-mostly-dead-and-what-replaced-it_hu_344017820ead98ba.webp"
  36. alt="Why SEO Is Mostly Dead (And What Replaced It)."
  37. width="800"
  38. height="436"&gt;
  39. &lt;/div&gt;
  40. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Why SEO Is Mostly Dead (And What Replaced It).&lt;/p&gt;&lt;/figcaption&gt;
  41. &lt;/figure&gt;
  42. &lt;h2 id="the-google-problem-zero-click-reality"&gt;The Google Problem: Zero-Click Reality&lt;/h2&gt;
  43. &lt;p&gt;Google&amp;rsquo;s evolution into a &amp;ldquo;&lt;strong&gt;Search Generative Experience&lt;/strong&gt;&amp;rdquo; (&lt;strong&gt;SGE&lt;/strong&gt;) has
  44. fundamentally changed the value proposition of being #1. Even if you rank first,
  45. you are now buried under:&lt;/p&gt;
  46. &lt;ul&gt;
  47. &lt;li&gt;&lt;strong&gt;AI-generated Overviews&lt;/strong&gt;: Which summarize your content so the user never has
  48. to click.&lt;/li&gt;
  49. &lt;li&gt;&lt;strong&gt;Featured Snippets&lt;/strong&gt;: Which steal the &amp;ldquo;punchline&amp;rdquo; of your article.&lt;/li&gt;
  50. &lt;li&gt;&lt;strong&gt;&amp;ldquo;People also ask&amp;rdquo;&lt;/strong&gt;: A recursive loop that keeps users engaged with Google&amp;rsquo;s
  51. UI.&lt;/li&gt;
  52. &lt;li&gt;&lt;strong&gt;Persistent Sponsored Content&lt;/strong&gt;: Organic results are often pushed below the
  53. fold on mobile and desktop alike.&lt;/li&gt;
  54. &lt;/ul&gt;
  55. &lt;p&gt;The first page of Google is now real estate for Google&amp;rsquo;s own features. For many
  56. informational queries, the &lt;strong&gt;click-through rate (CTR)&lt;/strong&gt; for the #1 organic
  57. result has dropped by over 60% compared to five years ago.&lt;/p&gt;
  58. &lt;h2 id="the-content-farm-collapse"&gt;The Content Farm Collapse&lt;/h2&gt;
  59. &lt;p&gt;The &amp;ldquo;&lt;strong&gt;Helpful Content Updates&lt;/strong&gt;&amp;rdquo; of the last few years were the final nail in
  60. the coffin for sites that relied on:&lt;/p&gt;
  61. &lt;ul&gt;
  62. &lt;li&gt;&lt;strong&gt;Keyword-stuffed articles&lt;/strong&gt; designed for bots, not humans.&lt;/li&gt;
  63. &lt;li&gt;&lt;strong&gt;AI-slop&lt;/strong&gt;: Mass-produced, unverified content designed to capture long-tail
  64. traffic.&lt;/li&gt;
  65. &lt;li&gt;&lt;strong&gt;Programmatic SEO&lt;/strong&gt;: Thousands of pages with thin, repetitive data.&lt;/li&gt;
  66. &lt;li&gt;&lt;strong&gt;Thin affiliate content&lt;/strong&gt;: Reviewing products without ever touching them.&lt;/li&gt;
  67. &lt;/ul&gt;
  68. &lt;p&gt;These tactics no longer work because search engines have pivoted from &lt;strong&gt;Keyword
  69. Matching&lt;/strong&gt; to &lt;strong&gt;Entity Recognition&lt;/strong&gt;. They no longer look for the word &amp;ldquo;best
  70. laptop&amp;rdquo;; they look for &amp;ldquo;Expertise&amp;rdquo; and &amp;ldquo;Authoritativeness&amp;rdquo; from a known entity.&lt;/p&gt;
  71. &lt;h2 id="what-actually-works-now-visibility-over-seo"&gt;What Actually Works Now: Visibility over SEO&lt;/h2&gt;
  72. &lt;p&gt;If &lt;strong&gt;SEO&lt;/strong&gt; is dead, what replaced it? The answer is &lt;strong&gt;Holistic Visibility&lt;/strong&gt;.
  73. Instead of optimizing for an algorithm, you must optimize for &lt;strong&gt;Trust&lt;/strong&gt; and
  74. &lt;strong&gt;Citability&lt;/strong&gt;.&lt;/p&gt;
  75. &lt;h3 id="1-the-eeat-20-framework"&gt;1. The EEAT 2.0 Framework&lt;/h3&gt;
  76. &lt;p&gt;&lt;strong&gt;Experience&lt;/strong&gt;, &lt;strong&gt;Expertise&lt;/strong&gt;, &lt;strong&gt;Authoritativeness&lt;/strong&gt;, and &lt;strong&gt;Trustworthiness&lt;/strong&gt;
  77. (&lt;strong&gt;EEAT&lt;/strong&gt;) are no longer just &amp;ldquo;guidelines&amp;rdquo;—they are the core of the ranking
  78. system.&lt;/p&gt;
  79. &lt;ul&gt;
  80. &lt;li&gt;&lt;strong&gt;Experience&lt;/strong&gt;: Can you prove you actually &lt;em&gt;did&lt;/em&gt; the thing you&amp;rsquo;re writing
  81. about? This is why &amp;ldquo;I tried X for 30 days&amp;rdquo; content is outperforming &amp;ldquo;How to do
  82. X&amp;rdquo; guides.&lt;/li&gt;
  83. &lt;li&gt;&lt;strong&gt;Trust&lt;/strong&gt;: If an AI summarizes your content, will it cite you as the source?
  84. &lt;strong&gt;Citability&lt;/strong&gt; is the new backlink.&lt;/li&gt;
  85. &lt;/ul&gt;
  86. &lt;h3 id="2-build-an-audience-not-just-traffic"&gt;2. Build an Audience, Not Just Traffic&lt;/h3&gt;
  87. &lt;p&gt;The most successful creators in 2026 have one thing in common: they don&amp;rsquo;t rely
  88. on Google.&lt;/p&gt;
  89. &lt;ul&gt;
  90. &lt;li&gt;&lt;strong&gt;Email Newsletters&lt;/strong&gt;: Owning your distribution means you aren&amp;rsquo;t at the mercy
  91. of an algorithm update.&lt;/li&gt;
  92. &lt;li&gt;&lt;strong&gt;RSS Feeds&lt;/strong&gt;: As I discussed in Slow Web Movement, allowing users to consume
  93. your content on their own terms builds long-term loyalty.&lt;/li&gt;
  94. &lt;li&gt;&lt;strong&gt;Direct Traffic&lt;/strong&gt;: Your goal should be to make your brand the destination,
  95. not the search engine.&lt;/li&gt;
  96. &lt;/ul&gt;
  97. &lt;h2 id="the-shift-old-seo-vs-new-visibility"&gt;The Shift: Old SEO vs. New Visibility&lt;/h2&gt;
  98. &lt;table&gt;
  99. &lt;thead&gt;
  100. &lt;tr&gt;
  101. &lt;th style="text-align: left"&gt;Feature&lt;/th&gt;
  102. &lt;th style="text-align: left"&gt;Old &lt;strong&gt;SEO&lt;/strong&gt; (Dead)&lt;/th&gt;
  103. &lt;th style="text-align: left"&gt;New Visibility (Alive)&lt;/th&gt;
  104. &lt;/tr&gt;
  105. &lt;/thead&gt;
  106. &lt;tbody&gt;
  107. &lt;tr&gt;
  108. &lt;td style="text-align: left"&gt;&lt;strong&gt;Focus&lt;/strong&gt;&lt;/td&gt;
  109. &lt;td style="text-align: left"&gt;Keywords &amp;amp; &lt;strong&gt;Latent Semantic Indexing&lt;/strong&gt;&lt;/td&gt;
  110. &lt;td style="text-align: left"&gt;Entities, Intent, and &lt;strong&gt;EEAT&lt;/strong&gt;&lt;/td&gt;
  111. &lt;/tr&gt;
  112. &lt;tr&gt;
  113. &lt;td style="text-align: left"&gt;&lt;strong&gt;Success Metric&lt;/strong&gt;&lt;/td&gt;
  114. &lt;td style="text-align: left"&gt;Search Rank &amp;amp; Page Views&lt;/td&gt;
  115. &lt;td style="text-align: left"&gt;Citations, Subscriptions, Dwell Time&lt;/td&gt;
  116. &lt;/tr&gt;
  117. &lt;tr&gt;
  118. &lt;td style="text-align: left"&gt;&lt;strong&gt;Content Type&lt;/strong&gt;&lt;/td&gt;
  119. &lt;td style="text-align: left"&gt;Skimmable Listicles&lt;/td&gt;
  120. &lt;td style="text-align: left"&gt;Deep Tutorials &amp;amp; Original Research&lt;/td&gt;
  121. &lt;/tr&gt;
  122. &lt;tr&gt;
  123. &lt;td style="text-align: left"&gt;&lt;strong&gt;Distribution&lt;/strong&gt;&lt;/td&gt;
  124. &lt;td style="text-align: left"&gt;&amp;ldquo;Post and Pray&amp;rdquo; to Google&lt;/td&gt;
  125. &lt;td style="text-align: left"&gt;Multi-channel (&lt;strong&gt;RSS&lt;/strong&gt;, Email, Social)&lt;/td&gt;
  126. &lt;/tr&gt;
  127. &lt;tr&gt;
  128. &lt;td style="text-align: left"&gt;&lt;strong&gt;AI Role&lt;/strong&gt;&lt;/td&gt;
  129. &lt;td style="text-align: left"&gt;Used to generate volume&lt;/td&gt;
  130. &lt;td style="text-align: left"&gt;Used to enhance research/depth&lt;/td&gt;
  131. &lt;/tr&gt;
  132. &lt;/tbody&gt;
  133. &lt;/table&gt;
  134. &lt;h2 id="technical-excellence-still-matters"&gt;Technical Excellence Still Matters&lt;/h2&gt;
  135. &lt;p&gt;While &amp;ldquo;tricks&amp;rdquo; are dead, technical quality is more important than ever. If an
  136. &lt;strong&gt;AI crawler&lt;/strong&gt; (like GPT-Bot or CCBot) can&amp;rsquo;t easily parse your site, you won&amp;rsquo;t
  137. be cited in AI overviews.&lt;/p&gt;
  138. &lt;blockquote&gt;
  139. &lt;p&gt;&lt;strong&gt;Pro Tip: JSON-LD for Entity Recognition&lt;/strong&gt; Use advanced &lt;strong&gt;Schema.org&lt;/strong&gt; markup
  140. to tell search engines exactly who you are and what your content represents.
  141. Don&amp;rsquo;t just use &lt;code&gt;Article&lt;/code&gt; schema; use &lt;code&gt;ReviewedBy&lt;/code&gt;, &lt;code&gt;Specialty&lt;/code&gt;, and
  142. &lt;code&gt;SignificantLink&lt;/code&gt; to build a &lt;strong&gt;semantic web&lt;/strong&gt; of trust around your content.&lt;/p&gt;
  143. &lt;/blockquote&gt;
  144. &lt;h3 id="schemaorg-checklist-for-ai-visibility"&gt;&lt;strong&gt;Schema.org&lt;/strong&gt; Checklist for AI Visibility&lt;/h3&gt;
  145. &lt;ul&gt;
  146. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Author Schema&lt;/strong&gt;: Link to your LinkedIn, social media, and about page to
  147. establish &amp;ldquo;&lt;strong&gt;Expertise&lt;/strong&gt;.&amp;rdquo;&lt;/li&gt;
  148. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Organization Schema&lt;/strong&gt;: Define your brand&amp;rsquo;s relationship to the topics
  149. you cover.&lt;/li&gt;
  150. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;FAQ Schema&lt;/strong&gt;: Help AI summaries find the &amp;ldquo;answers&amp;rdquo; in your content
  151. quickly.&lt;/li&gt;
  152. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Breadcrumbs&lt;/strong&gt;: Establish a clear hierarchy for the crawler.&lt;/li&gt;
  153. &lt;/ul&gt;
  154. &lt;h2 id="the-rise-of-answer-engine-optimization-aeo"&gt;The Rise of &amp;ldquo;Answer Engine Optimization&amp;rdquo; (AEO)&lt;/h2&gt;
  155. &lt;p&gt;As AI-powered search (Perplexity, ChatGPT) grows, we must optimize for
  156. &lt;strong&gt;Answerability&lt;/strong&gt;.&lt;/p&gt;
  157. &lt;ul&gt;
  158. &lt;li&gt;&lt;strong&gt;Be the Source&lt;/strong&gt;: Provide original data or unique insights that AI models
  159. will want to cite.&lt;/li&gt;
  160. &lt;li&gt;&lt;strong&gt;Write for Citability&lt;/strong&gt;: Use clear, declarative statements that are easy for
  161. an &lt;strong&gt;LLM&lt;/strong&gt; to extract and attribute.&lt;/li&gt;
  162. &lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: As I&amp;rsquo;ve noted in SEO vs Performance: How to Balance Both,
  163. speed is the baseline. If your site is slow, a crawler might time out before
  164. it can index your &amp;ldquo;expert&amp;rdquo; opinion.&lt;/li&gt;
  165. &lt;/ul&gt;
  166. &lt;h2 id="the-human-factor-opinionated-content"&gt;The Human Factor: Opinionated Content&lt;/h2&gt;
  167. &lt;p&gt;The one thing AI cannot replicate (yet) is a &lt;strong&gt;strong, human opinion&lt;/strong&gt;. AI is
  168. great at summarizing the &amp;ldquo;average&amp;rdquo; view. To stand out, you must be anything
  169. &lt;em&gt;but&lt;/em&gt; average.&lt;/p&gt;
  170. &lt;ul&gt;
  171. &lt;li&gt;Share your failures.&lt;/li&gt;
  172. &lt;li&gt;Challenge the status quo.&lt;/li&gt;
  173. &lt;li&gt;Write with a voice that is unmistakably yours.&lt;/li&gt;
  174. &lt;/ul&gt;
  175. &lt;p&gt;In 2026, the most valuable &amp;ldquo;&lt;strong&gt;SEO&lt;/strong&gt;&amp;rdquo; tool you have is your own perspective.&lt;/p&gt;
  176. &lt;h2 id="conclusion-stop-optimizing-start-serving"&gt;Conclusion: Stop Optimizing, Start Serving&lt;/h2&gt;
  177. &lt;p&gt;The death of traditional &lt;strong&gt;SEO&lt;/strong&gt; is actually a good thing for the web. It is
  178. forcing creators to stop writing for bots and start writing for humans again.
  179. The &amp;ldquo;optimization&amp;rdquo; of the future isn&amp;rsquo;t about where you place your keywords; it&amp;rsquo;s
  180. about the value you provide to your readers.&lt;/p&gt;
  181. &lt;p&gt;The sites that thrive in the next decade won&amp;rsquo;t be the ones with the most
  182. backlinks or the perfect keyword density. They will be the most &lt;strong&gt;useful&lt;/strong&gt;, the
  183. most &lt;strong&gt;trusted&lt;/strong&gt;, and the most &lt;strong&gt;human&lt;/strong&gt;.&lt;/p&gt;
  184. &lt;p&gt;Stop chasing the algorithm. Build something worth citing.&lt;/p&gt;
  185. &lt;blockquote&gt;
  186. &lt;p&gt;Related:&lt;/p&gt;
  187. &lt;ul&gt;
  188. &lt;li&gt;&lt;a href="../seo-vs-performance-how-to-balance-both/"&gt;SEO vs Performance: How to Balance Both&lt;/a&gt;&lt;/li&gt;
  189. &lt;li&gt;&lt;a href="../google-search-radical-redesign/"&gt;Inside Google Search&amp;rsquo;s Most Radical Redesign in 25 Years&lt;/a&gt;&lt;/li&gt;
  190. &lt;li&gt;&lt;a href="../w3c-standards-ignored-by-search-engines/"&gt;W3C Standards Ignored by Search Engines&lt;/a&gt;&lt;/li&gt;
  191. &lt;/ul&gt;
  192. &lt;/blockquote&gt;
  193. </content:encoded>
  194. <dc:creator>Val Paliy</dc:creator>
  195. </item>
  196. <item>
  197. <title>SEO vs Performance: How to Balance Both</title>
  198. <link>https://valticus.pro/posts/seo-vs-performance-how-to-balance-both/</link>
  199. <pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate>
  200. <guid isPermaLink="true">https://valticus.pro/posts/seo-vs-performance-how-to-balance-both/</guid>
  201. <description>Practical strategies for balancing search engine optimization with website performance, ensuring your site ranks well without sacrificing speed or user experience.</description>
  202. <category>Web Development</category>
  203. <category>Technology</category><content:encoded>&lt;h2 id="the-false-dichotomy-speed-is-seo"&gt;The False Dichotomy: Speed is SEO&lt;/h2&gt;
  204. &lt;p&gt;In the early days of the web, performance was a technical luxury. Today, it is a
  205. foundational pillar of Search Engine Optimization. Yet, developers and marketers
  206. often frame SEO and performance as opposing forces: SEO requires tracking
  207. scripts, heavy images, and rich functionality that supposedly &amp;ldquo;hurts&amp;rdquo;
  208. performance, while performance purists want to strip away every tag that might
  209. delay a millisecond of rendering.&lt;/p&gt;
  210. &lt;p&gt;This is a false dichotomy. In the modern era of &lt;strong&gt;Core Web Vitals&lt;/strong&gt;, performance
  211. &lt;em&gt;is&lt;/em&gt; SEO. Google no longer just looks at what your page says; it looks at how
  212. your page &lt;em&gt;behaves&lt;/em&gt;. If your site is slow, it doesn&amp;rsquo;t matter how well-optimized
  213. your keywords are—you will be buried by faster, more responsive competitors.&lt;/p&gt;
  214. &lt;figure&gt;
  215. &lt;div class="progressive-image"&gt;
  216. &lt;img class="progressive-image__img"
  217. src="https://valticus.pro/images/how-i-built-this-site-and-the-tech-stack-i-regret_hu_30a85feb1fe7e88c.webp"
  218. alt="SEO vs Performance: How to Balance Both."
  219. width="800"
  220. height="437"&gt;
  221. &lt;/div&gt;
  222. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;SEO vs Performance: How to Balance Both.&lt;/p&gt;&lt;/figcaption&gt;
  223. &lt;/figure&gt;
  224. &lt;h2 id="where-they-align-the-core-web-vitals-era"&gt;Where They Align: The Core Web Vitals Era&lt;/h2&gt;
  225. &lt;p&gt;Since the introduction of &lt;strong&gt;Core Web Vitals&lt;/strong&gt;, the alignment between &lt;strong&gt;user
  226. experience (UX)&lt;/strong&gt; and &lt;strong&gt;SEO&lt;/strong&gt; has never been stronger. These metrics are
  227. specifically designed to quantify the &amp;ldquo;real-world&amp;rdquo; experience of a user.&lt;/p&gt;
  228. &lt;h3 id="1-largest-contentful-paint-lcp"&gt;1. Largest Contentful Paint (LCP)&lt;/h3&gt;
  229. &lt;p&gt;&lt;strong&gt;LCP&lt;/strong&gt; measures when the largest content element (usually a hero image or
  230. heading) becomes visible.&lt;/p&gt;
  231. &lt;ul&gt;
  232. &lt;li&gt;&lt;strong&gt;SEO Impact&lt;/strong&gt;: High &lt;strong&gt;LCP&lt;/strong&gt; scores tell Google your site is useful quickly.&lt;/li&gt;
  233. &lt;li&gt;&lt;strong&gt;Performance Strategy&lt;/strong&gt;: Optimize the &lt;strong&gt;critical rendering path&lt;/strong&gt;. Preload
  234. your hero images and ensure your &lt;strong&gt;server-side rendering (SSR)&lt;/strong&gt; or &lt;strong&gt;static
  235. site generation (SSG)&lt;/strong&gt; is delivering HTML as fast as possible.&lt;/li&gt;
  236. &lt;/ul&gt;
  237. &lt;h3 id="2-interaction-to-next-paint-inp"&gt;2. Interaction to Next Paint (INP)&lt;/h3&gt;
  238. &lt;p&gt;Replacing the older First Input Delay (FID), &lt;strong&gt;INP&lt;/strong&gt; measures the overall
  239. responsiveness of your site to user inputs (clicks, taps, keyboard presses)
  240. throughout the entire life of the page.&lt;/p&gt;
  241. &lt;ul&gt;
  242. &lt;li&gt;&lt;strong&gt;SEO Impact&lt;/strong&gt;: Google uses &lt;strong&gt;INP&lt;/strong&gt; to penalize &amp;ldquo;janky&amp;rdquo; sites that feel
  243. sluggish.&lt;/li&gt;
  244. &lt;li&gt;&lt;strong&gt;Performance Strategy&lt;/strong&gt;: Minimize &lt;strong&gt;main-thread blocking JavaScript&lt;/strong&gt;. Use
  245. &lt;strong&gt;Web Workers&lt;/strong&gt; for heavy computations and avoid large, monolithic JS bundles.&lt;/li&gt;
  246. &lt;/ul&gt;
  247. &lt;h3 id="3-cumulative-layout-shift-cls"&gt;3. Cumulative Layout Shift (CLS)&lt;/h3&gt;
  248. &lt;p&gt;&lt;strong&gt;CLS&lt;/strong&gt; measures visual stability. We&amp;rsquo;ve all experienced that frustrating moment
  249. when a button moves just as we&amp;rsquo;re about to click it because an ad or image
  250. loaded late.&lt;/p&gt;
  251. &lt;ul&gt;
  252. &lt;li&gt;&lt;strong&gt;SEO Impact&lt;/strong&gt;: Poor &lt;strong&gt;CLS&lt;/strong&gt; is a direct signal of low-quality &lt;strong&gt;UX&lt;/strong&gt;, which
  253. negatively impacts rankings.&lt;/li&gt;
  254. &lt;li&gt;&lt;strong&gt;Performance Strategy&lt;/strong&gt;: Always define &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes for
  255. images and video. Reserve space for dynamic elements like ads or embeds.&lt;/li&gt;
  256. &lt;/ul&gt;
  257. &lt;h2 id="common-conflicts-and-surgical-solutions"&gt;Common Conflicts and Surgical Solutions&lt;/h2&gt;
  258. &lt;p&gt;While the goals align, the implementation often creates friction. Here is how to
  259. handle the most common &amp;ldquo;SEO vs. Performance&amp;rdquo; battles.&lt;/p&gt;
  260. &lt;h3 id="problem-third-party-scripts-the-silent-killer"&gt;Problem: Third-Party Scripts (The Silent Killer)&lt;/h3&gt;
  261. &lt;p&gt;Marketers demand &lt;strong&gt;Google Tag Manager (GTM)&lt;/strong&gt;, HubSpot, Hotjar, and multiple
  262. social pixels. Each of these adds a &lt;strong&gt;DNS lookup&lt;/strong&gt;, a &lt;strong&gt;TCP connection&lt;/strong&gt;, and
  263. execution time on the main thread.&lt;/p&gt;
  264. &lt;p&gt;&lt;strong&gt;Solution: The &amp;ldquo;Partytown&amp;rdquo; Approach or Server-Side Tracking&lt;/strong&gt; Instead of
  265. loading everything in the browser, consider &lt;strong&gt;server-side tagging&lt;/strong&gt;. If you must
  266. use client-side scripts, use the &lt;code&gt;defer&lt;/code&gt; or &lt;code&gt;async&lt;/code&gt; attributes, or better yet,
  267. use a library like &lt;strong&gt;Partytown&lt;/strong&gt; to run intensive scripts in a &lt;strong&gt;Web Worker&lt;/strong&gt;.&lt;/p&gt;
  268. &lt;blockquote&gt;
  269. &lt;p&gt;&lt;strong&gt;Pro Tip: The GTM Audit&lt;/strong&gt; Never allow &amp;ldquo;container bloat.&amp;rdquo; Every 6 months,
  270. audit your &lt;strong&gt;GTM&lt;/strong&gt; container. If a pixel isn&amp;rsquo;t actively being used for a live
  271. campaign, delete it. A single abandoned LinkedIn pixel can add 200ms to your
  272. &lt;strong&gt;Total Blocking Time (TBT)&lt;/strong&gt;.&lt;/p&gt;
  273. &lt;/blockquote&gt;
  274. &lt;h3 id="problem-high-resolution-visual-content"&gt;Problem: High-Resolution Visual Content&lt;/h3&gt;
  275. &lt;p&gt;SEO experts want &amp;ldquo;rich&amp;rdquo; content with infographics and high-quality hero shots to
  276. keep users engaged (and improve &amp;ldquo;Dwell Time&amp;rdquo;). Performance fans want 20KB
  277. placeholders.&lt;/p&gt;
  278. &lt;p&gt;&lt;strong&gt;Solution: Automated Modern Formats&lt;/strong&gt; Don&amp;rsquo;t choose between quality and speed.
  279. Use Hugo&amp;rsquo;s built-in image processing to generate &lt;strong&gt;WebP&lt;/strong&gt; and &lt;strong&gt;AVIF&lt;/strong&gt; versions
  280. of your images automatically.&lt;/p&gt;
  281. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;{{/* Example: Hugo Image Optimization Snippet */}}&lt;/span&gt;
  282. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Page.Resources.GetMatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hero.jpg&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
  283. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
  284. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$webp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="na"&gt;.Resize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1200x webp q85&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
  285. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;picture&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  286. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt; &lt;span class="na"&gt;srcset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$webp&lt;/span&gt;&lt;span class="na"&gt;.RelPermalink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;image/webp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  287. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="na"&gt;.RelPermalink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;
  288. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="na"&gt;.Width&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;
  289. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="na"&gt;.Height&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;
  290. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Page.Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;
  291. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;loading&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;eager&amp;#34;&lt;/span&gt;
  292. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;fetchpriority&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;high&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  293. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;picture&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  294. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
  295. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-asset-value-vs-performance-impact-matrix"&gt;The &amp;ldquo;Asset Value vs. Performance Impact&amp;rdquo; Matrix&lt;/h2&gt;
  296. &lt;p&gt;When deciding whether to add a new feature or script, use this comparison table
  297. to evaluate the trade-off:&lt;/p&gt;
  298. &lt;table&gt;
  299. &lt;thead&gt;
  300. &lt;tr&gt;
  301. &lt;th style="text-align: left"&gt;Asset Type&lt;/th&gt;
  302. &lt;th style="text-align: left"&gt;SEO Value&lt;/th&gt;
  303. &lt;th style="text-align: left"&gt;Performance Cost&lt;/th&gt;
  304. &lt;th style="text-align: left"&gt;Recommendation&lt;/th&gt;
  305. &lt;/tr&gt;
  306. &lt;/thead&gt;
  307. &lt;tbody&gt;
  308. &lt;tr&gt;
  309. &lt;td style="text-align: left"&gt;&lt;strong&gt;Semantic HTML&lt;/strong&gt;&lt;/td&gt;
  310. &lt;td style="text-align: left"&gt;Extremely High&lt;/td&gt;
  311. &lt;td style="text-align: left"&gt;Zero&lt;/td&gt;
  312. &lt;td style="text-align: left"&gt;Always use. Essential for crawlers.&lt;/td&gt;
  313. &lt;/tr&gt;
  314. &lt;tr&gt;
  315. &lt;td style="text-align: left"&gt;&lt;strong&gt;JSON-LD Schema&lt;/strong&gt;&lt;/td&gt;
  316. &lt;td style="text-align: left"&gt;High&lt;/td&gt;
  317. &lt;td style="text-align: left"&gt;Low&lt;/td&gt;
  318. &lt;td style="text-align: left"&gt;Always use. Negligible impact on speed.&lt;/td&gt;
  319. &lt;/tr&gt;
  320. &lt;tr&gt;
  321. &lt;td style="text-align: left"&gt;&lt;strong&gt;Optimized Images&lt;/strong&gt;&lt;/td&gt;
  322. &lt;td style="text-align: left"&gt;High&lt;/td&gt;
  323. &lt;td style="text-align: left"&gt;Medium&lt;/td&gt;
  324. &lt;td style="text-align: left"&gt;Use &lt;code&gt;srcset&lt;/code&gt; and modern formats.&lt;/td&gt;
  325. &lt;/tr&gt;
  326. &lt;tr&gt;
  327. &lt;td style="text-align: left"&gt;&lt;strong&gt;Web Fonts&lt;/strong&gt;&lt;/td&gt;
  328. &lt;td style="text-align: left"&gt;Medium&lt;/td&gt;
  329. &lt;td style="text-align: left"&gt;Medium/High&lt;/td&gt;
  330. &lt;td style="text-align: left"&gt;Use &lt;code&gt;font-display: swap&lt;/code&gt; and preload critical weights.&lt;/td&gt;
  331. &lt;/tr&gt;
  332. &lt;tr&gt;
  333. &lt;td style="text-align: left"&gt;&lt;strong&gt;Client-side Chat Bot&lt;/strong&gt;&lt;/td&gt;
  334. &lt;td style="text-align: left"&gt;Low&lt;/td&gt;
  335. &lt;td style="text-align: left"&gt;Very High&lt;/td&gt;
  336. &lt;td style="text-align: left"&gt;Load on user interaction only (Lazy Load).&lt;/td&gt;
  337. &lt;/tr&gt;
  338. &lt;tr&gt;
  339. &lt;td style="text-align: left"&gt;&lt;strong&gt;Full GTM Container&lt;/strong&gt;&lt;/td&gt;
  340. &lt;td style="text-align: left"&gt;Medium&lt;/td&gt;
  341. &lt;td style="text-align: left"&gt;High&lt;/td&gt;
  342. &lt;td style="text-align: left"&gt;Audit frequently and use server-side tracking.&lt;/td&gt;
  343. &lt;/tr&gt;
  344. &lt;/tbody&gt;
  345. &lt;/table&gt;
  346. &lt;h2 id="the-hydration-problem-spa-vs-ssg"&gt;The &amp;ldquo;Hydration&amp;rdquo; Problem: SPA vs. SSG&lt;/h2&gt;
  347. &lt;p&gt;If you are using a modern framework like &lt;strong&gt;Next.js&lt;/strong&gt; or &lt;strong&gt;Nuxt&lt;/strong&gt;,
  348. &amp;ldquo;&lt;strong&gt;Hydration&lt;/strong&gt;&amp;rdquo; is your biggest performance enemy. This is the process where the
  349. browser downloads JavaScript to make a static-looking page interactive. For a
  350. content-heavy site, this is often overkill.&lt;/p&gt;
  351. &lt;p&gt;&lt;strong&gt;Static Site Generators&lt;/strong&gt; like &lt;strong&gt;Hugo&lt;/strong&gt; (which powers this site) avoid this
  352. entirely. By delivering pre-rendered HTML and only adding JavaScript where
  353. absolutely necessary, you achieve the &amp;ldquo;Gold Standard&amp;rdquo; of SEO: content that is
  354. instantly indexable &lt;em&gt;and&lt;/em&gt; instantly interactive.&lt;/p&gt;
  355. &lt;p&gt;If you want to dive deeper into how I optimize my Hugo setup for maximum
  356. throughput, I will cover advanced techniques in a future article.&lt;/p&gt;
  357. &lt;h2 id="technical-checklist-for-performance-first-seo"&gt;Technical Checklist for Performance-First SEO&lt;/h2&gt;
  358. &lt;p&gt;To ensure you aren&amp;rsquo;t sacrificing one for the other, follow this checklist during
  359. your next build:&lt;/p&gt;
  360. &lt;ol&gt;
  361. &lt;li&gt;&lt;strong&gt;[ ] Zero-render-blocking CSS&lt;/strong&gt;: Inline &lt;strong&gt;critical CSS&lt;/strong&gt; and load the rest
  362. asynchronously.&lt;/li&gt;
  363. &lt;li&gt;&lt;strong&gt;[ ] Font Subsetting&lt;/strong&gt;: Don&amp;rsquo;t load the entire &amp;ldquo;Roboto&amp;rdquo; family. Only load the
  364. characters you actually use (e.g., Latin-1).&lt;/li&gt;
  365. &lt;li&gt;&lt;strong&gt;[ ] Resource Hints&lt;/strong&gt;: Use &lt;code&gt;preconnect&lt;/code&gt; for essential third-party domains
  366. (like your &lt;strong&gt;CDN&lt;/strong&gt;) and &lt;code&gt;dns-prefetch&lt;/code&gt; for the rest.&lt;/li&gt;
  367. &lt;li&gt;&lt;strong&gt;[ ] Image Dimensions&lt;/strong&gt;: Hardcode width/height to eliminate &lt;strong&gt;CLS&lt;/strong&gt;.&lt;/li&gt;
  368. &lt;li&gt;&lt;strong&gt;[ ] Lazy Loading&lt;/strong&gt;: Apply &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; to everything below the fold.&lt;/li&gt;
  369. &lt;/ol&gt;
  370. &lt;h2 id="common-pitfall-the-lighthouse-score-trap"&gt;Common Pitfall: The &amp;ldquo;Lighthouse Score&amp;rdquo; Trap&lt;/h2&gt;
  371. &lt;p&gt;Don&amp;rsquo;t get obsessed with hitting a 100/100 &lt;strong&gt;Lighthouse score&lt;/strong&gt; at the expense of
  372. functionality. A 95 score with a high-converting &amp;ldquo;Buy Now&amp;rdquo; button is better for
  373. your business than a 100 score on a page that is too stripped down to be useful.&lt;/p&gt;
  374. &lt;p&gt;The goal is &lt;strong&gt;Perceived Performance&lt;/strong&gt;. If the user &lt;em&gt;feels&lt;/em&gt; like the site is
  375. instant, and Google&amp;rsquo;s bots can find the content without being blocked by a
  376. massive JavaScript bundle, you&amp;rsquo;ve won the game.&lt;/p&gt;
  377. &lt;h2 id="conclusion-the-holistic-view"&gt;Conclusion: The Holistic View&lt;/h2&gt;
  378. &lt;p&gt;In 2026, the wall between the &amp;ldquo;Performance Engineer&amp;rdquo; and the &amp;ldquo;SEO Specialist&amp;rdquo;
  379. has crumbled. You can no longer optimize for one without deeply understanding
  380. the other. The most successful sites are those built on a foundation of
  381. &lt;strong&gt;Technical Excellence&lt;/strong&gt;.&lt;/p&gt;
  382. &lt;p&gt;Start with a fast, static foundation. Add your SEO elements surgically. Monitor
  383. your &lt;strong&gt;Core Web Vitals&lt;/strong&gt; religiously. When you treat performance as a core
  384. feature of your SEO strategy, you stop fighting the algorithms and start serving
  385. your audience. And that is exactly what Google wants to reward.&lt;/p&gt;
  386. &lt;blockquote&gt;
  387. &lt;p&gt;Related:&lt;/p&gt;
  388. &lt;ul&gt;
  389. &lt;li&gt;&lt;a href="../mobile-friendly-website-and-why-it-matters/"&gt;Mobile Friendly Website and Why It Matters&lt;/a&gt;&lt;/li&gt;
  390. &lt;li&gt;&lt;a href="../w3c-standards-ignored-by-search-engines/"&gt;W3C Standards Ignored by Search Engines&lt;/a&gt;&lt;/li&gt;
  391. &lt;li&gt;&lt;a href="../why-seo-is-mostly-dead-and-what-replaced-it/"&gt;Why SEO Is Mostly Dead (And What Replaced It)&lt;/a&gt;&lt;/li&gt;
  392. &lt;/ul&gt;
  393. &lt;/blockquote&gt;
  394. </content:encoded>
  395. <dc:creator>Val Paliy</dc:creator>
  396. </item>
  397. <item>
  398. <title>Inside Google Search's Most Radical Redesign in 25 Years</title>
  399. <link>https://valticus.pro/posts/google-search-radical-redesign/</link>
  400. <pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate>
  401. <guid isPermaLink="true">https://valticus.pro/posts/google-search-radical-redesign/</guid>
  402. <description>An in-depth analysis of Google Search's most radical redesign in over a quarter-century, examining the transition from keyword queries to Gemini 3.5 Flash-powered conversational search, autonomous information agents, generative UI, and the removal of FAQ rich results.</description>
  403. <category>Technology</category>
  404. <category>Web Development</category><content:encoded>&lt;h2 id="the-death-of-the-ten-blue-links-paradigm"&gt;The Death of the Ten Blue Links Paradigm&lt;/h2&gt;
  405. &lt;p&gt;For more than a quarter of a century, the basic interface of the internet
  406. remained remarkably unchanged. You opened a browser, navigated to a stark white
  407. homepage with a single search bar, typed in a string of fragmented keywords, and
  408. pressed enter. In return, you received a list of ten blue links.&lt;/p&gt;
  409. &lt;p&gt;That era is officially over.&lt;/p&gt;
  410. &lt;p&gt;Google Search is currently undergoing its most radical redesign since its
  411. inception in 1998. The search engine is pivoting from a passive keyword-matching
  412. directory into an active, conversational AI engine powered by Google&amp;rsquo;s frontier
  413. models. Traditional search results still exist, but they are now heavily
  414. deprioritized in favor of direct, AI-synthesized answers, interactive
  415. applications built on the fly, and autonomous background search agents.&lt;/p&gt;
  416. &lt;figure&gt;
  417. &lt;div class="progressive-image"&gt;
  418. &lt;img class="progressive-image__img"
  419. src="https://valticus.pro/images/google-search-radical-redesign_hu_9de31e5f3d972ecd.webp"
  420. alt="Inside Google Search&amp;#39;s Most Radical Redesign in 25 Years."
  421. width="800"
  422. height="800"&gt;
  423. &lt;/div&gt;
  424. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Inside Google Search&amp;#39;s Most Radical Redesign in 25 Years.&lt;/p&gt;&lt;/figcaption&gt;
  425. &lt;/figure&gt;
  426. &lt;p&gt;Here is a technical breakdown of the major changes rolling out and what they
  427. mean for the future of both consumers and web creators.&lt;/p&gt;
  428. &lt;hr&gt;
  429. &lt;h2 id="1-the-conversational-ai-search-box"&gt;1. The Conversational AI Search Box&lt;/h2&gt;
  430. &lt;p&gt;The iconic blank search bar has been completely reimagined. It is no longer a
  431. simple text input box but a dynamic canvas designed to accept multi-modal
  432. queries.&lt;/p&gt;
  433. &lt;ul&gt;
  434. &lt;li&gt;&lt;strong&gt;Dynamic Expansion:&lt;/strong&gt; The new search box expands as you interact with it,
  435. inviting more than just text queries.&lt;/li&gt;
  436. &lt;li&gt;&lt;strong&gt;Multi-Modal Inputs:&lt;/strong&gt; Users can now seamlessly input text, images, videos,
  437. spreadsheets, PDFs, and even link open Chrome tabs directly into the search
  438. context.&lt;/li&gt;
  439. &lt;li&gt;&lt;strong&gt;Deep Contextual Queries:&lt;/strong&gt; Instead of searching &amp;ldquo;best running shoes,&amp;rdquo; a user
  440. can upload a video of their running gait, link a spreadsheet of their budget
  441. constraints, and ask: &lt;em&gt;&amp;ldquo;Based on my gait and these prices, which shoe should I
  442. buy?&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
  443. &lt;/ul&gt;
  444. &lt;p&gt;This shifts user behavior from &amp;ldquo;keyword hacking&amp;rdquo; to natural, conversational
  445. problem-solving.&lt;/p&gt;
  446. &lt;hr&gt;
  447. &lt;h2 id="2-gemini-35-flash-as-the-default-engine"&gt;2. Gemini 3.5 Flash as the Default Engine&lt;/h2&gt;
  448. &lt;p&gt;Speed has always been a key ranking factor, but in AI search, speed is the
  449. difference between a tool feeling like a helper or a hindrance.&lt;/p&gt;
  450. &lt;p&gt;Google has deployed &lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt; globally as the default engine powering
  451. all &amp;ldquo;AI Mode&amp;rdquo; searches. This frontier AI model has been optimized for low
  452. latency and high throughput, making conversational answers load almost
  453. instantaneously.&lt;/p&gt;
  454. &lt;p&gt;This change solves the early complaint of &amp;ldquo;AI Overviews&amp;rdquo; taking too long to
  455. generate compared to traditional blue links. With Gemini 3.5 Flash, the
  456. conversational response is compiled and streamed in real-time, matching or
  457. exceeding the speed of legacy search queries.&lt;/p&gt;
  458. &lt;hr&gt;
  459. &lt;h2 id="3-247-information-agents"&gt;3. 24/7 Information Agents&lt;/h2&gt;
  460. &lt;p&gt;Perhaps the most significant paradigm shift is the introduction of &lt;strong&gt;Autonomous
  461. Search Agents&lt;/strong&gt;.&lt;/p&gt;
  462. &lt;p&gt;Instead of performing the same manual search every few days, users (initially
  463. rolling out to Google One AI Premium subscribers, including AI Pro and Ultra
  464. tiers) can spin up persistent background agents.&lt;/p&gt;
  465. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Prompt: &amp;#34;Monitor the web for new 2-bedroom apartment listings in downtown Austin under $2,500/month that are pet-friendly, and alert me the moment they are posted.&amp;#34;
  466. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once activated, these agents work 24/7. They continuously query, filter, and
  467. analyze the web, sending structured notifications and updates directly to the
  468. user. This turns Google Search from a pull-based tool (where you must go look
  469. for info) to a push-based service (where the info finds you).&lt;/p&gt;
  470. &lt;hr&gt;
  471. &lt;h2 id="4-generative-ui-on-the-fly-micro-apps"&gt;4. Generative UI: On-the-Fly Micro-Apps&lt;/h2&gt;
  472. &lt;p&gt;Traditionally, Google served static answers or extracted snippets. Now, Google
  473. Search can code and build custom, interactive widgets and visualizations on the
  474. fly.&lt;/p&gt;
  475. &lt;p&gt;If a user inputs a complex math query or asks for a comparison of multiple
  476. financial options, Google Search writes code behind the scenes and renders a
  477. custom interactive interface:&lt;/p&gt;
  478. &lt;ul&gt;
  479. &lt;li&gt;&lt;strong&gt;Dynamic Graphs:&lt;/strong&gt; Real-time plotting of data based on user queries.&lt;/li&gt;
  480. &lt;li&gt;&lt;strong&gt;Interactive Simulations:&lt;/strong&gt; Adjust sliders to see how changes affect a
  481. scenario (e.g., mortgage interest calculators).&lt;/li&gt;
  482. &lt;li&gt;&lt;strong&gt;Mini-Apps:&lt;/strong&gt; Custom comparison charts or calculators built on the fly
  483. specifically for that user&amp;rsquo;s query.&lt;/li&gt;
  484. &lt;/ul&gt;
  485. &lt;p&gt;For developers and webmasters, this is a massive shift: Google is no longer just
  486. crawling your content; it is replacing the utility of simple web applications
  487. directly on the search page.&lt;/p&gt;
  488. &lt;hr&gt;
  489. &lt;h2 id="5-expanded-personal-intelligence"&gt;5. Expanded Personal Intelligence&lt;/h2&gt;
  490. &lt;p&gt;Google is leveraging its ecosystem advantage by connecting Search directly to
  491. your personal data.&lt;/p&gt;
  492. &lt;p&gt;Without requiring a premium subscription, the search engine now securely
  493. connects to your Google workspace apps, including:&lt;/p&gt;
  494. &lt;ul&gt;
  495. &lt;li&gt;&lt;strong&gt;Gmail:&lt;/strong&gt; Finding flight confirmations, receipts, or email threads.&lt;/li&gt;
  496. &lt;li&gt;&lt;strong&gt;Google Photos:&lt;/strong&gt; Searching for specific objects or dates in your photo
  497. history.&lt;/li&gt;
  498. &lt;li&gt;&lt;strong&gt;Google Calendar (Upcoming):&lt;/strong&gt; Cross-referencing schedules to answer personal
  499. planning queries.&lt;/li&gt;
  500. &lt;/ul&gt;
  501. &lt;p&gt;Google implements strict privacy boundaries, ensuring personal data is never
  502. used to train public AI models or served to other users. However, for the end
  503. user, Google Search is now a unified personal assistant that knows both the
  504. public web and your private life.&lt;/p&gt;
  505. &lt;hr&gt;
  506. &lt;h2 id="6-the-webmaster-impact-faq-rich-results-phased-out"&gt;6. The Webmaster Impact: FAQ Rich Results Phased Out&lt;/h2&gt;
  507. &lt;p&gt;On the SEO and web publisher side, Google has quietly made a major change: the
  508. official removal of &lt;strong&gt;FAQ rich results&lt;/strong&gt; from search pages.&lt;/p&gt;
  509. &lt;p&gt;For years, webmasters used Schema.org structured data to add expandable Q&amp;amp;A
  510. dropdowns under their search listings, occupying valuable organic real estate.
  511. Google has phased these out to declutter the Search Engine Results Pages (SERPs)
  512. and free up space for AI summaries and Generative UI widgets.&lt;/p&gt;
  513. &lt;p&gt;This signals a clear message to webmasters: Google is reclaiming the SERP space.
  514. If you want visibility, you can no longer rely on simple schema hacks to stand
  515. out.&lt;/p&gt;
  516. &lt;hr&gt;
  517. &lt;h2 id="what-this-means-for-seo-and-web-publishers"&gt;What This Means for SEO and Web Publishers&lt;/h2&gt;
  518. &lt;p&gt;This redesign marks the transition from &lt;strong&gt;SEO (Search Engine Optimization)&lt;/strong&gt; to
  519. &lt;strong&gt;AEO (Answer Engine Optimization)&lt;/strong&gt;.&lt;/p&gt;
  520. &lt;p&gt;If Google is synthesizing answers directly on the page and using autonomous
  521. agents to fetch updates, traffic to traditional content sites will inevitably
  522. decline for simple informational queries.&lt;/p&gt;
  523. &lt;p&gt;To survive in this new ecosystem, web publishers must adapt:&lt;/p&gt;
  524. &lt;ol&gt;
  525. &lt;li&gt;&lt;strong&gt;Optimize for LLM Retrieval:&lt;/strong&gt; Ensure your content is structured clearly,
  526. with authoritative, original insights that AI models want to cite.&lt;/li&gt;
  527. &lt;li&gt;&lt;strong&gt;Prioritize Deep Context:&lt;/strong&gt; Simple &amp;ldquo;what is&amp;rdquo; articles are easily answered by
  528. Gemini. Focus on high-value, experiential content, personal case studies, and
  529. deep technical guides that AI cannot easily replicate.&lt;/li&gt;
  530. &lt;li&gt;&lt;strong&gt;Build Direct Brand Audience:&lt;/strong&gt; Do not rely solely on Google for traffic.
  531. Invest in newsletters, direct communities, and bookmark-worthy content that
  532. users seek out directly.&lt;/li&gt;
  533. &lt;/ol&gt;
  534. &lt;p&gt;For more technical guidance on navigating this transition, consult Google&amp;rsquo;s
  535. official documentation. You can read the
  536. &lt;a href="https://blog.google"&gt;Official Announcement on the Google Blog&lt;/a&gt; or dive into the
  537. strategies outlined in Google&amp;rsquo;s AEO Guide to align your website with these
  538. architectural changes.&lt;/p&gt;
  539. &lt;blockquote&gt;
  540. &lt;p&gt;Related:&lt;/p&gt;
  541. &lt;ul&gt;
  542. &lt;li&gt;&lt;a href="../it-is-time-to-ditch-google-chrome/"&gt;It Is Time to Ditch Google Chrome&lt;/a&gt;&lt;/li&gt;
  543. &lt;li&gt;&lt;a href="../w3c-standards-ignored-by-search-engines/"&gt;W3C Standards Ignored by Search Engines&lt;/a&gt;&lt;/li&gt;
  544. &lt;li&gt;&lt;a href="../why-seo-is-mostly-dead-and-what-replaced-it/"&gt;Why SEO Is Mostly Dead (And What Replaced It)&lt;/a&gt;&lt;/li&gt;
  545. &lt;/ul&gt;
  546. &lt;/blockquote&gt;
  547. </content:encoded>
  548. <dc:creator>Val Paliy</dc:creator>
  549. </item>
  550. <item>
  551. <title>Build a Portfolio Without React: A Step-by-Step Guide</title>
  552. <link>https://valticus.pro/posts/build-a-portfolio-without-react-a-step-by-step-guide/</link>
  553. <pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate>
  554. <guid isPermaLink="true">https://valticus.pro/posts/build-a-portfolio-without-react-a-step-by-step-guide/</guid>
  555. <description>A comprehensive tutorial for creating a professional developer portfolio using static site generation and modern CSS techniques, without relying on React or heavy JavaScript frameworks.</description>
  556. <category>Web Development</category><content:encoded>&lt;h2 id="why-skip-react-for-your-portfolio"&gt;Why Skip React for Your Portfolio?&lt;/h2&gt;
  557. &lt;p&gt;If you&amp;rsquo;re a React developer, building your portfolio with React seems like a
  558. &amp;ldquo;no-brainer.&amp;rdquo; It shows you know the framework, right? Not necessarily. In 2026,
  559. the real mark of a senior developer is the ability to choose the &lt;strong&gt;right tool
  560. for the job&lt;/strong&gt;, not just the one they are most comfortable with.&lt;/p&gt;
  561. &lt;p&gt;Reaching for a heavy JavaScript framework for a site that is essentially 90%
  562. static text and images introduces what I call the &lt;strong&gt;&amp;ldquo;React Tax&amp;rdquo;&lt;/strong&gt;:&lt;/p&gt;
  563. &lt;ul&gt;
  564. &lt;li&gt;&lt;strong&gt;Bundle Bloat&lt;/strong&gt;: You&amp;rsquo;re shipping 40KB+ of framework code before the user sees
  565. a single pixel.&lt;/li&gt;
  566. &lt;li&gt;&lt;strong&gt;Hydration Cost&lt;/strong&gt;: The browser has to execute JavaScript just to make your
  567. text readable.&lt;/li&gt;
  568. &lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: Dependencies rot. A portfolio built in React 18 will need an
  569. upgrade in two years; a portfolio built in Hugo or raw HTML will work for a
  570. decade.&lt;/li&gt;
  571. &lt;/ul&gt;
  572. &lt;figure&gt;
  573. &lt;div class="progressive-image"&gt;
  574. &lt;img class="progressive-image__img"
  575. src="https://valticus.pro/images/build-a-portfolio-without-react-a-step-by-step-guide_hu_d5b85cabf12c9284.webp"
  576. alt="Build a Portfolio Without React: A Step-by-Step Guide."
  577. width="800"
  578. height="436"&gt;
  579. &lt;/div&gt;
  580. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Build a Portfolio Without React: A Step-by-Step Guide.&lt;/p&gt;&lt;/figcaption&gt;
  581. &lt;/figure&gt;
  582. &lt;p&gt;A portfolio built with static HTML and modern CSS demonstrates that you
  583. understand the &lt;strong&gt;web&amp;rsquo;s fundamentals&lt;/strong&gt;: performance, accessibility, and the DOM.&lt;/p&gt;
  584. &lt;h2 id="choose-your-approach-the-content-first-model"&gt;Choose Your Approach: The Content-First Model&lt;/h2&gt;
  585. &lt;p&gt;While you could write every HTML file by hand, a &lt;strong&gt;Static Site Generator (SSG)&lt;/strong&gt;
  586. gives you the best of both worlds: a component-like development experience
  587. without the client-side overhead.&lt;/p&gt;
  588. &lt;p&gt;In this guide, we’ll use &lt;strong&gt;Hugo&lt;/strong&gt;. In a previous comparison of static site
  589. generators, I&amp;rsquo;ve noted that Hugo is the gold standard for speed and developer
  590. experience in the static world.&lt;/p&gt;
  591. &lt;h2 id="step-1-initialize-your-project"&gt;Step 1: Initialize Your Project&lt;/h2&gt;
  592. &lt;p&gt;First, install Hugo and scaffold your site. We’re going to build this without a
  593. pre-made theme to truly understand the architecture.&lt;/p&gt;
  594. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new site my-portfolio
  595. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-portfolio
  596. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
  597. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create your basic layout structure:&lt;/p&gt;
  598. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p layouts/_default layouts/partials
  599. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch layouts/_default/baseof.html layouts/_default/list.html layouts/_default/single.html
  600. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch layouts/index.html
  601. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-2-the-base-template"&gt;Step 2: The &amp;ldquo;Base&amp;rdquo; Template&lt;/h2&gt;
  602. &lt;p&gt;The &lt;code&gt;baseof.html&lt;/code&gt; file is your &amp;ldquo;Master Page.&amp;rdquo; It contains the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and the
  603. structure shared by every page.&lt;/p&gt;
  604. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
  605. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  606. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  607. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  608. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  609. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Title }} | {{ .Site.Title }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  610. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;link&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/css/style.css&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  611. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  612. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  613. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ partial &amp;#34;header.html&amp;#34; . }}
  614. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ block &amp;#34;main&amp;#34; . }}{{ end }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  615. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ partial &amp;#34;footer.html&amp;#34; . }}
  616. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  617. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  618. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-3-architecture-for-projects"&gt;Step 3: Architecture for Projects&lt;/h2&gt;
  619. &lt;p&gt;Your projects should be &amp;ldquo;First Class Citizens&amp;rdquo; in your codebase. Instead of
  620. hardcoding them into the homepage, use Hugo&amp;rsquo;s content model.&lt;/p&gt;
  621. &lt;p&gt;Create your projects:&lt;/p&gt;
  622. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new projects/my-cool-app.md
  623. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo new projects/api-wrapper.md
  624. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the markdown frontmatter, add custom metadata:&lt;/p&gt;
  625. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
  626. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;The Ultimate API Wrapper&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
  627. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;A high-performance Go library for handling rate-limited APIs.&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
  628. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tech_stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Go&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Redis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Docker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  629. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;github_link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://github.com/valpaliy/api-wrapper&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
  630. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  631. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;images/projects/api-wrapper.jpg&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
  632. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
  633. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-4-the-project-gallery-the-hugo-logic"&gt;Step 4: The Project Gallery (The Hugo Logic)&lt;/h2&gt;
  634. &lt;p&gt;Now, let’s build a component that automatically lists your featured projects on
  635. the homepage (&lt;code&gt;layouts/index.html&lt;/code&gt;).&lt;/p&gt;
  636. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ define &amp;#34;main&amp;#34; }}
  637. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hero&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  638. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hi, I&amp;#39;m {{ .Site.Author.name }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  639. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;I build high-performance web experiences without the fluff.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  640. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  641. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  642. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;projects-grid&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  643. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ range where .Site.RegularPages &amp;#34;Section&amp;#34; &amp;#34;projects&amp;#34; }} {{ if
  644. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; .Params.featured }}
  645. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;project-card&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  646. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Params.image }}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Title }}&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  647. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Title }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  648. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Description }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  649. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  650. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ range .Params.tech_stack }}
  651. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ . }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  652. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ end }}
  653. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  654. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Permalink }}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;btn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;View Case Study&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  655. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  656. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ end }} {{ end }}
  657. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  658. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
  659. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-5-modern-css-layouts-bento-grids-and-more"&gt;Step 5: Modern CSS Layouts (Bento Grids and More)&lt;/h2&gt;
  660. &lt;p&gt;Forget Bootstrap. Use &lt;strong&gt;CSS Grid&lt;/strong&gt; to create a modern, responsive layout.&lt;/p&gt;
  661. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  662. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--bg-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#f9fafb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  663. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#111827&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  664. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--accent-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#2563eb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  665. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;--card-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  666. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  667. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  668. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;projects-grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  669. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  670. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kc"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  671. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  672. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  673. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  674. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  675. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;project-card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  676. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  677. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="kc"&gt;solid&lt;/span&gt; &lt;span class="mh"&gt;#e5e7eb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  678. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  679. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  680. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;transform&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt; &lt;span class="nb"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  681. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  682. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  683. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;project-card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  684. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;-8&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  685. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;-5&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="nb"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  686. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  687. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pro Tip: CSS Custom Properties&lt;/strong&gt; Use &lt;strong&gt;CSS Custom Properties&lt;/strong&gt; (variables) for
  688. theming. This makes it trivial to add a &amp;ldquo;Dark Mode&amp;rdquo; later by just swapping the
  689. values in a &lt;code&gt;:root[data-theme='dark']&lt;/code&gt; block.&lt;/p&gt;
  690. &lt;h2 id="step-6-handling-interactivity-without-the-weight"&gt;Step 6: Handling Interactivity without the Weight&lt;/h2&gt;
  691. &lt;p&gt;You don&amp;rsquo;t need a 30KB framework for a mobile menu or a simple filter. Use
  692. &lt;strong&gt;Vanilla JavaScript&lt;/strong&gt;.&lt;/p&gt;
  693. &lt;p&gt;&lt;strong&gt;Common Pitfall: The &amp;ldquo;Everything is a Component&amp;rdquo; Mindset&lt;/strong&gt; Not every piece of
  694. UI needs to be a &amp;ldquo;component&amp;rdquo; with state. For a portfolio, most interactivity is
  695. just &lt;strong&gt;DOM manipulation&lt;/strong&gt;.&lt;/p&gt;
  696. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// A simple, accessible mobile menu toggle
  697. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggle&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;#menu-toggle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  698. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;menu&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;#main-menu&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  699. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  700. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;click&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  701. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isExpanded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aria-expanded&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  702. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aria-expanded&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isExpanded&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  703. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;is-active&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  704. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  705. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you truly need more complex state (e.g., a live-search for your blog posts),
  706. consider &lt;strong&gt;Petite-Vue&lt;/strong&gt; or &lt;strong&gt;Alpine.js&lt;/strong&gt;. They provide a Vue-like experience but
  707. are optimized for &amp;ldquo;sprinkling&amp;rdquo; interactivity on top of static HTML.&lt;/p&gt;
  708. &lt;h2 id="step-7-static-forms-and-search"&gt;Step 7: Static Forms and Search&lt;/h2&gt;
  709. &lt;p&gt;The two biggest hurdles for static sites are contact forms and search.&lt;/p&gt;
  710. &lt;ol&gt;
  711. &lt;li&gt;&lt;strong&gt;Forms&lt;/strong&gt;: Use a service like &lt;strong&gt;Netlify Forms&lt;/strong&gt;, &lt;strong&gt;Formspree&lt;/strong&gt;, or &lt;strong&gt;Basin&lt;/strong&gt;.
  712. You just add a &lt;code&gt;data-netlify=&amp;quot;true&amp;quot;&lt;/code&gt; attribute to your HTML form, and Netlify
  713. handles the submission and spam filtering.&lt;/li&gt;
  714. &lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt;: For a portfolio, you usually don&amp;rsquo;t need a server-side search. Use
  715. &lt;strong&gt;Fuse.js&lt;/strong&gt; or &lt;strong&gt;Pagefind&lt;/strong&gt;. These tools index your site at build time and
  716. provide a lightning-fast client-side search interface.&lt;/li&gt;
  717. &lt;/ol&gt;
  718. &lt;h2 id="step-8-image-optimization-the-hugo-superpower"&gt;Step 8: Image Optimization (The Hugo Superpower)&lt;/h2&gt;
  719. &lt;p&gt;Large images are the #1 killer of portfolio performance. Hugo can automatically
  720. process your images.&lt;/p&gt;
  721. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ $image := resources.Get .Params.image }} {{ $optimized := $image.Resize &amp;#34;800x
  722. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;webp q75&amp;#34; }}
  723. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;
  724. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $optimized.RelPermalink }}&amp;#34;&lt;/span&gt;
  725. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $optimized.Width }}&amp;#34;&lt;/span&gt;
  726. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ $optimized.Height }}&amp;#34;&lt;/span&gt;
  727. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{{ .Title }}&amp;#34;&lt;/span&gt;
  728. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  729. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This single line of code ensures that no matter how big the original file was,
  730. the user only downloads a perfectly sized, compressed &lt;strong&gt;WebP&lt;/strong&gt; image.&lt;/p&gt;
  731. &lt;h2 id="conclusion-the-professional-edge"&gt;Conclusion: The Professional Edge&lt;/h2&gt;
  732. &lt;p&gt;Building your portfolio without React is more than a technical exercise; it&amp;rsquo;s a
  733. statement. It says: &lt;em&gt;&amp;ldquo;I understand how the web works. I care about my users'
  734. bandwidth. I can build fast, resilient systems.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
  735. &lt;p&gt;If you want to see a full-scale example of this philosophy in action, check out
  736. my Introducing Olivero Hugo Theme post. It’s a project that brings world-class
  737. &lt;strong&gt;accessibility&lt;/strong&gt; and &lt;strong&gt;performance&lt;/strong&gt; to the Hugo ecosystem without the overhead
  738. of modern JavaScript frameworks.&lt;/p&gt;
  739. &lt;p&gt;Your portfolio is your calling card. Make sure it loads before the hiring
  740. manager gets bored and clicks away.&lt;/p&gt;
  741. &lt;hr&gt;
  742. &lt;p&gt;&lt;em&gt;Struggling with a specific Hugo layout or CSS grid issue? Drop me a line on
  743. social media—I’m always happy to help fellow &amp;ldquo;lean web&amp;rdquo; enthusiasts.&lt;/em&gt;&lt;/p&gt;
  744. &lt;blockquote&gt;
  745. &lt;p&gt;Related:&lt;/p&gt;
  746. &lt;ul&gt;
  747. &lt;li&gt;&lt;a href="../building-personal-portfolio-tailwind-css/"&gt;Building a Personal Portfolio with Tailwind CSS&lt;/a&gt;&lt;/li&gt;
  748. &lt;li&gt;&lt;a href="../introducing-olivero-hugo-theme/"&gt;Introducing Olivero Hugo Theme&lt;/a&gt;&lt;/li&gt;
  749. &lt;/ul&gt;
  750. &lt;/blockquote&gt;
  751. </content:encoded>
  752. <dc:creator>Val Paliy</dc:creator>
  753. </item>
  754. <item>
  755. <title>Accessibility Is Still Broken (Here's Why)</title>
  756. <link>https://valticus.pro/posts/accessibility-is-still-broken-heres-why/</link>
  757. <pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate>
  758. <guid isPermaLink="true">https://valticus.pro/posts/accessibility-is-still-broken-heres-why/</guid>
  759. <description>An unfiltered look at why web accessibility remains a critical failure in 2026, the common pitfalls of modern frameworks, and how to build truly inclusive digital experiences.</description>
  760. <category>Web Development</category><content:encoded>&lt;h2 id="the-accessibility-paradox"&gt;The Accessibility Paradox&lt;/h2&gt;
  761. &lt;p&gt;It is 2026, and we are still failing at the basics. We&amp;rsquo;ve had &lt;strong&gt;WCAG (Web
  762. Content Accessibility Guidelines)&lt;/strong&gt; for decades. Browser support for &lt;strong&gt;ARIA
  763. (Accessible Rich Internet Applications)&lt;/strong&gt; is better than ever. We have an
  764. explosion of &lt;strong&gt;automated testing tools&lt;/strong&gt;, linters, and &amp;ldquo;accessible&amp;rdquo; &lt;strong&gt;component
  765. libraries&lt;/strong&gt;. Yet, the annual &lt;strong&gt;WebAIM Million report&lt;/strong&gt; continues to show that
  766. over 95% of the top million homepages have detectable WCAG 2 failures.&lt;/p&gt;
  767. &lt;p&gt;The paradox is striking: as our tools get &amp;ldquo;smarter,&amp;rdquo; our websites often become
  768. less usable for people with disabilities. We&amp;rsquo;ve traded simplicity and semantic
  769. clarity for complex abstractions and &amp;ldquo;developer experience,&amp;rdquo; often at the direct
  770. expense of the end-user. Accessibility isn&amp;rsquo;t broken because the technology is
  771. lacking; it&amp;rsquo;s broken because our &lt;strong&gt;mental models&lt;/strong&gt; and development workflows
  772. treat it as a secondary decoration rather than a foundational requirement.&lt;/p&gt;
  773. &lt;figure&gt;
  774. &lt;div class="progressive-image"&gt;
  775. &lt;img class="progressive-image__img"
  776. src="https://valticus.pro/images/accessibility-is-still-broken-heres-why_hu_3d2d702d1b003357.webp"
  777. alt="Accessibility Is Still Broken (Here&amp;#39;s Why)."
  778. width="800"
  779. height="436"&gt;
  780. &lt;/div&gt;
  781. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Accessibility Is Still Broken (Here&amp;#39;s Why).&lt;/p&gt;&lt;/figcaption&gt;
  782. &lt;/figure&gt;
  783. &lt;h2 id="the-automated-testing-illusion"&gt;The Automated Testing Illusion&lt;/h2&gt;
  784. &lt;p&gt;One of the biggest contributors to the current state of the web is the
  785. over-reliance on automated tools. Developers run a &lt;strong&gt;Lighthouse audit&lt;/strong&gt;, see a
  786. green &amp;ldquo;100&amp;rdquo; score, and move on. This is a dangerous delusion.&lt;/p&gt;
  787. &lt;p&gt;Automated tools are excellent for catching &amp;ldquo;low-hanging fruit&amp;rdquo;—missing &lt;strong&gt;alt
  788. text&lt;/strong&gt;, poor &lt;strong&gt;color contrast&lt;/strong&gt;, or missing &lt;strong&gt;lang attributes&lt;/strong&gt;. However, they
  789. are fundamentally incapable of evaluating &lt;strong&gt;meaning&lt;/strong&gt; and &lt;strong&gt;context&lt;/strong&gt;. A
  790. computer cannot tell you if your navigation flow makes sense to a &lt;strong&gt;screen
  791. reader&lt;/strong&gt; user or if a &lt;strong&gt;modal dialog&lt;/strong&gt; traps focus correctly.&lt;/p&gt;
  792. &lt;table&gt;
  793. &lt;thead&gt;
  794. &lt;tr&gt;
  795. &lt;th&gt;Feature&lt;/th&gt;
  796. &lt;th&gt;Automated Testing&lt;/th&gt;
  797. &lt;th&gt;Manual/User Testing&lt;/th&gt;
  798. &lt;/tr&gt;
  799. &lt;/thead&gt;
  800. &lt;tbody&gt;
  801. &lt;tr&gt;
  802. &lt;td&gt;&lt;strong&gt;Color Contrast&lt;/strong&gt;&lt;/td&gt;
  803. &lt;td&gt;Excellent (mostly)&lt;/td&gt;
  804. &lt;td&gt;Necessary for transparency/gradients&lt;/td&gt;
  805. &lt;/tr&gt;
  806. &lt;tr&gt;
  807. &lt;td&gt;&lt;strong&gt;Alt Text Presence&lt;/strong&gt;&lt;/td&gt;
  808. &lt;td&gt;Catches missing tags&lt;/td&gt;
  809. &lt;td&gt;Verifies if text is actually descriptive&lt;/td&gt;
  810. &lt;/tr&gt;
  811. &lt;tr&gt;
  812. &lt;td&gt;&lt;strong&gt;Keyboard Navigation&lt;/strong&gt;&lt;/td&gt;
  813. &lt;td&gt;Very Limited&lt;/td&gt;
  814. &lt;td&gt;Only way to verify logical tab order&lt;/td&gt;
  815. &lt;/tr&gt;
  816. &lt;tr&gt;
  817. &lt;td&gt;&lt;strong&gt;Screen Reader Flow&lt;/strong&gt;&lt;/td&gt;
  818. &lt;td&gt;Non-existent&lt;/td&gt;
  819. &lt;td&gt;Crucial for UX and context&lt;/td&gt;
  820. &lt;/tr&gt;
  821. &lt;tr&gt;
  822. &lt;td&gt;&lt;strong&gt;Focus Management&lt;/strong&gt;&lt;/td&gt;
  823. &lt;td&gt;Limited&lt;/td&gt;
  824. &lt;td&gt;Essential for SPAs and Modals&lt;/td&gt;
  825. &lt;/tr&gt;
  826. &lt;/tbody&gt;
  827. &lt;/table&gt;
  828. &lt;p&gt;&lt;strong&gt;Common Pitfall: The &amp;ldquo;Green Score&amp;rdquo; Trap&lt;/strong&gt; Never assume a 100% Lighthouse score
  829. means your site is accessible. It only means you&amp;rsquo;ve passed the subset of rules
  830. that a machine can programmatically verify. You can have a &amp;ldquo;perfect&amp;rdquo; score on a
  831. site that is completely unusable for a keyboard-only user.&lt;/p&gt;
  832. &lt;h2 id="javascripts-accessibility-debt"&gt;JavaScript&amp;rsquo;s Accessibility Debt&lt;/h2&gt;
  833. &lt;p&gt;The rise of &lt;strong&gt;Single Page Applications (SPAs)&lt;/strong&gt; and heavy &lt;strong&gt;JavaScript
  834. frameworks&lt;/strong&gt; has introduced a massive &amp;ldquo;accessibility debt.&amp;rdquo; While React, Vue,
  835. and Svelte have made progress, the default patterns they encourage often lead to
  836. broken experiences.&lt;/p&gt;
  837. &lt;h3 id="the-focus-management-nightmare"&gt;The Focus Management Nightmare&lt;/h3&gt;
  838. &lt;p&gt;In a traditional multi-page website, a link click triggers a browser reload, and
  839. focus naturally moves to the top of the new page. In an SPA, a &amp;ldquo;route change&amp;rdquo; is
  840. just a &lt;strong&gt;DOM update&lt;/strong&gt;. If you don&amp;rsquo;t manually manage &lt;strong&gt;focus management&lt;/strong&gt;, the
  841. user&amp;rsquo;s focus remains on the now-non-existent link or jumps back to the body,
  842. leaving screen reader users confused and lost.&lt;/p&gt;
  843. &lt;h3 id="the-div-button-anti-pattern"&gt;The Div-Button Anti-Pattern&lt;/h3&gt;
  844. &lt;p&gt;I see this everywhere: a &lt;code&gt;div&lt;/code&gt; or a &lt;code&gt;span&lt;/code&gt; with an &lt;code&gt;onClick&lt;/code&gt; handler styled to
  845. look like a button. This is the height of technical laziness. A real &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;
  846. gives you keyboard support (Enter/Space), focus states, and the correct role for
  847. free. When you use a &lt;code&gt;div&lt;/code&gt;, you have to manually re-implement &lt;strong&gt;tabindex&lt;/strong&gt;,
  848. keyboard listeners, and &lt;strong&gt;ARIA roles&lt;/strong&gt;. You will almost certainly forget
  849. something.&lt;/p&gt;
  850. &lt;p&gt;&lt;strong&gt;Code Comparison: The Right Way vs. The Lazy Way&lt;/strong&gt;&lt;/p&gt;
  851. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- THE LAZY WAY (DO NOT DO THIS) --&amp;gt;&lt;/span&gt;
  852. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;my-button&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;handleSubmit()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  853. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Issues: No keyboard support, no screen reader role, no focus state --&amp;gt;&lt;/span&gt;
  854. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  855. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- THE &amp;#34;REPAIR&amp;#34; WAY (BETTER, BUT REDUNDANT) --&amp;gt;&lt;/span&gt;
  856. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
  857. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;my-button&amp;#34;&lt;/span&gt;
  858. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;
  859. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;tabindex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
  860. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;handleSubmit()&amp;#34;&lt;/span&gt;
  861. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;onkeydown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;if(event.key===&amp;#39;Enter&amp;#39;||event.key===&amp;#39; &amp;#39;) handleSubmit()&amp;#34;&lt;/span&gt;
  862. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  863. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Submit
  864. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  865. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  866. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- THE CORRECT WAY (DO THIS) --&amp;gt;&lt;/span&gt;
  867. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;my-button&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;handleSubmit()&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  868. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Benefit: 100% accessible by default with zero extra code --&amp;gt;&lt;/span&gt;
  869. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-well-fix-it-later-mentality"&gt;The &amp;ldquo;We&amp;rsquo;ll Fix It Later&amp;rdquo; Mentality&lt;/h2&gt;
  870. &lt;p&gt;In many agile environments, accessibility is treated like &amp;ldquo;polishing&amp;rdquo;—something
  871. to be done in a later sprint that never comes. This approach is technically and
  872. financially irresponsible.&lt;/p&gt;
  873. &lt;p&gt;Retrofitting accessibility into a completed application is exponentially more
  874. expensive than building it in from the start. It&amp;rsquo;s like trying to add an
  875. elevator to a skyscraper after the foundation and frame are already built. If
  876. you treat accessibility as a &lt;strong&gt;non-functional requirement&lt;/strong&gt; (like security or
  877. performance), you avoid the &amp;ldquo;accessibility tax&amp;rdquo; that comes with refactoring
  878. broken components.&lt;/p&gt;
  879. &lt;blockquote&gt;
  880. &lt;p&gt;&amp;ldquo;Accessibility is not a feature. It is a fundamental property of the web.&amp;rdquo;&lt;/p&gt;
  881. &lt;/blockquote&gt;
  882. &lt;h2 id="framework-defaults-and-the-shadow-dom"&gt;Framework Defaults and the &amp;ldquo;Shadow DOM&amp;rdquo;&lt;/h2&gt;
  883. &lt;p&gt;Many modern component libraries ship with &lt;strong&gt;zero-style foundations&lt;/strong&gt; that claim
  884. to be accessible. While some (like &lt;strong&gt;Radix UI&lt;/strong&gt; or &lt;strong&gt;Headless UI&lt;/strong&gt;) are
  885. excellent, others prioritize visual flexibility over structural integrity. We&amp;rsquo;ve
  886. seen a disturbing trend of stripping away default focus styles (&lt;code&gt;outline: none&lt;/code&gt;)
  887. without providing a high-contrast alternative.&lt;/p&gt;
  888. &lt;p&gt;&lt;strong&gt;Pro Tip: Debugging with CSS&lt;/strong&gt; Use a &amp;ldquo;stress-test&amp;rdquo; stylesheet during
  889. development to highlight common accessibility errors visually. You can add this
  890. to your development build to make mistakes impossible to ignore:&lt;/p&gt;
  891. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Highlight images without alt attributes */&lt;/span&gt;
  892. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;not&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="nt"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  893. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="kc"&gt;solid&lt;/span&gt; &lt;span class="kc"&gt;red&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  894. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  895. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  896. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Highlight empty buttons */&lt;/span&gt;
  897. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;empty&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  898. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="kc"&gt;solid&lt;/span&gt; &lt;span class="kc"&gt;orange&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  899. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  900. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  901. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Highlight links with role=&amp;#34;button&amp;#34; (use a button instead!) */&lt;/span&gt;
  902. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;button&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  903. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="kc"&gt;solid&lt;/span&gt; &lt;span class="kc"&gt;purple&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  904. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  905. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mobile-accessibility-the-forgotten-frontier"&gt;Mobile Accessibility: The Forgotten Frontier&lt;/h2&gt;
  906. &lt;p&gt;We often forget that accessibility extends to mobile devices. Small touch
  907. targets, lack of gesture alternatives, and broken zoom behavior are rampant. If
  908. your website disables &lt;strong&gt;user-scalable zoom&lt;/strong&gt; (&lt;code&gt;user-scalable=no&lt;/code&gt;), you are
  909. actively harming users with low vision.&lt;/p&gt;
  910. &lt;p&gt;Mobile screen readers (&lt;strong&gt;VoiceOver&lt;/strong&gt; on iOS and &lt;strong&gt;TalkBack&lt;/strong&gt; on Android) work
  911. differently than their desktop counterparts. Testing on a physical device is the
  912. only way to ensure your mobile experience isn&amp;rsquo;t a frustrating maze of &amp;ldquo;unlabeled
  913. button&amp;rdquo; announcements.&lt;/p&gt;
  914. &lt;h2 id="a-practical-accessibility-audit-checklist"&gt;A Practical Accessibility Audit Checklist&lt;/h2&gt;
  915. &lt;p&gt;To move beyond the broken state of the web, every developer should follow a
  916. manual checklist before merging a PR:&lt;/p&gt;
  917. &lt;ol&gt;
  918. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Keyboard Only&lt;/strong&gt;: Can I navigate the entire feature using only the &lt;code&gt;Tab&lt;/code&gt;
  919. and &lt;code&gt;Shift+Tab&lt;/code&gt; keys?&lt;/li&gt;
  920. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Visible Focus&lt;/strong&gt;: Can I clearly see where the focus is at all times? (No
  921. &lt;code&gt;outline: none&lt;/code&gt;!)&lt;/li&gt;
  922. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Semantic Structure&lt;/strong&gt;: Is the &lt;strong&gt;heading hierarchy&lt;/strong&gt; logical? (One &lt;code&gt;h1&lt;/code&gt;,
  923. no skipping levels).&lt;/li&gt;
  924. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Form Labels&lt;/strong&gt;: Does every input have a programmatic label (not just a
  925. placeholder)?&lt;/li&gt;
  926. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Screen Reader Test&lt;/strong&gt;: Does the screen reader announce state changes
  927. (e.g., &amp;ldquo;Menu expanded&amp;rdquo;, &amp;ldquo;Error: Email is required&amp;rdquo;)?&lt;/li&gt;
  928. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Color Contrast&lt;/strong&gt;: Do all text and interactive elements meet &lt;strong&gt;WCAG 2.1
  929. AA&lt;/strong&gt; ratios (4.5:1)?&lt;/li&gt;
  930. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Zoom&lt;/strong&gt;: Does the site remain functional at 200% text zoom?&lt;/li&gt;
  931. &lt;/ol&gt;
  932. &lt;h2 id="the-business-case-beyond-ethics"&gt;The Business Case (Beyond Ethics)&lt;/h2&gt;
  933. &lt;p&gt;If &amp;ldquo;doing the right thing&amp;rdquo; isn&amp;rsquo;t enough to convince your stakeholders, use the
  934. language of business:&lt;/p&gt;
  935. &lt;ol&gt;
  936. &lt;li&gt;&lt;strong&gt;Market Reach&lt;/strong&gt;: 15% of the global population has some form of disability.
  937. Ignoring them is ignoring a massive market segment.&lt;/li&gt;
  938. &lt;li&gt;&lt;strong&gt;SEO&lt;/strong&gt;: Search engines are effectively &amp;ldquo;blind&amp;rdquo; users. &lt;strong&gt;Semantic HTML&lt;/strong&gt; and
  939. proper structure help bots index your site more effectively.&lt;/li&gt;
  940. &lt;li&gt;&lt;strong&gt;Legal Risk&lt;/strong&gt;: Accessibility lawsuits are at an all-time high. Compliance is
  941. cheaper than litigation.&lt;/li&gt;
  942. &lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: Accessible code (semantic HTML) is generally cleaner, easier
  943. to test, and more maintainable.&lt;/li&gt;
  944. &lt;/ol&gt;
  945. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  946. &lt;p&gt;The web is fundamentally designed to be accessible. We break it by being clever.
  947. To fix the broken state of the web, we need to stop viewing accessibility as a
  948. &amp;ldquo;tax&amp;rdquo; or a &amp;ldquo;legal hurdle&amp;rdquo; and start viewing it as a mark of professional
  949. craftsmanship.&lt;/p&gt;
  950. &lt;p&gt;If you&amp;rsquo;re looking for an example of how to build an accessible-first project, I
  951. highly recommend checking out my Introducing Olivero Hugo Theme post. It details
  952. how we ported Drupal’s award-winning accessible design to the static site world,
  953. ensuring WCAG 2.1 AA compliance from the ground up.&lt;/p&gt;
  954. &lt;p&gt;Stop building for &amp;ldquo;the average user&amp;rdquo;—the average user doesn&amp;rsquo;t exist. Build for
  955. everyone.&lt;/p&gt;
  956. &lt;hr&gt;
  957. &lt;p&gt;Questions about implementing a specific accessibility pattern? Check the
  958. &lt;a href="https://www.w3.org/WAI/ARIA/apg/patterns/"&gt;W3C WAI patterns&lt;/a&gt; for definitive
  959. guidance.&lt;/p&gt;
  960. &lt;blockquote&gt;
  961. &lt;p&gt;Related:&lt;/p&gt;
  962. &lt;ul&gt;
  963. &lt;li&gt;&lt;a href="../w3c-standards-ignored-by-search-engines/"&gt;W3C Standards Ignored by Search Engines&lt;/a&gt;&lt;/li&gt;
  964. &lt;li&gt;&lt;a href="../mobile-friendly-website-and-why-it-matters/"&gt;Mobile Friendly Website and Why It Matters&lt;/a&gt;&lt;/li&gt;
  965. &lt;/ul&gt;
  966. &lt;/blockquote&gt;
  967. </content:encoded>
  968. <dc:creator>Val Paliy</dc:creator>
  969. </item>
  970. <item>
  971. <title>W3.CSS: The Best CSS Framework You've Never Used</title>
  972. <link>https://valticus.pro/posts/w3css-best-framework-you-never-used/</link>
  973. <pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate>
  974. <guid isPermaLink="true">https://valticus.pro/posts/w3css-best-framework-you-never-used/</guid>
  975. <description>Discover why W3.CSS is a powerful, standard-compliant, and lightweight alternative to modern CSS frameworks, focusing on performance and accessibility.</description>
  976. <category>Web Development</category><content:encoded>&lt;p&gt;In the ever-evolving landscape of frontend development, we are often swept away
  977. by the &amp;ldquo;next big thing.&amp;rdquo; From the early days of Bootstrap to the current
  978. dominance of utility-first paradigms like Tailwind, the search for the perfect
  979. CSS framework feels like an endless marathon. However, in our quest for novelty,
  980. we frequently overlook tools that have been quietly providing robust, efficient,
  981. and standard-compliant solutions for years.&lt;/p&gt;
  982. &lt;p&gt;One such tool is &lt;strong&gt;W3.CSS&lt;/strong&gt;.&lt;/p&gt;
  983. &lt;figure&gt;
  984. &lt;div class="progressive-image"&gt;
  985. &lt;img class="progressive-image__img"
  986. src="https://valticus.pro/images/w3css-best-framework-you-never-used_hu_ebf8b61261345a52.webp"
  987. alt="W3.CSS: The Best CSS Framework You&amp;#39;ve Never Used."
  988. width="800"
  989. height="437"&gt;
  990. &lt;/div&gt;
  991. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;W3.CSS: The Best CSS Framework You&amp;#39;ve Never Used.&lt;/p&gt;&lt;/figcaption&gt;
  992. &lt;/figure&gt;
  993. &lt;p&gt;Developed by W3Schools, W3.CSS is a modern, responsive, and mobile-first CSS
  994. framework that prides itself on simplicity and performance. While it might not
  995. have the massive marketing engine of a Silicon Valley startup behind it, its
  996. technical merits make it a formidable contender for developers who value speed,
  997. accessibility, and adherence to W3C standards.&lt;/p&gt;
  998. &lt;h2 id="the-philosophy-of-simplicity"&gt;The Philosophy of Simplicity&lt;/h2&gt;
  999. &lt;p&gt;The primary philosophy behind W3.CSS is that CSS should be easy to learn, easy
  1000. to use, and, most importantly, independent of any JavaScript libraries. Unlike
  1001. Bootstrap (which historically relied on jQuery) or many modern React-based
  1002. component libraries, W3.CSS is pure CSS.&lt;/p&gt;
  1003. &lt;p&gt;This &amp;ldquo;no-dependency&amp;rdquo; approach is a breath of fresh air in an era where
  1004. &lt;code&gt;node_modules&lt;/code&gt; folders regularly exceed hundreds of megabytes. When you use
  1005. W3.CSS, you are adding a single, lightweight CSS file to your project. There are
  1006. no build steps required, no configuration files to manage, and no complex
  1007. preprocessors to set up. It works out of the box, everywhere.&lt;/p&gt;
  1008. &lt;h2 id="alignment-with-w3c-standards"&gt;Alignment with W3C Standards&lt;/h2&gt;
  1009. &lt;p&gt;One of the most compelling reasons to use W3.CSS is its strict adherence to
  1010. &lt;strong&gt;W3C standards&lt;/strong&gt;. In a web ecosystem that is increasingly fragmented by
  1011. non-standard browser features and proprietary syntax, W3.CSS stays grounded in
  1012. the core principles of the World Wide Web Consortium.&lt;/p&gt;
  1013. &lt;p&gt;By leveraging standard CSS properties and avoiding experimental features that
  1014. require vendor prefixes, W3.CSS ensures maximum compatibility across all modern
  1015. browsers (Chrome, Firefox, Safari, Edge) and even provides graceful degradation
  1016. for older ones. This commitment to standards isn&amp;rsquo;t just a matter of technical
  1017. purity; it&amp;rsquo;s about future-proofing your applications. When you build on top of
  1018. W3C-compliant foundations, your code is less likely to break when browsers
  1019. update their rendering engines.&lt;/p&gt;
  1020. &lt;h2 id="accessibility-a11y-by-default"&gt;Accessibility (A11y) by Default&lt;/h2&gt;
  1021. &lt;p&gt;In modern web development, accessibility is often treated as an
  1022. afterthought—something to be &amp;ldquo;fixed&amp;rdquo; with a plugin or a last-minute audit.
  1023. W3.CSS flips this script by integrating accessibility into its core utility
  1024. classes.&lt;/p&gt;
  1025. &lt;p&gt;The framework provides high-contrast color palettes, clear focus states for
  1026. interactive elements, and a grid system that respects document flow—a critical
  1027. factor for screen readers. Furthermore, because W3.CSS encourages the use of
  1028. semantic HTML elements rather than a &amp;ldquo;div soup,&amp;rdquo; it naturally leads developers
  1029. toward more accessible markup patterns.&lt;/p&gt;
  1030. &lt;p&gt;When we talk about accessibility, we are talking about ensuring that everyone,
  1031. regardless of their physical or cognitive abilities, can navigate and interact
  1032. with the web. W3.CSS makes this goal easier to achieve by providing the visual
  1033. tools necessary to meet WCAG (Web Content Accessibility Guidelines) requirements
  1034. without sacrificing design flexibility.&lt;/p&gt;
  1035. &lt;h2 id="performance-the-100100-lighthouse-goal"&gt;Performance: The 100/100 Lighthouse Goal&lt;/h2&gt;
  1036. &lt;p&gt;For projects like Valticus, where a 100/100 Lighthouse score is a non-negotiable
  1037. target, every byte counts. Many modern frameworks introduce significant &amp;ldquo;Total
  1038. Blocking Time&amp;rdquo; (TBT) due to the JavaScript required to handle responsive
  1039. behaviors or UI components.&lt;/p&gt;
  1040. &lt;p&gt;W3.CSS is exceptionally lightweight (approximately 23KB minified and gzipped).
  1041. Because it doesn&amp;rsquo;t require a runtime library, it has zero impact on TBT. Your
  1042. Largest Contentful Paint (LCP) and Cumulative Layout Shift (CLS) are also easier
  1043. to optimize because the framework uses stable, predictable CSS layouts that
  1044. don&amp;rsquo;t rely on post-load JavaScript calculations.&lt;/p&gt;
  1045. &lt;h2 id="w3css-vs-the-utility-first-trend"&gt;W3.CSS vs. The Utility-First Trend&lt;/h2&gt;
  1046. &lt;p&gt;It is impossible to discuss CSS frameworks in 2026 without mentioning Tailwind.
  1047. While utility-first CSS has its place, it is often misused by developers who end
  1048. up creating unmaintainable &amp;ldquo;HTML spaghetti&amp;rdquo; — the benefits of utility classes
  1049. are lost when they are applied without a deep understanding of CSS fundamentals.&lt;/p&gt;
  1050. &lt;p&gt;W3.CSS offers a middle ground. It provides utility classes for common tasks
  1051. (colors, padding, margins, alignment) but retains a semantic component-based
  1052. approach for complex UI elements like cards, modals, and navigation bars. This
  1053. hybrid approach allows for rapid development without the visual clutter of fifty
  1054. classes on a single &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;
  1055. &lt;h2 id="the-technical-deep-dive"&gt;The Technical Deep Dive&lt;/h2&gt;
  1056. &lt;p&gt;Let&amp;rsquo;s look at some of the features that make W3.CSS technically interesting:&lt;/p&gt;
  1057. &lt;h3 id="1-the-proportional-grid"&gt;1. The Proportional Grid&lt;/h3&gt;
  1058. &lt;p&gt;The W3.CSS grid system is based on a 12-column fluid grid. What sets it apart is
  1059. its simplicity. By using classes like &lt;code&gt;w3-col l6 m8 s12&lt;/code&gt;, you can define
  1060. responsive behavior for large, medium, and small screens in a way that is
  1061. immediately readable. It uses &lt;code&gt;box-sizing: border-box&lt;/code&gt; to ensure that padding
  1062. and borders don&amp;rsquo;t break your layout—a simple but essential standard.&lt;/p&gt;
  1063. &lt;h3 id="2-built-in-color-palettes"&gt;2. Built-in Color Palettes&lt;/h3&gt;
  1064. &lt;p&gt;W3.CSS comes with a variety of inspired color themes (Material Design, Flat UI,
  1065. etc.). These aren&amp;rsquo;t just random hex codes; they are carefully curated palettes
  1066. that ensure text legibility and visual harmony. The &lt;code&gt;w3-text-{color}&lt;/code&gt; and
  1067. &lt;code&gt;w3-{color}&lt;/code&gt; classes make it incredibly easy to maintain a consistent brand
  1068. identity across a site.&lt;/p&gt;
  1069. &lt;h3 id="3-mobile-first-responsiveness"&gt;3. Mobile-First Responsiveness&lt;/h3&gt;
  1070. &lt;p&gt;Every class in W3.CSS is designed with mobile users in mind. The framework
  1071. assumes a mobile-first approach, meaning your default styles are for small
  1072. screens, and you progressively enhance them for larger displays. This is the
  1073. gold standard for modern web design, ensuring that users on slower mobile
  1074. connections get a functional experience first.&lt;/p&gt;
  1075. &lt;h2 id="when-should-you-use-w3css"&gt;When Should You Use W3.CSS?&lt;/h2&gt;
  1076. &lt;p&gt;W3.CSS is an ideal choice for:&lt;/p&gt;
  1077. &lt;ul&gt;
  1078. &lt;li&gt;&lt;strong&gt;Fast Prototyping&lt;/strong&gt;: You can go from an idea to a functional, good-looking UI
  1079. in minutes.&lt;/li&gt;
  1080. &lt;li&gt;&lt;strong&gt;Content-Heavy Sites&lt;/strong&gt;: Blogs, documentation, and portfolios benefit from the
  1081. framework&amp;rsquo;s focus on typography and readability.&lt;/li&gt;
  1082. &lt;li&gt;&lt;strong&gt;Performance-Critical Apps&lt;/strong&gt;: If you are aiming for top-tier SEO and
  1083. Lighthouse scores, the low overhead of W3.CSS is a massive advantage.&lt;/li&gt;
  1084. &lt;li&gt;&lt;strong&gt;Developers Who Prefer Vanilla&lt;/strong&gt;: If you want to write &amp;ldquo;real&amp;rdquo; CSS and HTML
  1085. without being abstracted away by a complex build pipeline.&lt;/li&gt;
  1086. &lt;/ul&gt;
  1087. &lt;h2 id="conclusion-re-evaluating-our-tools"&gt;Conclusion: Re-evaluating Our Tools&lt;/h2&gt;
  1088. &lt;p&gt;The tech industry is prone to &amp;ldquo;shiny object syndrome.&amp;rdquo; We often jump to the
  1089. latest framework because we assume &amp;ldquo;newer&amp;rdquo; always means &amp;ldquo;better.&amp;rdquo; However, the
  1090. true value of a tool lies in its ability to solve problems efficiently,
  1091. sustainably, and inclusively.&lt;/p&gt;
  1092. &lt;p&gt;W3.CSS might not be the trendy choice in 2026, but it is one of the most
  1093. practical ones. By focusing on W3C standards, accessibility, and pure
  1094. performance, it provides a foundation that many more popular frameworks fail to
  1095. match. Whether you are building a small personal project or a large-scale
  1096. enterprise application, W3.CSS deserves a second look. It might just be the best
  1097. framework you&amp;rsquo;ve never used.&lt;/p&gt;
  1098. &lt;blockquote&gt;
  1099. &lt;p&gt;Related:&lt;/p&gt;
  1100. &lt;ul&gt;
  1101. &lt;li&gt;&lt;a href="../why-most-devs-misuse-tailwind/"&gt;Why Most Devs Misuse Tailwind (And How to Fix It)&lt;/a&gt;&lt;/li&gt;
  1102. &lt;/ul&gt;
  1103. &lt;/blockquote&gt;
  1104. </content:encoded>
  1105. <dc:creator>Val Paliy</dc:creator>
  1106. </item>
  1107. <item>
  1108. <title>Why Most Devs Misuse Tailwind (And How to Fix It)</title>
  1109. <link>https://valticus.pro/posts/why-most-devs-misuse-tailwind/</link>
  1110. <pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate>
  1111. <guid isPermaLink="true">https://valticus.pro/posts/why-most-devs-misuse-tailwind/</guid>
  1112. <description>Tailwind CSS is a powerful tool, but it's frequently misunderstood. Learn the common pitfalls of utility-first CSS and how to build a scalable, maintainable design system.</description>
  1113. <category>Web Development</category><content:encoded>&lt;h2 id="the-tailwind-hype-is-real"&gt;The Tailwind Hype Is Real&lt;/h2&gt;
  1114. &lt;p&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt; has fundamentally changed how we think about styling in 2026.
  1115. It has won the &amp;ldquo;CSS Wars&amp;rdquo; for a simple reason: it solves the &lt;strong&gt;specificity and
  1116. naming&lt;/strong&gt; problems that have plagued CSS developers since the mid-90s. No more
  1117. debating whether a class should be &lt;code&gt;.card-title-inner-wrapper&lt;/code&gt; or
  1118. &lt;code&gt;.c-card__header&lt;/code&gt;. No more worrying if changing a margin in one file will break
  1119. a layout in three others.&lt;/p&gt;
  1120. &lt;p&gt;However, its popularity has come at a cost. &lt;strong&gt;Tailwind&lt;/strong&gt; is deceptively easy to
  1121. start using, but incredibly easy to misuse. Most developers are treating it like
  1122. &amp;ldquo;inline styles on steroids&amp;rdquo; rather than the &lt;strong&gt;constrained design system&lt;/strong&gt; it was
  1123. meant to be.&lt;/p&gt;
  1124. &lt;figure&gt;
  1125. &lt;div class="progressive-image"&gt;
  1126. &lt;img class="progressive-image__img"
  1127. src="https://valticus.pro/images/why-most-devs-misuse-tailwind_hu_b3489149d6d7e289.webp"
  1128. alt="Why Most Devs Misuse Tailwind (And How to Fix It)."
  1129. width="800"
  1130. height="436"&gt;
  1131. &lt;/div&gt;
  1132. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Why Most Devs Misuse Tailwind (And How to Fix It).&lt;/p&gt;&lt;/figcaption&gt;
  1133. &lt;/figure&gt;
  1134. &lt;h2 id="the-class-explosion-html-as-a-graveyard"&gt;The Class Explosion: HTML as a Graveyard&lt;/h2&gt;
  1135. &lt;p&gt;The most common criticism of &lt;strong&gt;Tailwind&lt;/strong&gt; is the &amp;ldquo;class soup.&amp;rdquo; We&amp;rsquo;ve all seen
  1136. (or written) code that looks like this:&lt;/p&gt;
  1137. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- The &amp;#34;Everything and the Kitchen Sink&amp;#34; approach --&amp;gt;&lt;/span&gt;
  1138. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
  1139. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flex flex-col items-center justify-center p-4 m-2 bg-white rounded-lg shadow-md hover:shadow-lg transition-all duration-300 border border-gray-200 w-full max-w-md mx-auto sm:p-6 md:p-8 lg:w-1/2 xl:w-1/3 dark:bg-slate-800 dark:border-slate-700 ring-1 ring-black/5&amp;#34;&lt;/span&gt;
  1140. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  1141. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Content... --&amp;gt;&lt;/span&gt;
  1142. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  1143. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When your HTML structure is buried under a mountain of &lt;strong&gt;utility classes&lt;/strong&gt;,
  1144. you&amp;rsquo;ve lost the ability to scan your code effectively. This isn&amp;rsquo;t just an
  1145. aesthetic issue; it&amp;rsquo;s a &lt;strong&gt;maintainability nightmare&lt;/strong&gt;. If you need to change the
  1146. &amp;ldquo;primary card style&amp;rdquo; across 50 pages, and you&amp;rsquo;ve manually typed these classes
  1147. every time, you are in for a world of pain.&lt;/p&gt;
  1148. &lt;h2 id="the-apply-directive-a-seductive-trap"&gt;The @apply Directive: A Seductive Trap&lt;/h2&gt;
  1149. &lt;p&gt;When developers realize their HTML is getting messy, they often reach for the
  1150. &lt;strong&gt;&lt;code&gt;@apply&lt;/code&gt; directive&lt;/strong&gt; in their CSS files:&lt;/p&gt;
  1151. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* The &amp;#34;Lazy Refactor&amp;#34; */&lt;/span&gt;
  1152. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;btn-primary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1153. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;@apply&lt;/span&gt; &lt;span class="err"&gt;bg-blue-500&lt;/span&gt; &lt;span class="err"&gt;text-white&lt;/span&gt; &lt;span class="err"&gt;font-bold&lt;/span&gt; &lt;span class="err"&gt;py-2&lt;/span&gt; &lt;span class="err"&gt;px-4&lt;/span&gt; &lt;span class="err"&gt;rounded&lt;/span&gt; &lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bg-blue-600&lt;/span&gt; &lt;span class="k"&gt;transition&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  1154. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  1155. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is often a mistake. By leaning heavily on &lt;strong&gt;&lt;code&gt;@apply&lt;/code&gt;&lt;/strong&gt;, you are creating a
  1156. &amp;ldquo;Tailwind-flavored&amp;rdquo; version of traditional CSS. You lose the ability to see
  1157. exactly what styles are applied by looking at the HTML, and you reintroduce the
  1158. naming and specificity problems &lt;strong&gt;Tailwind&lt;/strong&gt; was supposed to solve.&lt;/p&gt;
  1159. &lt;p&gt;&lt;strong&gt;If you&amp;rsquo;re using &lt;code&gt;@apply&lt;/code&gt; for everything, you&amp;rsquo;ve just reinvented BEM with a
  1160. more verbose syntax.&lt;/strong&gt;&lt;/p&gt;
  1161. &lt;h2 id="the-solution-component-driven-extraction"&gt;The Solution: Component-Driven Extraction&lt;/h2&gt;
  1162. &lt;p&gt;The correct way to handle class bloat isn&amp;rsquo;t to hide it in CSS files, but to
  1163. &lt;strong&gt;extract it into components&lt;/strong&gt;. Whether you&amp;rsquo;re using React, Vue, Svelte, or even
  1164. Hugo partials, the logic should be:&lt;/p&gt;
  1165. &lt;ol&gt;
  1166. &lt;li&gt;&lt;strong&gt;Write utilities&lt;/strong&gt; until the pattern repeats.&lt;/li&gt;
  1167. &lt;li&gt;&lt;strong&gt;Identify the abstraction&lt;/strong&gt; (e.g., &amp;ldquo;PrimaryButton,&amp;rdquo; &amp;ldquo;UserCard&amp;rdquo;).&lt;/li&gt;
  1168. &lt;li&gt;&lt;strong&gt;Extract to a component&lt;/strong&gt; where those utilities live in exactly one place.&lt;/li&gt;
  1169. &lt;/ol&gt;
  1170. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Much better: Clear intent, encapsulated styles --&amp;gt;&lt;/span&gt;
  1171. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Card&lt;/span&gt; &lt;span class="na"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;primary&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  1172. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;UserBio&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Val Paliy&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Senior Developer&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  1173. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  1174. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="arbitrary-value-abuse-the-design-system-killer"&gt;Arbitrary Value Abuse: The Design System Killer&lt;/h2&gt;
  1175. &lt;p&gt;&lt;strong&gt;Tailwind&lt;/strong&gt; is powerful because it&amp;rsquo;s &lt;strong&gt;opinionated&lt;/strong&gt;. It forces you to pick
  1176. from a scale (e.g., &lt;code&gt;p-4&lt;/code&gt;, &lt;code&gt;m-8&lt;/code&gt;). However, the &amp;ldquo;&lt;strong&gt;Just-in-Time&lt;/strong&gt;&amp;rdquo; (&lt;strong&gt;JIT&lt;/strong&gt;)
  1177. engine introduced &lt;strong&gt;arbitrary values&lt;/strong&gt; like &lt;code&gt;w-[373px]&lt;/code&gt; or &lt;code&gt;text-[#f2f2f2]&lt;/code&gt;.&lt;/p&gt;
  1178. &lt;p&gt;I see developers using these &lt;em&gt;everywhere&lt;/em&gt;. This is a failure to define a
  1179. &lt;strong&gt;design system&lt;/strong&gt;. If you need a specific color or width more than once, it
  1180. belongs in your &lt;strong&gt;&lt;code&gt;tailwind.config.js&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
  1181. &lt;h3 id="pro-tip-the-clean-config-rule"&gt;Pro Tip: The &amp;ldquo;Clean Config&amp;rdquo; Rule&lt;/h3&gt;
  1182. &lt;p&gt;Your &lt;strong&gt;&lt;code&gt;tailwind.config.js&lt;/code&gt;&lt;/strong&gt; should be the &amp;ldquo;&lt;strong&gt;Single Source of Truth&lt;/strong&gt;&amp;rdquo; for
  1183. your brand. If you find yourself using &lt;code&gt;[...]&lt;/code&gt; syntax more than once for the
  1184. same value, it&amp;rsquo;s time to extend your &lt;strong&gt;theme&lt;/strong&gt;.&lt;/p&gt;
  1185. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// tailwind.config.js
  1186. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1187. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1188. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;extend&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1189. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1190. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;brand-primary&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;#0055f4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// No more arbitrary hex codes!
  1191. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  1192. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1193. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;safe-area&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;env(safe-area-inset-bottom)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  1194. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  1195. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;borderRadius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  1196. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;xl-plus&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.25rem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  1197. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  1198. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  1199. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  1200. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
  1201. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="responsive-design-gone-wrong"&gt;Responsive Design Gone Wrong&lt;/h2&gt;
  1202. &lt;p&gt;&lt;strong&gt;Tailwind&amp;rsquo;s&lt;/strong&gt; mobile-first approach is brilliant, but it&amp;rsquo;s often ignored. Many
  1203. developers write their &amp;ldquo;desktop&amp;rdquo; styles first and then try to &amp;ldquo;fix&amp;rdquo; them for
  1204. mobile using &lt;strong&gt;prefixes&lt;/strong&gt;.&lt;/p&gt;
  1205. &lt;p&gt;&lt;strong&gt;The Golden Rule:&lt;/strong&gt; Styles with no prefix should always be your mobile styles.
  1206. Use &lt;code&gt;md:&lt;/code&gt;, &lt;code&gt;lg:&lt;/code&gt;, etc., only to &lt;em&gt;increase&lt;/em&gt; complexity as screen real estate
  1207. allows.&lt;/p&gt;
  1208. &lt;table&gt;
  1209. &lt;thead&gt;
  1210. &lt;tr&gt;
  1211. &lt;th&gt;Strategy&lt;/th&gt;
  1212. &lt;th&gt;Approach&lt;/th&gt;
  1213. &lt;th&gt;Maintenance Level&lt;/th&gt;
  1214. &lt;/tr&gt;
  1215. &lt;/thead&gt;
  1216. &lt;tbody&gt;
  1217. &lt;tr&gt;
  1218. &lt;td&gt;&lt;strong&gt;Mobile-First&lt;/strong&gt;&lt;/td&gt;
  1219. &lt;td&gt;Base classes = Mobile, Prefixes = Desktop&lt;/td&gt;
  1220. &lt;td&gt;Low (Predictable)&lt;/td&gt;
  1221. &lt;/tr&gt;
  1222. &lt;tr&gt;
  1223. &lt;td&gt;&lt;strong&gt;Desktop-First&lt;/strong&gt;&lt;/td&gt;
  1224. &lt;td&gt;Base classes = Desktop, Prefixes = Mobile&lt;/td&gt;
  1225. &lt;td&gt;High (Overriding chaos)&lt;/td&gt;
  1226. &lt;/tr&gt;
  1227. &lt;tr&gt;
  1228. &lt;td&gt;&lt;strong&gt;Ad-Hoc&lt;/strong&gt;&lt;/td&gt;
  1229. &lt;td&gt;Random &lt;strong&gt;breakpoints&lt;/strong&gt; everywhere&lt;/td&gt;
  1230. &lt;td&gt;Extreme (&lt;strong&gt;Technical Debt&lt;/strong&gt;)&lt;/td&gt;
  1231. &lt;/tr&gt;
  1232. &lt;/tbody&gt;
  1233. &lt;/table&gt;
  1234. &lt;h2 id="the-tailwind-cleanliness-test"&gt;The Tailwind Cleanliness Test&lt;/h2&gt;
  1235. &lt;p&gt;Before you commit your next PR, run through this checklist:&lt;/p&gt;
  1236. &lt;ul&gt;
  1237. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Have I used an &lt;strong&gt;arbitrary value&lt;/strong&gt; (&lt;code&gt;[...]&lt;/code&gt;) for something that should be
  1238. in the &lt;strong&gt;theme&lt;/strong&gt;?&lt;/li&gt;
  1239. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Is my HTML structure still readable, or have I extracted repeated patterns
  1240. into components?&lt;/li&gt;
  1241. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Am I using &lt;strong&gt;&lt;code&gt;@apply&lt;/code&gt;&lt;/strong&gt; as a shortcut to avoid thinking about &lt;strong&gt;component
  1242. architecture&lt;/strong&gt;?&lt;/li&gt;
  1243. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Are my &lt;strong&gt;responsive prefixes&lt;/strong&gt; following a consistent &lt;strong&gt;mobile-first
  1244. strategy&lt;/strong&gt;?&lt;/li&gt;
  1245. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Have I purged unused styles (though &lt;strong&gt;JIT&lt;/strong&gt; does this, ensure your content
  1246. paths are correct)?&lt;/li&gt;
  1247. &lt;/ul&gt;
  1248. &lt;h2 id="the-philosophy-of-utility-first"&gt;The Philosophy of &amp;ldquo;Utility-First&amp;rdquo;&lt;/h2&gt;
  1249. &lt;p&gt;To truly &amp;ldquo;get&amp;rdquo; &lt;strong&gt;Tailwind&lt;/strong&gt;, you have to embrace the philosophy. It’s not about
  1250. saving keystrokes; it’s about &lt;strong&gt;localizing the impact of changes&lt;/strong&gt;. When I
  1251. change a class on a button, I know for a fact that it only affects &lt;em&gt;that&lt;/em&gt;
  1252. button.&lt;/p&gt;
  1253. &lt;p&gt;When you misuse &lt;strong&gt;Tailwind&lt;/strong&gt;, you&amp;rsquo;re fighting that &lt;strong&gt;localization&lt;/strong&gt;. You&amp;rsquo;re
  1254. creating global abstractions (&lt;strong&gt;&lt;code&gt;@apply&lt;/code&gt;&lt;/strong&gt;) or inconsistent ad-hoc values that
  1255. make the system brittle.&lt;/p&gt;
  1256. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1257. &lt;p&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt; is an incredible tool when used with discipline. It allows you
  1258. to build beautiful, consistent UIs at breakneck speed. But like any powerful
  1259. tool, it requires an understanding of its underlying principles.&lt;/p&gt;
  1260. &lt;p&gt;Stop treating your HTML like a dump for every utility class you can think of.
  1261. Configure your &lt;strong&gt;theme&lt;/strong&gt;, embrace &lt;strong&gt;component-driven development&lt;/strong&gt;, and use the
  1262. platform&amp;rsquo;s constraints to your advantage.&lt;/p&gt;
  1263. &lt;p&gt;These principles come together in real projects where performance and
  1264. maintainability actually matter.&lt;/p&gt;
  1265. &lt;blockquote&gt;
  1266. &lt;p&gt;Related:&lt;/p&gt;
  1267. &lt;ul&gt;
  1268. &lt;li&gt;&lt;a href="../building-personal-portfolio-tailwind-css/"&gt;Building a Personal Portfolio with Tailwind CSS&lt;/a&gt;&lt;/li&gt;
  1269. &lt;li&gt;&lt;a href="../w3css-best-framework-you-never-used/"&gt;W3.CSS: Best Framework You Never Used&lt;/a&gt;&lt;/li&gt;
  1270. &lt;/ul&gt;
  1271. &lt;/blockquote&gt;
  1272. </content:encoded>
  1273. <dc:creator>Val Paliy</dc:creator>
  1274. </item>
  1275. <item>
  1276. <title>Static Sites vs WordPress in 2026: Brutal Comparison</title>
  1277. <link>https://valticus.pro/posts/static-sites-vs-wordpress-in-2026-brutal-comparison/</link>
  1278. <pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate>
  1279. <guid isPermaLink="true">https://valticus.pro/posts/static-sites-vs-wordpress-in-2026-brutal-comparison/</guid>
  1280. <description>A no-nonsense comparison between static site generators and WordPress in 2026, examining performance, security, maintenance, and real-world usability for developers and content creators.</description>
  1281. <category>Web Development</category><content:encoded>&lt;h2 id="the-state-of-web-publishing-in-2026"&gt;The State of Web Publishing in 2026&lt;/h2&gt;
  1282. &lt;p&gt;The debate between static sites and &lt;strong&gt;WordPress&lt;/strong&gt; has evolved significantly.
  1283. What was once a simple discussion about speed has become a multifaceted
  1284. comparison of entire ecosystems. In 2026, &lt;strong&gt;WordPress&lt;/strong&gt; has tried to reinvent
  1285. itself with &amp;ldquo;&lt;strong&gt;Full Site Editing&lt;/strong&gt;&amp;rdquo; and improved block patterns, while &lt;strong&gt;Static
  1286. Site Generators (SSGs)&lt;/strong&gt; like &lt;strong&gt;Hugo&lt;/strong&gt; and &lt;strong&gt;Next.js&lt;/strong&gt; have matured into robust,
  1287. enterprise-ready tools.&lt;/p&gt;
  1288. &lt;p&gt;Let&amp;rsquo;s cut through the marketing and examine what actually matters: your time,
  1289. your money, and your site&amp;rsquo;s survival in an increasingly hostile web.&lt;/p&gt;
  1290. &lt;figure&gt;
  1291. &lt;div class="progressive-image"&gt;
  1292. &lt;img class="progressive-image__img"
  1293. src="https://valticus.pro/images/static-sites-vs-wordpress-in-2026-brutal-comparison_hu_242b575883be358d.webp"
  1294. alt="Static Sites vs WordPress in 2026: Brutal Comparison."
  1295. width="800"
  1296. height="436"&gt;
  1297. &lt;/div&gt;
  1298. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Static Sites vs WordPress in 2026: Brutal Comparison.&lt;/p&gt;&lt;/figcaption&gt;
  1299. &lt;/figure&gt;
  1300. &lt;h2 id="performance-no-contest"&gt;Performance: No Contest&lt;/h2&gt;
  1301. &lt;p&gt;Static sites win decisively in raw performance. This isn&amp;rsquo;t just an opinion; it&amp;rsquo;s
  1302. a matter of architecture. When a user requests a page from a static site, the
  1303. server simply hands over a pre-rendered file. When a user requests a page from
  1304. &lt;strong&gt;WordPress&lt;/strong&gt;, the server must run &lt;strong&gt;PHP&lt;/strong&gt;, query a &lt;strong&gt;MySQL&lt;/strong&gt; database, assemble
  1305. the page, and then send it back.&lt;/p&gt;
  1306. &lt;h3 id="the-benchmark-reality"&gt;The Benchmark Reality&lt;/h3&gt;
  1307. &lt;table&gt;
  1308. &lt;thead&gt;
  1309. &lt;tr&gt;
  1310. &lt;th style="text-align: left"&gt;Metric&lt;/th&gt;
  1311. &lt;th style="text-align: left"&gt;Static Site (&lt;strong&gt;Hugo&lt;/strong&gt;)&lt;/th&gt;
  1312. &lt;th style="text-align: left"&gt;&lt;strong&gt;WordPress&lt;/strong&gt; (Optimized)&lt;/th&gt;
  1313. &lt;th style="text-align: left"&gt;&lt;strong&gt;WordPress&lt;/strong&gt; (Average)&lt;/th&gt;
  1314. &lt;/tr&gt;
  1315. &lt;/thead&gt;
  1316. &lt;tbody&gt;
  1317. &lt;tr&gt;
  1318. &lt;td style="text-align: left"&gt;&lt;strong&gt;Time to First Byte (TTFB)&lt;/strong&gt;&lt;/td&gt;
  1319. &lt;td style="text-align: left"&gt;10ms - 50ms&lt;/td&gt;
  1320. &lt;td style="text-align: left"&gt;150ms - 300ms&lt;/td&gt;
  1321. &lt;td style="text-align: left"&gt;500ms - 1.2s&lt;/td&gt;
  1322. &lt;/tr&gt;
  1323. &lt;tr&gt;
  1324. &lt;td style="text-align: left"&gt;&lt;strong&gt;Build/Render Time&lt;/strong&gt;&lt;/td&gt;
  1325. &lt;td style="text-align: left"&gt;Instant (Pre-built)&lt;/td&gt;
  1326. &lt;td style="text-align: left"&gt;200ms - 500ms&lt;/td&gt;
  1327. &lt;td style="text-align: left"&gt;800ms - 2s+&lt;/td&gt;
  1328. &lt;/tr&gt;
  1329. &lt;tr&gt;
  1330. &lt;td style="text-align: left"&gt;&lt;strong&gt;Max Concurrent Users&lt;/strong&gt;&lt;/td&gt;
  1331. &lt;td style="text-align: left"&gt;Thousands (on $5/mo VPS)&lt;/td&gt;
  1332. &lt;td style="text-align: left"&gt;Hundreds (on $20/mo VPS)&lt;/td&gt;
  1333. &lt;td style="text-align: left"&gt;Dozens (on Shared Hosting)&lt;/td&gt;
  1334. &lt;/tr&gt;
  1335. &lt;tr&gt;
  1336. &lt;td style="text-align: left"&gt;&lt;strong&gt;Core Web Vitals&lt;/strong&gt;&lt;/td&gt;
  1337. &lt;td style="text-align: left"&gt;95-100 (Default)&lt;/td&gt;
  1338. &lt;td style="text-align: left"&gt;70-90 (Requires Effort)&lt;/td&gt;
  1339. &lt;td style="text-align: left"&gt;30-60 (Typical)&lt;/td&gt;
  1340. &lt;/tr&gt;
  1341. &lt;/tbody&gt;
  1342. &lt;/table&gt;
  1343. &lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt; has improved with native image lazy loading and better caching,
  1344. but the fundamental architecture creates inherent overhead that no &lt;strong&gt;plugin&lt;/strong&gt;
  1345. can fully eliminate.&lt;/p&gt;
  1346. &lt;h2 id="security-static-sites-by-default"&gt;Security: Static Sites by Default&lt;/h2&gt;
  1347. &lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt; powers nearly half of the internet, which makes it the single
  1348. largest target for automated botnets and hackers.&lt;/p&gt;
  1349. &lt;h3 id="the-attack-surface"&gt;The Attack Surface&lt;/h3&gt;
  1350. &lt;ul&gt;
  1351. &lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: Has a login page (&lt;code&gt;/wp-admin&lt;/code&gt;), an active database, a &lt;strong&gt;REST
  1352. API&lt;/strong&gt;, and &lt;strong&gt;PHP&lt;/strong&gt; execution. Every &lt;strong&gt;plugin&lt;/strong&gt; you add is another potential
  1353. backdoor.&lt;/li&gt;
  1354. &lt;li&gt;&lt;strong&gt;Static Sites&lt;/strong&gt;: Zero server-side execution. No database to inject, no login
  1355. page to brute-force, and no &lt;strong&gt;PHP&lt;/strong&gt; vulnerabilities.&lt;/li&gt;
  1356. &lt;/ul&gt;
  1357. &lt;p&gt;Most &lt;strong&gt;WordPress&lt;/strong&gt; breaches occur through outdated plugins. If you forget to
  1358. update an obscure slider plugin for three months, your entire server could be
  1359. compromised. With a static site, even if your local development machine is
  1360. hacked, the live site remains a set of read-only files on a &lt;strong&gt;CDN&lt;/strong&gt;. It is
  1361. effectively &amp;ldquo;unhackable&amp;rdquo; in the traditional sense.&lt;/p&gt;
  1362. &lt;h2 id="maintenance-the-hidden-cost"&gt;Maintenance: The Hidden Cost&lt;/h2&gt;
  1363. &lt;p&gt;This is where the &amp;ldquo;free&amp;rdquo; nature of &lt;strong&gt;WordPress&lt;/strong&gt; becomes expensive.
  1364. &lt;strong&gt;WordPress&lt;/strong&gt; requires constant, active maintenance.&lt;/p&gt;
  1365. &lt;ol&gt;
  1366. &lt;li&gt;&lt;strong&gt;Update Fatigue&lt;/strong&gt;: Core updates, theme updates, and plugin updates happen
  1367. weekly. Often, an update to one breaks another.&lt;/li&gt;
  1368. &lt;li&gt;&lt;strong&gt;Database Optimization&lt;/strong&gt;: Over time, the &lt;strong&gt;MySQL&lt;/strong&gt; database becomes bloated
  1369. with revisions and metadata, slowing down the site.&lt;/li&gt;
  1370. &lt;li&gt;&lt;strong&gt;Security Monitoring&lt;/strong&gt;: You need to run Wordfence or Sucuri and check logs
  1371. for intrusion attempts.&lt;/li&gt;
  1372. &lt;li&gt;&lt;strong&gt;Backups&lt;/strong&gt;: You must manage complex database and file system backups.&lt;/li&gt;
  1373. &lt;/ol&gt;
  1374. &lt;p&gt;Static sites require zero &amp;ldquo;server&amp;rdquo; maintenance. Your &amp;ldquo;backup&amp;rdquo; is your &lt;strong&gt;Git
  1375. repository&lt;/strong&gt;. If you don&amp;rsquo;t touch your &lt;strong&gt;Hugo&lt;/strong&gt; site for two years, it will still
  1376. be as fast and secure as the day you deployed it.&lt;/p&gt;
  1377. &lt;h2 id="the-cost-of-ownership-comparison-annual-estimate"&gt;The &amp;ldquo;Cost of Ownership&amp;rdquo; Comparison (Annual Estimate)&lt;/h2&gt;
  1378. &lt;table&gt;
  1379. &lt;thead&gt;
  1380. &lt;tr&gt;
  1381. &lt;th style="text-align: left"&gt;Expense Item&lt;/th&gt;
  1382. &lt;th style="text-align: left"&gt;&lt;strong&gt;WordPress&lt;/strong&gt; (Professional)&lt;/th&gt;
  1383. &lt;th style="text-align: left"&gt;Static Site (Professional)&lt;/th&gt;
  1384. &lt;/tr&gt;
  1385. &lt;/thead&gt;
  1386. &lt;tbody&gt;
  1387. &lt;tr&gt;
  1388. &lt;td style="text-align: left"&gt;&lt;strong&gt;Hosting&lt;/strong&gt;&lt;/td&gt;
  1389. &lt;td style="text-align: left"&gt;$120 - $360 (Managed WP)&lt;/td&gt;
  1390. &lt;td style="text-align: left"&gt;$0 - $60 (&lt;strong&gt;Netlify&lt;/strong&gt;/&lt;strong&gt;Vercel&lt;/strong&gt;/&lt;strong&gt;S3&lt;/strong&gt;)&lt;/td&gt;
  1391. &lt;/tr&gt;
  1392. &lt;tr&gt;
  1393. &lt;td style="text-align: left"&gt;&lt;strong&gt;Premium Plugins&lt;/strong&gt;&lt;/td&gt;
  1394. &lt;td style="text-align: left"&gt;$100 - $500 (SEO, Forms, Security)&lt;/td&gt;
  1395. &lt;td style="text-align: left"&gt;$0 (Built-in or OSS)&lt;/td&gt;
  1396. &lt;/tr&gt;
  1397. &lt;tr&gt;
  1398. &lt;td style="text-align: left"&gt;&lt;strong&gt;Maintenance Labor&lt;/strong&gt;&lt;/td&gt;
  1399. &lt;td style="text-align: left"&gt;20-40 hours / year&lt;/td&gt;
  1400. &lt;td style="text-align: left"&gt;1-2 hours / year&lt;/td&gt;
  1401. &lt;/tr&gt;
  1402. &lt;tr&gt;
  1403. &lt;td style="text-align: left"&gt;&lt;strong&gt;Security Services&lt;/strong&gt;&lt;/td&gt;
  1404. &lt;td style="text-align: left"&gt;$99 - $200&lt;/td&gt;
  1405. &lt;td style="text-align: left"&gt;$0&lt;/td&gt;
  1406. &lt;/tr&gt;
  1407. &lt;tr&gt;
  1408. &lt;td style="text-align: left"&gt;&lt;strong&gt;Total Est. Cost&lt;/strong&gt;&lt;/td&gt;
  1409. &lt;td style="text-align: left"&gt;&lt;strong&gt;$500 - $1,500+&lt;/strong&gt;&lt;/td&gt;
  1410. &lt;td style="text-align: left"&gt;&lt;strong&gt;$0 - $100&lt;/strong&gt;&lt;/td&gt;
  1411. &lt;/tr&gt;
  1412. &lt;/tbody&gt;
  1413. &lt;/table&gt;
  1414. &lt;h2 id="content-management-reality"&gt;Content Management Reality&lt;/h2&gt;
  1415. &lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt; excels at collaborative content creation for non-technical teams.
  1416. Its &lt;strong&gt;Gutenberg editor&lt;/strong&gt; is a powerful tool for people who don&amp;rsquo;t want to touch
  1417. code.&lt;/p&gt;
  1418. &lt;p&gt;However, in 2026, the gap is closing. &lt;strong&gt;Git-based CMS&lt;/strong&gt; solutions like
  1419. &lt;strong&gt;TinaCMS&lt;/strong&gt; and &lt;strong&gt;Decap CMS&lt;/strong&gt; (formerly Netlify CMS) provide a &amp;ldquo;WordPress-like&amp;rdquo;
  1420. editing experience for static sites. You get the visual editing of &lt;strong&gt;WordPress&lt;/strong&gt;
  1421. with the performance of &lt;strong&gt;Hugo&lt;/strong&gt;.&lt;/p&gt;
  1422. &lt;blockquote&gt;
  1423. &lt;p&gt;&lt;strong&gt;Pro Tip: The Migration Path&lt;/strong&gt; If you&amp;rsquo;re moving from &lt;strong&gt;WordPress&lt;/strong&gt; to
  1424. &lt;strong&gt;Hugo&lt;/strong&gt;, don&amp;rsquo;t try to migrate everything at once. Use a tool like
  1425. &lt;code&gt;wordpress-to-hugo-exporter&lt;/code&gt; to get your &lt;strong&gt;Markdown&lt;/strong&gt; files, but manually
  1426. rebuild your theme. This is the perfect time to audit your content and remove
  1427. the &amp;ldquo;plugin bloat&amp;rdquo; that has been slowing you down for years.&lt;/p&gt;
  1428. &lt;/blockquote&gt;
  1429. &lt;h2 id="development-experience"&gt;Development Experience&lt;/h2&gt;
  1430. &lt;h3 id="static-site-generators-the-pros-choice"&gt;Static Site Generators (The Pro&amp;rsquo;s Choice)&lt;/h3&gt;
  1431. &lt;ul&gt;
  1432. &lt;li&gt;&lt;strong&gt;Version Control&lt;/strong&gt;: Every change is tracked in &lt;strong&gt;Git&lt;/strong&gt;. You can &amp;ldquo;undo&amp;rdquo; a
  1433. site-wide mistake in seconds.&lt;/li&gt;
  1434. &lt;li&gt;&lt;strong&gt;Local Development&lt;/strong&gt;: Run the entire site on your laptop without needing
  1435. &lt;strong&gt;MAMP/XAMPP&lt;/strong&gt;.&lt;/li&gt;
  1436. &lt;li&gt;&lt;strong&gt;Modern Tooling&lt;/strong&gt;: Use &lt;strong&gt;NPM&lt;/strong&gt;, &lt;strong&gt;PostCSS&lt;/strong&gt;, &lt;strong&gt;Tailwind&lt;/strong&gt;, and &lt;strong&gt;ESBuild&lt;/strong&gt;
  1437. directly.&lt;/li&gt;
  1438. &lt;/ul&gt;
  1439. &lt;h3 id="wordpress-the-legacy-struggle"&gt;WordPress (The Legacy Struggle)&lt;/h3&gt;
  1440. &lt;ul&gt;
  1441. &lt;li&gt;&lt;strong&gt;Database Synchronization&lt;/strong&gt;: Moving content from &amp;ldquo;staging&amp;rdquo; to &amp;ldquo;production&amp;rdquo; is
  1442. notoriously difficult because of serialized data in the database.&lt;/li&gt;
  1443. &lt;li&gt;&lt;strong&gt;Plugin Conflicts&lt;/strong&gt;: Two plugins might use different versions of the same
  1444. library, causing silent failures.&lt;/li&gt;
  1445. &lt;li&gt;&lt;strong&gt;Vendor Lock-in&lt;/strong&gt;: Once you&amp;rsquo;re deep into a &amp;ldquo;&lt;strong&gt;Page Builder&lt;/strong&gt;&amp;rdquo; like Elementor
  1446. or Divi, your content is trapped in proprietary shortcodes.&lt;/li&gt;
  1447. &lt;/ul&gt;
  1448. &lt;h2 id="when-wordpress-still-makes-sense"&gt;When WordPress Still Makes Sense&lt;/h2&gt;
  1449. &lt;p&gt;Despite my &amp;ldquo;brutal&amp;rdquo; take, &lt;strong&gt;WordPress&lt;/strong&gt; isn&amp;rsquo;t dead. It remains the right choice
  1450. for:&lt;/p&gt;
  1451. &lt;ul&gt;
  1452. &lt;li&gt;&lt;strong&gt;E-commerce with 10,000+ products&lt;/strong&gt;: While static e-commerce exists
  1453. (Snipcart, BigCommerce), a massive dynamic store often benefits from a
  1454. specialized &lt;strong&gt;DB&lt;/strong&gt;.&lt;/li&gt;
  1455. &lt;li&gt;&lt;strong&gt;Large News Organizations&lt;/strong&gt;: When you have 50+ journalists publishing 100
  1456. articles a day, a traditional &lt;strong&gt;RDBMS&lt;/strong&gt;-based &lt;strong&gt;CMS&lt;/strong&gt; is still the industry
  1457. standard.&lt;/li&gt;
  1458. &lt;li&gt;&lt;strong&gt;Complex Membership Sites&lt;/strong&gt;: Sites requiring user accounts, forums, and
  1459. dynamic community interactions.&lt;/li&gt;
  1460. &lt;/ul&gt;
  1461. &lt;h2 id="the-verdict"&gt;The Verdict&lt;/h2&gt;
  1462. &lt;p&gt;For developers building personal sites, portfolios, blogs, and documentation:
  1463. &lt;strong&gt;static sites win decisively in 2026.&lt;/strong&gt;&lt;/p&gt;
  1464. &lt;p&gt;The performance, security, and minimal maintenance requirements far outweigh the
  1465. initial learning curve of &lt;strong&gt;Markdown&lt;/strong&gt; and &lt;strong&gt;Git&lt;/strong&gt;. If you are still using
  1466. &lt;strong&gt;WordPress&lt;/strong&gt; for a site that only changes once a week, you are paying a
  1467. &amp;ldquo;complexity tax&amp;rdquo; that offers no return on investment.&lt;/p&gt;
  1468. &lt;p&gt;If you&amp;rsquo;re ready to build something better, stop installing plugins and start
  1469. writing &lt;strong&gt;Markdown&lt;/strong&gt;. Your users (and your server bill) will thank you.&lt;/p&gt;
  1470. &lt;blockquote&gt;
  1471. &lt;p&gt;Related:&lt;/p&gt;
  1472. &lt;ul&gt;
  1473. &lt;li&gt;&lt;a href="../plans-for-the-nearest-future-of-this-blog/"&gt;Plans For The Nearest Future Of This Blog&lt;/a&gt;&lt;/li&gt;
  1474. &lt;li&gt;&lt;a href="../introducing-olivero-hugo-theme/"&gt;Introducing Olivero Hugo Theme&lt;/a&gt;&lt;/li&gt;
  1475. &lt;/ul&gt;
  1476. &lt;/blockquote&gt;
  1477. </content:encoded>
  1478. <dc:creator>Val Paliy</dc:creator>
  1479. </item>
  1480. <item>
  1481. <title>The Unsung Heroes of Our Planet: Why Bees Matter More Than Ever</title>
  1482. <link>https://valticus.pro/posts/the-unsung-heroes-of-our-planet-bees/</link>
  1483. <pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate>
  1484. <guid isPermaLink="true">https://valticus.pro/posts/the-unsung-heroes-of-our-planet-bees/</guid>
  1485. <description>Discover why bees are essential to ecosystems, agriculture, and global economies, and learn how to protect these vital pollinators from threats like pesticides, habitat loss, and climate change.</description>
  1486. <category>Environment</category><content:encoded>&lt;h2 id="pollination-the-engine-of-life"&gt;Pollination: The Engine of Life&lt;/h2&gt;
  1487. &lt;p&gt;Pollination is the process by which pollen is transferred from the male part of
  1488. a flower to the female part, enabling fertilization and the production of seeds.
  1489. Bees are among the most efficient pollinators, and their work benefits:&lt;/p&gt;
  1490. &lt;p&gt;- Over 75% of flowering plants: Including wildflowers and crops.&lt;/p&gt;
  1491. &lt;p&gt;- More than 30% of the world’s food supply: Fruits, vegetables, nuts, and seeds
  1492. rely heavily on bee pollination.&lt;/p&gt;
  1493. &lt;p&gt;- Agricultural productivity: Bee-pollinated crops tend to yield more and have
  1494. better quality, flavor, and shelf life.&lt;/p&gt;
  1495. &lt;h2 id="food-security-feeding-the-world"&gt;Food Security: Feeding the World&lt;/h2&gt;
  1496. &lt;p&gt;Bees are essential to global food security. Their pollination services directly
  1497. affect:&lt;/p&gt;
  1498. &lt;p&gt;- Nutritional diversity: Many nutrient-rich foods like berries, avocados, and
  1499. almonds depend on bees.&lt;/p&gt;
  1500. &lt;p&gt;- Livestock feed: Crops like clover and alfalfa, which feed cattle, also rely
  1501. on pollination.&lt;/p&gt;
  1502. &lt;p&gt;- Economic stability: A decline in bee populations could lead to food shortages
  1503. and price spikes.&lt;/p&gt;
  1504. &lt;h2 id="biodiversity-guardians-of-the-ecosystem"&gt;Biodiversity: Guardians of the Ecosystem&lt;/h2&gt;
  1505. &lt;p&gt;Bees play a critical role in maintaining biodiversity:&lt;/p&gt;
  1506. &lt;p&gt;- Wild plant reproduction: Bees help propagate plants that provide habitat and
  1507. food for countless species.&lt;/p&gt;
  1508. &lt;p&gt;- Ecosystem resilience: Diverse plant life supports soil health, water
  1509. retention, and carbon sequestration.&lt;/p&gt;
  1510. &lt;p&gt;- Chain reactions: The decline of bee populations can disrupt entire food webs,
  1511. affecting birds, mammals, and other insects.&lt;/p&gt;
  1512. &lt;h2 id="economic-contributions"&gt;Economic Contributions&lt;/h2&gt;
  1513. &lt;p&gt;The economic value of bees is staggering:&lt;/p&gt;
  1514. &lt;p&gt;- Pollination services: Estimated to be worth over $200 billion globally each
  1515. year.&lt;/p&gt;
  1516. &lt;p&gt;- Beekeeping industry: Produces honey, beeswax, royal jelly, and propolis,
  1517. supporting rural economies.&lt;/p&gt;
  1518. &lt;p&gt;- Job creation: From farming to food production, bees indirectly support
  1519. millions of jobs.&lt;/p&gt;
  1520. &lt;h2 id="cultural-and-symbolic-significance"&gt;Cultural and Symbolic Significance&lt;/h2&gt;
  1521. &lt;p&gt;Bees have long held symbolic meaning:&lt;/p&gt;
  1522. &lt;p&gt;- Ancient civilizations: Egyptians associated bees with royalty and
  1523. resurrection.&lt;/p&gt;
  1524. &lt;p&gt;- Modern symbolism: Bees represent community, diligence, and sustainability.&lt;/p&gt;
  1525. &lt;p&gt;- Spiritual practices: In some cultures, bees are seen as messengers between
  1526. worlds.&lt;/p&gt;
  1527. &lt;h2 id="threats-to-bee-populations"&gt;Threats to Bee Populations&lt;/h2&gt;
  1528. &lt;p&gt;Despite their importance, bees face numerous threats:&lt;/p&gt;
  1529. &lt;p&gt;- Pesticides: Chemicals like neonicotinoids impair bee navigation and
  1530. reproduction.&lt;/p&gt;
  1531. &lt;p&gt;- Habitat loss: Urbanization and monoculture farming reduce floral diversity.&lt;/p&gt;
  1532. &lt;p&gt;- Climate change: Alters blooming cycles and disrupts bee foraging patterns.&lt;/p&gt;
  1533. &lt;p&gt;- Diseases and parasites: Varroa mites and colony collapse disorder have
  1534. devastated hives globally.&lt;/p&gt;
  1535. &lt;h2 id="conservation-and-action"&gt;Conservation and Action&lt;/h2&gt;
  1536. &lt;p&gt;Protecting bees is a collective responsibility. Here’s how individuals and
  1537. communities can help:&lt;/p&gt;
  1538. &lt;p&gt;- Plant native flowers: Choose a variety of blooms that provide nectar and
  1539. pollen throughout the seasons.&lt;/p&gt;
  1540. &lt;p&gt;- Avoid harmful chemicals: Use organic gardening methods and support
  1541. pesticide-free farming.&lt;/p&gt;
  1542. &lt;p&gt;- Support local beekeepers: Buy local honey and bee products.&lt;/p&gt;
  1543. &lt;p&gt;- Educate and advocate: Promote pollinator-friendly policies and raise
  1544. awareness.&lt;/p&gt;
  1545. &lt;h2 id="a-future-worth-buzzing-about"&gt;A Future Worth Buzzing About&lt;/h2&gt;
  1546. &lt;p&gt;Bees are more than just insects—they are architects of life. Their survival
  1547. ensures the continuity of ecosystems, the stability of food systems, and the
  1548. health of our planet. By protecting bees, we protect ourselves and future
  1549. generations.&lt;/p&gt;
  1550. </content:encoded>
  1551. <dc:creator>Val Paliy</dc:creator>
  1552. </item>
  1553. <item>
  1554. <title>W3C Standards Ignored by Search Engines Since 2009</title>
  1555. <link>https://valticus.pro/posts/w3c-standards-ignored-by-search-engines/</link>
  1556. <pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate>
  1557. <guid isPermaLink="true">https://valticus.pro/posts/w3c-standards-ignored-by-search-engines/</guid>
  1558. <description>Since 2009, major search engines have quietly dropped support for numerous W3C-standardized meta tags. From the infamous keywords meta tag to lesser-known elements like abstract, author, and revisit-after, discover what the W3C defined and what search engines actually use.</description>
  1559. <category>Web Development</category><content:encoded>&lt;p&gt;Back in 2009, Google officially confirmed what many in the web development
  1560. community had long suspected: the keywords meta tag was completely ignored in
  1561. web search rankings. But this was just the tip of the iceberg. What many don&amp;rsquo;t
  1562. realize is that the W3C standardized numerous other meta tags that search
  1563. engines have quietly abandoned over the years. Let&amp;rsquo;s take a nostalgic journey
  1564. through these digital dinosaurs.&lt;/p&gt;
  1565. &lt;h2 id="the-infamous-keywords-meta-tag"&gt;The Infamous Keywords Meta Tag&lt;/h2&gt;
  1566. &lt;p&gt;The &lt;code&gt;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;...&amp;quot;&amp;gt;&lt;/code&gt; tag was once the crown jewel of SEO
  1567. optimization. In the mid-1990s, search engines like AltaVista and Infoseek
  1568. heavily relied on this tag to index content. Webmasters would carefully craft
  1569. comma-separated keyword lists hoping to rank higher in search results.&lt;/p&gt;
  1570. &lt;p&gt;Then came the abuse. Keyword stuffing became epidemic—webmasters would load
  1571. their pages with irrelevant keywords that had nothing to do with their actual
  1572. content. Search engines quickly learned they couldn&amp;rsquo;t trust self-reported
  1573. metadata.&lt;/p&gt;
  1574. &lt;p&gt;In September 2009, Google&amp;rsquo;s Matt Cutts officially announced what many had
  1575. suspected: Google doesn&amp;rsquo;t use the keywords meta tag in web search ranking. Yahoo
  1576. followed shortly after, essentially burying this W3C-standardized element.&lt;/p&gt;
  1577. &lt;p&gt;Interestingly, the W3C HTML specification still acknowledges this tag, even
  1578. noting in the spec itself: &amp;ldquo;Many search engines do not consider such keywords,
  1579. because this feature has historically been used unreliably and even misleadingly
  1580. as a way to spam search engine results.&amp;rdquo;&lt;/p&gt;
  1581. &lt;h2 id="the-forgotten-siblings"&gt;The Forgotten Siblings&lt;/h2&gt;
  1582. &lt;p&gt;Beyond keywords, several other W3C-standardized meta tags have fallen by the
  1583. wayside:&lt;/p&gt;
  1584. &lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt; — Intended to provide a brief summary of the page content. Search
  1585. engines have never used it.&lt;/p&gt;
  1586. &lt;p&gt;&lt;strong&gt;Author&lt;/strong&gt; — Specifies the author of the document. Despite being a standard
  1587. since HTML 4.01, no major search engine uses it for ranking purposes.&lt;/p&gt;
  1588. &lt;p&gt;&lt;strong&gt;Copyright&lt;/strong&gt; — Meant to declare copyright information. While semantically
  1589. useful, search engines ignore it completely.&lt;/p&gt;
  1590. &lt;p&gt;&lt;strong&gt;Date&lt;/strong&gt; — Specifies the creation date of the document. Not used by any search
  1591. engine for indexing.&lt;/p&gt;
  1592. &lt;p&gt;&lt;strong&gt;Distribution&lt;/strong&gt; — Intended to indicate the distribution level (global, local,
  1593. etc.). Completely ignored.&lt;/p&gt;
  1594. &lt;p&gt;&lt;strong&gt;Language&lt;/strong&gt; — Declares the primary language. Browsers can determine this from
  1595. the &lt;code&gt;lang&lt;/code&gt; attribute on the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element, making this redundant.&lt;/p&gt;
  1596. &lt;p&gt;&lt;strong&gt;Publisher&lt;/strong&gt; — Identifies the publisher of the document. Not used by search
  1597. engines.&lt;/p&gt;
  1598. &lt;p&gt;&lt;strong&gt;Rating&lt;/strong&gt; — Content rating (like PG-13). No search engine pays attention to it.&lt;/p&gt;
  1599. &lt;p&gt;&lt;strong&gt;Reply-to&lt;/strong&gt; — Email address for contact. Not indexed.&lt;/p&gt;
  1600. &lt;p&gt;&lt;strong&gt;Revisit-after&lt;/strong&gt; — Suggested crawler revisit interval. Google explicitly states
  1601. this is ignored in favor of XML sitemaps, which offer more precise control.&lt;/p&gt;
  1602. &lt;h2 id="the-meta-refresh-debacle"&gt;The Meta Refresh Debacle&lt;/h2&gt;
  1603. &lt;p&gt;The &lt;code&gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;...&amp;quot;&amp;gt;&lt;/code&gt; tag was standardized for
  1604. auto-refreshing pages and simple redirects. However:&lt;/p&gt;
  1605. &lt;ul&gt;
  1606. &lt;li&gt;It&amp;rsquo;s been deprecated for over a decade&lt;/li&gt;
  1607. &lt;li&gt;W3C&amp;rsquo;s Web Content Accessibility Guidelines 2.0 explicitly warn against it&lt;/li&gt;
  1608. &lt;li&gt;Users find it confusing and inaccessible&lt;/li&gt;
  1609. &lt;li&gt;Server-side 301 redirects are the proper way to handle URL changes&lt;/li&gt;
  1610. &lt;/ul&gt;
  1611. &lt;h2 id="what-survived"&gt;What Survived?&lt;/h2&gt;
  1612. &lt;p&gt;Despite the extinction of most meta tags, a few have stood the test of time:&lt;/p&gt;
  1613. &lt;ul&gt;
  1614. &lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; — Still used by Google for search result snippets (though not
  1615. for ranking)&lt;/li&gt;
  1616. &lt;li&gt;&lt;strong&gt;Robots&lt;/strong&gt; — Controls indexing behavior (noindex, nofollow, etc.)&lt;/li&gt;
  1617. &lt;li&gt;&lt;strong&gt;Viewport&lt;/strong&gt; — Essential for mobile responsiveness&lt;/li&gt;
  1618. &lt;li&gt;&lt;strong&gt;Theme-color&lt;/strong&gt; — Used by browsers for UI chrome&lt;/li&gt;
  1619. &lt;/ul&gt;
  1620. &lt;h2 id="the-takeaway"&gt;The Takeaway&lt;/h2&gt;
  1621. &lt;p&gt;The history of meta tags teaches us an important lesson: search engines evolved
  1622. to prioritize signals that couldn&amp;rsquo;t be easily manipulated. When a ranking factor
  1623. becomes unreliable due to abuse, search engines move on.&lt;/p&gt;
  1624. &lt;p&gt;The W3C maintains standards that reflect what &lt;em&gt;could&lt;/em&gt; be useful, while search
  1625. engines make practical decisions based on &lt;em&gt;actual&lt;/em&gt; usefulness. This tension
  1626. between standards bodies and search engine behavior continues to shape web
  1627. development practices today.&lt;/p&gt;
  1628. &lt;p&gt;So next time you see a meta tag that feels obsolete, there&amp;rsquo;s probably a good
  1629. reason—and a history lesson behind it.&lt;/p&gt;
  1630. &lt;hr&gt;
  1631. &lt;p&gt;&lt;em&gt;Note: While these meta tags may not help with search rankings, they aren&amp;rsquo;t
  1632. harmful to include. Some internal site search engines and tools may still use
  1633. them. And who knows? Perhaps someday search engines will find new uses for the
  1634. metadata authors carefully provide.&lt;/em&gt;&lt;/p&gt;
  1635. &lt;blockquote&gt;
  1636. &lt;p&gt;Related:&lt;/p&gt;
  1637. &lt;ul&gt;
  1638. &lt;li&gt;&lt;a href="../accessibility-is-still-broken-heres-why/"&gt;Accessibility Is Still Broken (Here&amp;rsquo;s Why)&lt;/a&gt;&lt;/li&gt;
  1639. &lt;li&gt;&lt;a href="../seo-vs-performance-how-to-balance-both/"&gt;SEO vs Performance: How to Balance Both&lt;/a&gt;&lt;/li&gt;
  1640. &lt;li&gt;&lt;a href="../google-search-radical-redesign/"&gt;Inside Google Search&amp;rsquo;s Most Radical Redesign in 25 Years&lt;/a&gt;&lt;/li&gt;
  1641. &lt;li&gt;&lt;a href="../why-seo-is-mostly-dead-and-what-replaced-it/"&gt;Why SEO Is Mostly Dead (And What Replaced It)&lt;/a&gt;&lt;/li&gt;
  1642. &lt;/ul&gt;
  1643. &lt;/blockquote&gt;
  1644. </content:encoded>
  1645. <dc:creator>Val Paliy</dc:creator>
  1646. </item>
  1647. </channel>
  1648. </rss>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.rssboard.org/rss-validator/check.cgi?url=https%3A//valticus.pro/index.xml

Software created by Sam Ruby, Mark Pilgrim, Joseph Walton and Phil Ringnalda