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>
                                              ^

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>Tue, 08 Sep 2026 09:17:31 +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>Shinrin-Yoku: What Forest Bathing Can Teach Us About Digital Wellbeing</title>
  18. <link>https://valticus.pro/posts/shinrin-yoku-what-forest-bathing-can-teach-us-about-digital-wellbeing/</link>
  19. <pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate>
  20. <guid isPermaLink="true">https://valticus.pro/posts/shinrin-yoku-what-forest-bathing-can-teach-us-about-digital-wellbeing/</guid>
  21. <description>The Japanese practice of forest bathing is not about exercise — it is about attention. And the lessons it offers apply directly to how we build, use, and think about technology.</description>
  22. <category>Technology</category>
  23. <category>Lifestyle</category><content:encoded>&lt;h2 id="the-walk-that-changed-nothing"&gt;The Walk That Changed Nothing&lt;/h2&gt;
  24. &lt;p&gt;In 1982, the Japanese Ministry of Agriculture, Forestry, and Fisheries coined a
  25. term that would quietly reshape how an entire culture thinks about health:
  26. &lt;strong&gt;shinrin-yoku&lt;/strong&gt; (森林浴). The literal translation is &amp;ldquo;forest bath.&amp;rdquo; Not a hike.
  27. Not exercise. Not a nature walk with a fitness tracker counting your steps. A
  28. bath — something you soak in, something that surrounds you, something you do not
  29. actively pursue but passively receive.&lt;/p&gt;
  30. &lt;p&gt;The practice is deceptively simple. You walk slowly through a forest. You stop
  31. frequently. You breathe. You listen. You look at the way light filters through
  32. the canopy. You notice the texture of bark, the smell of damp earth, the sound
  33. of water moving over stones. There is no destination. There is no goal. There is
  34. no metric.&lt;/p&gt;
  35. &lt;figure&gt;
  36. &lt;div class="progressive-image"&gt;
  37. &lt;img class="progressive-image__img"
  38. src="https://valticus.pro/images/shinrin-yoku-what-forest-bathing-can-teach-us-about-digital-wellbeing_hu_bde8de6fa7cb4334.webp"
  39. alt="Shinrin-Yoku: What Forest Bathing Can Teach Us About Digital Wellbeing."
  40. width="800"
  41. height="436"&gt;
  42. &lt;/div&gt;
  43. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Shinrin-Yoku: What Forest Bathing Can Teach Us About Digital Wellbeing.&lt;/p&gt;&lt;/figcaption&gt;
  44. &lt;/figure&gt;
  45. &lt;h2 id="what-shinrin-yoku-actually-is"&gt;What Shinrin-Yoku Actually Is&lt;/h2&gt;
  46. &lt;p&gt;Dr. Qing Li, one of the world&amp;rsquo;s foremost researchers on forest medicine, has
  47. spent decades studying what happens to the human body during shinrin-yoku. His
  48. findings are precise: exposure to forests reduces cortisol concentrations by
  49. 12.4 percent, lowers pulse rate, reduces blood pressure, and increases the
  50. activity of natural killer cells — a key part of the immune system.&lt;/p&gt;
  51. &lt;p&gt;But Li is careful to distinguish shinrin-yoku from exercise. The health benefits
  52. are not primarily physical. They are &lt;strong&gt;biochemical&lt;/strong&gt;. Trees release organic
  53. compounds called phytoncides — essentially, the essential oils that protect them
  54. from insects and decay. When we breathe these compounds, our bodies respond. The
  55. immune system activates. The nervous system shifts from sympathetic
  56. (fight-or-flight) to parasympathetic (rest-and-digest).&lt;/p&gt;
  57. &lt;p&gt;This is not metaphor. It is measurable biology. But the measurement misses the
  58. point.&lt;/p&gt;
  59. &lt;p&gt;The point, as the Japanese understood it, is &lt;strong&gt;attention&lt;/strong&gt;. Shinrin-yoku is
  60. practice in attending to the world without trying to extract value from it. You
  61. do not go to the forest to get something. You go to be in the forest. The health
  62. benefits are a side effect of a deeper shift: the decision to stop producing,
  63. consuming, optimizing, and instead simply &lt;strong&gt;be present&lt;/strong&gt;.&lt;/p&gt;
  64. &lt;h2 id="the-productivity-trap-in-wellness"&gt;The Productivity Trap in Wellness&lt;/h2&gt;
  65. &lt;p&gt;Here is where shinrin-yoku becomes uncomfortable for anyone who works with
  66. technology — which is to say, for anyone who reads this blog.&lt;/p&gt;
  67. &lt;p&gt;We have turned wellness into another productivity metric. Meditation apps track
  68. your streak. Fitness watches quantify your recovery. Sleep trackers rank your
  69. rest. Even nature has been captured: there are apps that remind you to go
  70. outside, apps that gamify forest walks, apps that reward you with badges for
  71. breathing fresh air.&lt;/p&gt;
  72. &lt;p&gt;This is the same logic that produced the modern web&amp;rsquo;s abundance problem. We
  73. cannot leave anything alone. We cannot let a walk be a walk. We must measure it,
  74. optimize it, share it, track it. The moment we add a sensor to an experience, we
  75. change the experience. We shift our attention from the thing itself to the data
  76. about the thing.&lt;/p&gt;
  77. &lt;p&gt;Shinrin-yoku resists this. The entire practice is built on the principle that
  78. &lt;strong&gt;the experience is the point, not the measurement of the experience&lt;/strong&gt;. You do
  79. not need a heart rate monitor to know that you feel calmer after sitting under a
  80. tree. You do not need a cortisol test to know that the smell of cedar makes you
  81. feel better. You already know. Your body knows. The data just confirms what
  82. attention already revealed.&lt;/p&gt;
  83. &lt;h2 id="what-this-has-to-do-with-the-web"&gt;What This Has to Do With the Web&lt;/h2&gt;
  84. &lt;p&gt;In
  85. &lt;a href="https://valticus.pro/posts/hodo-hodo-the-japanese-philosophy-that-could-fix-web-design/"&gt;Hodo-Hodo: The Japanese Philosophy That Could Fix Web Design&lt;/a&gt;,
  86. I wrote about Taku Satoh&amp;rsquo;s concept of &amp;ldquo;just enough&amp;rdquo; — the idea that design
  87. should provide exactly what is needed and no more. Hodo-hodo is about
  88. &lt;strong&gt;restraint in service of the user&lt;/strong&gt;. It is design that trusts the person on the
  89. other side.&lt;/p&gt;
  90. &lt;p&gt;Shinrin-yoku extends this idea from design into &lt;strong&gt;living&lt;/strong&gt;. If hodo-hodo asks
  91. &amp;ldquo;Is this enough?&amp;rdquo; about a button or a layout, shinrin-yoku asks the same
  92. question about our entire relationship with technology. Not &amp;ldquo;How can I use
  93. technology more?&amp;rdquo; but &amp;ldquo;Is this enough? Is this the right amount? Should I stop
  94. here?&amp;rdquo;&lt;/p&gt;
  95. &lt;p&gt;The connection is not accidental. Both concepts come from a Japanese
  96. understanding of the world that does not separate the human from the
  97. environment. In Western thought, we tend to see nature as a resource to be
  98. managed or a backdrop for human activity. In the Japanese tradition — influenced
  99. by Shinto, Buddhism, and centuries of living in dense forests on a volcanic
  100. island — the boundary between person and world is more fluid. You do not go into
  101. the forest. You become part of it. The forest bathes you.&lt;/p&gt;
  102. &lt;p&gt;The web, similarly, is not a tool we use. It is an environment we inhabit. We
  103. spend eight, ten, twelve hours a day inside it. It shapes how we think, what we
  104. pay attention to, how we relate to other people. To treat it as a neutral tool —
  105. something we pick up and put down at will — is to misunderstand its power.&lt;/p&gt;
  106. &lt;h2 id="the-attention-economy-is-a-clear-cut-forest"&gt;The Attention Economy Is a Clear-Cut Forest&lt;/h2&gt;
  107. &lt;p&gt;If shinrin-yoku is about attending to the world, the attention economy is about
  108. extracting from it. Every app, every notification, every infinite scroll feed is
  109. designed to capture a specific resource: your attention. Not your money — your
  110. attention. Money follows attention, which is why the extraction is so
  111. aggressive.&lt;/p&gt;
  112. &lt;p&gt;The parallel to actual forests is instructive. In the twentieth century, Japan
  113. rapidly industrialized and clear-cut vast areas of forest. The economic gains
  114. were immediate. The ecological costs were deferred — soil erosion, flooding,
  115. loss of biodiversity, the quiet disappearance of species that had existed for
  116. millennia.&lt;/p&gt;
  117. &lt;p&gt;The attention economy is doing the same thing to human consciousness. We are
  118. clear-cutting our capacity for sustained attention, deep thought, and
  119. uninterrupted reflection. The economic gains are immediate — engagement metrics
  120. go up, ad revenue increases, user sessions lengthen. The costs are deferred:
  121. anxiety, depression, the inability to read a long article without checking
  122. Twitter, the creeping sense that something important is always happening
  123. somewhere else.&lt;/p&gt;
  124. &lt;p&gt;Shinrin-yoku was Japan&amp;rsquo;s response to ecological devastation. It was a
  125. deliberate, government-sponsored attempt to reconnect people with the forests
  126. they had destroyed — not to extract more from them, but to &lt;strong&gt;remember what it
  127. felt like to be inside them&lt;/strong&gt;. The health benefits were real, but the deeper
  128. purpose was cultural: to rebuild a relationship with the natural world that
  129. industrialization had severed.&lt;/p&gt;
  130. &lt;p&gt;We need something similar for the digital world. Not a rejection of technology —
  131. that is neither possible nor desirable. But a deliberate practice of &lt;strong&gt;stepping
  132. outside the extraction cycle&lt;/strong&gt; and remembering what it feels like to pay
  133. attention to something that is not asking for your attention.&lt;/p&gt;
  134. &lt;h2 id="what-forest-bathing-looks-like-offline"&gt;What Forest Bathing Looks Like Offline&lt;/h2&gt;
  135. &lt;p&gt;The physical practice of shinrin-yoku has specific characteristics that
  136. distinguish it from a casual walk:&lt;/p&gt;
  137. &lt;p&gt;&lt;strong&gt;Slow movement.&lt;/strong&gt; The recommended pace is about one kilometer per hour — far
  138. slower than a typical walking pace. The slowness is the point. It forces you to
  139. notice things you would otherwise pass without seeing.&lt;/p&gt;
  140. &lt;p&gt;&lt;strong&gt;All senses engaged.&lt;/strong&gt; Shinrin-yoku emphasizes not just sight but sound (bird
  141. calls, water, wind), smell (earth, pine, decay), touch (bark, moss, stone), and
  142. even taste (the clean air itself). The multi-sensory engagement pulls attention
  143. away from abstract thought and into the physical present.&lt;/p&gt;
  144. &lt;p&gt;&lt;strong&gt;No destination.&lt;/strong&gt; There is no trail to complete, no summit to reach, no loop
  145. to close. You walk until you decide to stop. You stop until you decide to walk
  146. again. The absence of a goal removes the subtle pressure to be productive.&lt;/p&gt;
  147. &lt;p&gt;&lt;strong&gt;Frequent pauses.&lt;/strong&gt; Practitioners are encouraged to stop often — to sit on a
  148. log, to stand under a canopy, to lean against a tree. These pauses are not
  149. breaks between the real activity. They &lt;strong&gt;are&lt;/strong&gt; the activity. The sitting is the
  150. point.&lt;/p&gt;
  151. &lt;p&gt;&lt;strong&gt;No photography.&lt;/strong&gt; This is not an official rule, but many practitioners observe
  152. it. The moment you raise a camera, you shift from experiencing the forest to
  153. capturing it. You begin composing instead of observing. The image becomes more
  154. important than the moment.&lt;/p&gt;
  155. &lt;h2 id="what-forest-bathing-looks-like-online"&gt;What Forest Bathing Looks Like Online&lt;/h2&gt;
  156. &lt;p&gt;If we translate these principles into our digital lives, we get something like
  157. this:&lt;/p&gt;
  158. &lt;p&gt;&lt;strong&gt;Slow consumption.&lt;/strong&gt; Instead of scrolling through a feed at the speed of your
  159. thumb, read one article completely. Finish it. Sit with it. Think about it
  160. before moving to the next thing. The slowness is not a limitation — it is the
  161. condition for depth.&lt;/p&gt;
  162. &lt;p&gt;&lt;strong&gt;Full attention.&lt;/strong&gt; Instead of half-reading an article while checking
  163. notifications, give the article your complete attention. Close the tabs that are
  164. not relevant. Silence the phone. Not forever — for the duration of the reading.
  165. Treat the act of reading as something worth your full presence.&lt;/p&gt;
  166. &lt;p&gt;&lt;strong&gt;No metrics.&lt;/strong&gt; Do not check how many views your blog post received today. Do
  167. not refresh your analytics dashboard. Do not count your followers. The numbers
  168. are real, but they are not the point. The point is the writing, the thinking,
  169. the act of putting something into the world that did not exist before.&lt;/p&gt;
  170. &lt;p&gt;&lt;strong&gt;Frequent pauses.&lt;/strong&gt; Step away from the screen. Not to check your phone in
  171. another room — that is just relocating the extraction. Step away to do nothing.
  172. To stare at a wall. To look out a window. To let your mind wander without input.
  173. These pauses are not breaks between the real work of being online. They &lt;strong&gt;are&lt;/strong&gt;
  174. the real work.&lt;/p&gt;
  175. &lt;p&gt;&lt;strong&gt;No documentation.&lt;/strong&gt; Not every experience needs to be shared. Not every thought
  176. needs to become a tweet. Not every meal needs a photo. Some things are worth
  177. keeping for yourself. The moment you share an experience, you partially
  178. surrender it to other people&amp;rsquo;s attention — and their attention is shaped by the
  179. same extractive systems you are trying to step outside of.&lt;/p&gt;
  180. &lt;h2 id="the-deeper-lesson"&gt;The Deeper Lesson&lt;/h2&gt;
  181. &lt;p&gt;Shinrin-yoku teaches that health is not something you achieve through effort. It
  182. is something that happens when you stop interfering with it. The forest does not
  183. heal you. It creates the conditions in which your body can heal itself. Your
  184. role is to show up, be present, and get out of the way.&lt;/p&gt;
  185. &lt;p&gt;The same is true for our mental health in a digital world. We do not need more
  186. productivity hacks, more screen time trackers, more apps that tell us when to
  187. put our phones down. We need the willingness to &lt;strong&gt;do nothing&lt;/strong&gt; — to sit in a
  188. room without input, to walk outside without a device, to let a few hours pass
  189. without documenting, sharing, or optimizing them.&lt;/p&gt;
  190. &lt;p&gt;This is hard. It is hard precisely because the systems we have built are
  191. designed to make it hard. Every notification, every red badge, every &amp;ldquo;You might
  192. also like&amp;rdquo; is a micro-interruption that pulls you back into the extraction
  193. cycle. The forest does not send you push notifications. The trees do not
  194. algorithmically suggest other trees you might enjoy. The river does not track
  195. your engagement metrics.&lt;/p&gt;
  196. &lt;p&gt;Nature&amp;rsquo;s indifference to your attention is, paradoxically, what makes it
  197. healing. It asks nothing of you. It does not need you to click, scroll, like,
  198. share, or subscribe. It simply exists, and invites you to exist alongside it.&lt;/p&gt;
  199. &lt;h2 id="a-practice-not-a-solution"&gt;A Practice, Not a Solution&lt;/h2&gt;
  200. &lt;p&gt;I want to be careful not to turn shinrin-yoku into another life hack. The
  201. Japanese did not develop it as a quick fix for stress. They developed it as a
  202. &lt;strong&gt;practice&lt;/strong&gt; — something you do regularly, over a lifetime, without expecting
  203. dramatic results. The benefits accumulate slowly, invisibly, in ways that are
  204. felt rather than measured.&lt;/p&gt;
  205. &lt;p&gt;The same approach applies to our relationship with technology. You will not
  206. solve your screen time problem with a single digital detox weekend. You will not
  207. reclaim your attention by deleting one app. What you can do is build small,
  208. regular practices of stepping outside the extraction cycle:&lt;/p&gt;
  209. &lt;ul&gt;
  210. &lt;li&gt;Walk without your phone once a week. Not to get somewhere. Just to walk.&lt;/li&gt;
  211. &lt;li&gt;Read one long article a day without switching tabs.&lt;/li&gt;
  212. &lt;li&gt;Spend one evening a week without any screens. Not as punishment. As
  213. experimentation.&lt;/li&gt;
  214. &lt;li&gt;Sit in a room for fifteen minutes without doing anything. No phone, no book,
  215. no music. Just sitting.&lt;/li&gt;
  216. &lt;/ul&gt;
  217. &lt;p&gt;None of these will transform your life. That is not the point. The point is to
  218. rebuild, slowly, the capacity for attention that the attention economy has
  219. eroded. The point is to remember what it feels like to be present — to yourself,
  220. to your environment, to the quiet, unremarkable act of being alive.&lt;/p&gt;
  221. &lt;p&gt;The forest does not need you to be productive. Neither does the rest of your
  222. life.&lt;/p&gt;
  223. </content:encoded>
  224. <dc:creator>Val Paliy</dc:creator>
  225. </item>
  226. <item>
  227. <title>Hugo Deep Dive: Customizing and Extending the CMS</title>
  228. <link>https://valticus.pro/posts/hugo-deep-dive-customizing-and-extending-the-cms/</link>
  229. <pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
  230. <guid isPermaLink="true">https://valticus.pro/posts/hugo-deep-dive-customizing-and-extending-the-cms/</guid>
  231. <description>An advanced technical guide to customizing and extending Hugo static site generator with real-world examples: shortcodes, custom output formats, and image processing.</description>
  232. <category>Web Development</category>
  233. <category>Technology</category><content:encoded>&lt;p&gt;Hugo is often marketed as the &amp;ldquo;world&amp;rsquo;s fastest framework for building websites,&amp;rdquo;
  234. but speed is only half the story. The real power of Hugo lies in its
  235. flexibility. While many developers use it as a simple blog engine, it is
  236. actually a robust, data-driven content platform that can handle complex
  237. documentation, enterprise portfolios, and even &lt;strong&gt;headless CMS architectures&lt;/strong&gt;.&lt;/p&gt;
  238. &lt;p&gt;In this deep dive, we’ll move beyond the basics of &amp;ldquo;hugo new site&amp;rdquo; and explore
  239. how to extend the engine to suit sophisticated requirements. If you haven&amp;rsquo;t yet,
  240. check out my
  241. &lt;a href="https://valticus.pro/posts/introducing-olivero-hugo-theme/"&gt;Introducing Olivero Hugo Theme&lt;/a&gt; for a
  242. practical example of how these concepts come together in a production-ready
  243. theme.&lt;/p&gt;
  244. &lt;figure&gt;
  245. &lt;div class="progressive-image"&gt;
  246. &lt;img class="progressive-image__img"
  247. src="https://valticus.pro/images/hugo-deep-dive-customizing-and-extending-the-cms_hu_ebee8dfd179dc776.webp"
  248. alt="Hugo Deep Dive: Customizing and Extending the CMS."
  249. width="800"
  250. height="436"&gt;
  251. &lt;/div&gt;
  252. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Hugo Deep Dive: Customizing and Extending the CMS.&lt;/p&gt;&lt;/figcaption&gt;
  253. &lt;/figure&gt;
  254. &lt;h2 id="hugo-feature-matrix-from-simple-to-advanced"&gt;Hugo Feature Matrix: From Simple to Advanced&lt;/h2&gt;
  255. &lt;table&gt;
  256. &lt;thead&gt;
  257. &lt;tr&gt;
  258. &lt;th style="text-align: left"&gt;Feature Level&lt;/th&gt;
  259. &lt;th style="text-align: left"&gt;Capability&lt;/th&gt;
  260. &lt;th style="text-align: left"&gt;Use Case&lt;/th&gt;
  261. &lt;/tr&gt;
  262. &lt;/thead&gt;
  263. &lt;tbody&gt;
  264. &lt;tr&gt;
  265. &lt;td style="text-align: left"&gt;&lt;strong&gt;Basic&lt;/strong&gt;&lt;/td&gt;
  266. &lt;td style="text-align: left"&gt;Markdown to HTML&lt;/td&gt;
  267. &lt;td style="text-align: left"&gt;Personal blogs, simple landing pages&lt;/td&gt;
  268. &lt;/tr&gt;
  269. &lt;tr&gt;
  270. &lt;td style="text-align: left"&gt;&lt;strong&gt;Intermediate&lt;/strong&gt;&lt;/td&gt;
  271. &lt;td style="text-align: left"&gt;&lt;strong&gt;Shortcodes&lt;/strong&gt; &amp;amp; &lt;strong&gt;Partials&lt;/strong&gt;&lt;/td&gt;
  272. &lt;td style="text-align: left"&gt;Reusable UI components, embeds&lt;/td&gt;
  273. &lt;/tr&gt;
  274. &lt;tr&gt;
  275. &lt;td style="text-align: left"&gt;&lt;strong&gt;Advanced&lt;/strong&gt;&lt;/td&gt;
  276. &lt;td style="text-align: left"&gt;&lt;strong&gt;Custom Output Formats&lt;/strong&gt;&lt;/td&gt;
  277. &lt;td style="text-align: left"&gt;JSON APIs, Atom feeds, CSV exports&lt;/td&gt;
  278. &lt;/tr&gt;
  279. &lt;tr&gt;
  280. &lt;td style="text-align: left"&gt;&lt;strong&gt;Expert&lt;/strong&gt;&lt;/td&gt;
  281. &lt;td style="text-align: left"&gt;&lt;strong&gt;Hugo Modules&lt;/strong&gt; &amp;amp; &lt;strong&gt;Go Pipes&lt;/strong&gt;&lt;/td&gt;
  282. &lt;td style="text-align: left"&gt;Theme inheritance, complex asset pipelines&lt;/td&gt;
  283. &lt;/tr&gt;
  284. &lt;/tbody&gt;
  285. &lt;/table&gt;
  286. &lt;h2 id="1-custom-shortcodes-beyond-markdown"&gt;1. Custom Shortcodes: Beyond Markdown&lt;/h2&gt;
  287. &lt;p&gt;Shortcodes are Hugo&amp;rsquo;s way of allowing you to embed complex HTML inside your
  288. Markdown files without cluttering your content with raw HTML tags.&lt;/p&gt;
  289. &lt;h3 id="the-notice-component"&gt;The &amp;ldquo;Notice&amp;rdquo; Component&lt;/h3&gt;
  290. &lt;p&gt;Instead of using blockquotes for warnings, create a dedicated shortcode in
  291. &lt;code&gt;layouts/shortcodes/notice.html&lt;/code&gt;:&lt;/p&gt;
  292. &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;{{- $type := .Get &amp;#34;type&amp;#34; | default &amp;#34;info&amp;#34; -}} {{- $title := .Get &amp;#34;title&amp;#34; |
  293. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;default (upper $type) -}}
  294. &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;notice notice-{{ $type }}&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;alert&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  295. &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;notice-header&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  296. &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;notice-icon&amp;#34;&lt;/span&gt;
  297. &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;{{ if eq $type &amp;#34;warning&amp;#34; }}⚠️{{ else }}ℹ️{{ end }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;
  298. &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;
  299. &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;strong&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;notice-title&amp;#34;&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;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  300. &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;
  301. &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;notice-content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Inner | markdownify }}&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;
  302. &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;
  303. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Usage in Markdown:&lt;/strong&gt;&lt;/p&gt;
  304. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; notice type=&amp;#34;warning&amp;#34; title=&amp;#34;Critical Update&amp;#34; &amp;gt;}} Always backup your
  305. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`config.toml`&lt;/span&gt; before updating Hugo versions. {{&amp;lt; /notice &amp;gt;}}
  306. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
  307. &lt;h3 id="-pro-tip-shortcode-performance"&gt;💡 Pro Tip: Shortcode Performance&lt;/h3&gt;
  308. &lt;p&gt;Use &lt;code&gt;{{&amp;lt; shortcode &amp;gt;}}&lt;/code&gt; (with brackets) for content that Hugo should
  309. process as Markdown, and &lt;code&gt;{{% shortcode %}}&lt;/code&gt; (with percent signs) only if
  310. you need the inner content to be fully rendered before the shortcode logic
  311. executes. For 90% of cases, the bracket syntax is faster and safer.&lt;/p&gt;
  312. &lt;/blockquote&gt;
  313. &lt;h2 id="2-advanced-image-processing"&gt;2. Advanced Image Processing&lt;/h2&gt;
  314. &lt;p&gt;One of Hugo&amp;rsquo;s killer features is its ability to process images on the fly. You
  315. don&amp;rsquo;t need a separate build step to generate thumbnails or &lt;strong&gt;WebP&lt;/strong&gt; versions.&lt;/p&gt;
  316. &lt;h3 id="the-responsive-image-partial"&gt;The Responsive Image Partial&lt;/h3&gt;
  317. &lt;p&gt;&lt;code&gt;layouts/partials/responsive-image.html&lt;/code&gt;:&lt;/p&gt;
  318. &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;{{ $img := .Resources.GetMatch .src }} {{ if $img }} {{ $small := $img.Resize
  319. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;400x webp&amp;#34; }} {{ $medium := $img.Resize &amp;#34;800x webp&amp;#34; }} {{ $large := $img.Resize
  320. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;1200x webp&amp;#34; }}
  321. &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;
  322. &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;
  323. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;{{ $small.RelPermalink }} 400w, {{ $medium.RelPermalink }} 800w, {{ $large.RelPermalink }} 1200w&amp;#34;&lt;/span&gt;
  324. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;
  325. &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;
  326. &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;{{ $img.RelPermalink }}&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;{{ .alt }}&amp;#34;&lt;/span&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;lazy&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  327. &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;
  328. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
  329. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This ensures that your users never download a 5MB hero image when a 200KB WebP
  330. would suffice.&lt;/p&gt;
  331. &lt;h2 id="3-custom-output-formats-hugo-as-an-api"&gt;3. Custom Output Formats: Hugo as an API&lt;/h2&gt;
  332. &lt;p&gt;Hugo can output more than just HTML. By defining custom output formats, you can
  333. generate a &lt;strong&gt;JSON search index&lt;/strong&gt;, a CSV of your products, or even a &lt;code&gt;.txt&lt;/code&gt; file
  334. for robots.&lt;/p&gt;
  335. &lt;h3 id="generating-a-json-search-index"&gt;Generating a JSON Search Index&lt;/h3&gt;
  336. &lt;p&gt;In &lt;code&gt;hugo.toml&lt;/code&gt;:&lt;/p&gt;
  337. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  338. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;home&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;JSON&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RSS&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  339. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then create &lt;code&gt;layouts/index.json&lt;/code&gt;:&lt;/p&gt;
  340. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;{-&lt;/span&gt; &lt;span class="err"&gt;$pages&lt;/span&gt; &lt;span class="err"&gt;:=&lt;/span&gt; &lt;span class="err"&gt;where&lt;/span&gt; &lt;span class="err"&gt;.Site.RegularPages&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;Type&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;posts&amp;#34;&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
  341. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
  342. &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="err"&gt;{-&lt;/span&gt; &lt;span class="err"&gt;range&lt;/span&gt; &lt;span class="err"&gt;$index,&lt;/span&gt; &lt;span class="err"&gt;$page&lt;/span&gt; &lt;span class="err"&gt;:=&lt;/span&gt; &lt;span class="err"&gt;$pages&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
  343. &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="err"&gt;{-&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;$index&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;end&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
  344. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  345. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;$page.Title&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
  346. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;excerpt&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;$page.Summary&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;plainify&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  347. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;$page.Permalink&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  348. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;$page.Params.tags&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;jsonify&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
  349. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;}&lt;/span&gt;
  350. &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="err"&gt;{-&lt;/span&gt; &lt;span class="err"&gt;end&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
  351. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  352. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This file will be generated at &lt;code&gt;/index.json&lt;/code&gt;, providing a perfect endpoint for
  353. client-side search libraries like &lt;strong&gt;Fuse.js&lt;/strong&gt;.&lt;/p&gt;
  354. &lt;h2 id="4-hugo-modules-the-modern-way-to-manage-dependencies"&gt;4. Hugo Modules: The Modern Way to Manage Dependencies&lt;/h2&gt;
  355. &lt;p&gt;Forget git submodules. &lt;strong&gt;Hugo Modules&lt;/strong&gt; leverage &lt;strong&gt;Go&amp;rsquo;s module system&lt;/strong&gt; to
  356. manage themes and components.&lt;/p&gt;
  357. &lt;h3 id="initialization"&gt;Initialization&lt;/h3&gt;
  358. &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 mod init github.com/yourusername/my-awesome-site
  359. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="importing-a-theme"&gt;Importing a Theme&lt;/h3&gt;
  360. &lt;p&gt;In &lt;code&gt;hugo.toml&lt;/code&gt;:&lt;/p&gt;
  361. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  362. &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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
  363. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github.com/ValPaliy/olivero-hugo&amp;#34;&lt;/span&gt;
  364. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running &lt;code&gt;hugo mod get -u&lt;/code&gt; will automatically fetch and update your dependencies,
  365. keeping your repository clean and your deployment pipeline predictable.&lt;/p&gt;
  366. &lt;h2 id="5-taxonomies-and-data-driven-content"&gt;5. Taxonomies and Data-Driven Content&lt;/h2&gt;
  367. &lt;p&gt;Hugo isn&amp;rsquo;t limited to &amp;ldquo;Tags&amp;rdquo; and &amp;ldquo;Categories.&amp;rdquo; You can define custom
  368. &lt;strong&gt;taxonomies&lt;/strong&gt; like &amp;ldquo;Series,&amp;rdquo; &amp;ldquo;Authors,&amp;rdquo; or &amp;ldquo;Difficulty Level.&amp;rdquo;&lt;/p&gt;
  369. &lt;h3 id="custom-taxonomy-definition"&gt;Custom Taxonomy Definition&lt;/h3&gt;
  370. &lt;p&gt;In &lt;code&gt;hugo.toml&lt;/code&gt;:&lt;/p&gt;
  371. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;taxonomies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  372. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;
  373. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;categories&amp;#34;&lt;/span&gt;
  374. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;series&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;series&amp;#34;&lt;/span&gt;
  375. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;authors&amp;#34;&lt;/span&gt;
  376. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can then iterate over these in your templates to create complex navigation
  377. structures:&lt;/p&gt;
  378. &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;{{ range .Site.Taxonomies.series }}
  379. &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;Series: {{ .Page.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;
  380. &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;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  381. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ range .Pages }}
  382. &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;li&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;gt;&lt;/span&gt;{{ .Title }}&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;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  383. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {{ end }}
  384. &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;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  385. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
  386. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="6-performance-optimization-with-partial-caching"&gt;6. Performance Optimization with Partial Caching&lt;/h2&gt;
  387. &lt;p&gt;If you have a complex partial (like a navigation menu that iterates over every
  388. page), it can slow down your build time as your site grows.&lt;/p&gt;
  389. &lt;h3 id="the-partialcached-function"&gt;The &lt;code&gt;partialCached&lt;/code&gt; Function&lt;/h3&gt;
  390. &lt;p&gt;Instead of:&lt;/p&gt;
  391. &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;{{ partial &amp;#34;header.html&amp;#34; . }}
  392. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use:&lt;/p&gt;
  393. &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;{{ partialCached &amp;#34;header.html&amp;#34; . }}
  394. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hugo will render the partial once and reuse the output for the rest of the
  395. build. If the partial depends on the current page context, you can provide a
  396. &amp;ldquo;key&amp;rdquo;:&lt;/p&gt;
  397. &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;{{ partialCached &amp;#34;sidebar.html&amp;#34; . .Section }}
  398. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-unsexy-truth-about-hugo"&gt;The Unsexy Truth about Hugo&lt;/h2&gt;
  399. &lt;p&gt;While Hugo is powerful, it has a steep learning curve. The &amp;ldquo;&lt;strong&gt;Go Template&lt;/strong&gt;&amp;rdquo;
  400. syntax can be unforgiving, and the documentation, while comprehensive, is dense.&lt;/p&gt;
  401. &lt;blockquote&gt;
  402. &lt;h3 id="-common-pitfall-over-engineering"&gt;🚩 Common Pitfall: Over-Engineering&lt;/h3&gt;
  403. &lt;p&gt;Just because Hugo can process images, generate JSON, and manage complex module
  404. hierarchies doesn&amp;rsquo;t mean you &lt;em&gt;should&lt;/em&gt; do all of that for a personal blog.
  405. Start with the simplest possible implementation and only extend when the
  406. manual work becomes a bottleneck.&lt;/p&gt;
  407. &lt;/blockquote&gt;
  408. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  409. &lt;p&gt;Hugo is the ultimate tool for developers who value performance and control. By
  410. mastering shortcodes, image processing, and custom output formats, you transform
  411. Hugo from a simple &amp;ldquo;generator&amp;rdquo; into a sophisticated &amp;ldquo;&lt;strong&gt;content engine&lt;/strong&gt;.&amp;rdquo;&lt;/p&gt;
  412. &lt;p&gt;The key to a successful Hugo project is a clean architecture. Keep your logic in
  413. partials, your assets in the assets folder, and your content in clean, semantic
  414. Markdown. When you respect Hugo&amp;rsquo;s conventions, it rewards you with build times
  415. that feel like magic and a site that is virtually unhackable.&lt;/p&gt;
  416. &lt;p&gt;&lt;strong&gt;What&amp;rsquo;s next?&lt;/strong&gt; Try converting one of your static components into a Hugo
  417. Shortcode today. You&amp;rsquo;ll be surprised at how much cleaner your Markdown files
  418. become.&lt;/p&gt;
  419. </content:encoded>
  420. <dc:creator>Val Paliy</dc:creator>
  421. </item>
  422. <item>
  423. <title>Best Static Site Generators Compared: Hugo, Jekyll, and Next.js</title>
  424. <link>https://valticus.pro/posts/best-static-site-generators-compared-hugo-jekyll-nextjs/</link>
  425. <pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate>
  426. <guid isPermaLink="true">https://valticus.pro/posts/best-static-site-generators-compared-hugo-jekyll-nextjs/</guid>
  427. <description>An in-depth comparison of three popular static site generators, evaluating performance, ease of use, flexibility, and ideal use cases for each tool.</description>
  428. <category>Web Development</category><content:encoded>&lt;h2 id="the-static-site-renaissance"&gt;The Static Site Renaissance&lt;/h2&gt;
  429. &lt;p&gt;In 2026, the &amp;ldquo;Static Site&amp;rdquo; label is almost a misnomer. What started as simple
  430. tools for generating HTML from Markdown has evolved into a sophisticated
  431. ecosystem known as the &lt;strong&gt;JAMstack&lt;/strong&gt; (JavaScript, APIs, and Markup). &lt;strong&gt;Static
  432. Site Generators (SSGs)&lt;/strong&gt; now power everything from massive documentation portals
  433. for companies like Google and Microsoft to high-performance e-commerce
  434. frontends.&lt;/p&gt;
  435. &lt;p&gt;The choice of an SSG is no longer just about which language you prefer; it’s
  436. about where your project sits on the &lt;strong&gt;Content vs. Application spectrum&lt;/strong&gt;. Are
  437. you building a content-heavy blog, or a dynamic web app that happens to have
  438. some static pages? Let&amp;rsquo;s dive into the three heavyweights of the industry.&lt;/p&gt;
  439. &lt;figure&gt;
  440. &lt;div class="progressive-image"&gt;
  441. &lt;img class="progressive-image__img"
  442. src="https://valticus.pro/images/best-static-site-generators-compared-hugo-jekyll-nextjs_hu_72eb343bad86a3d7.webp"
  443. alt="Best Static Site Generators Compared: Hugo, Jekyll, and Next.js."
  444. width="800"
  445. height="436"&gt;
  446. &lt;/div&gt;
  447. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Best Static Site Generators Compared: Hugo, Jekyll, and Next.js.&lt;/p&gt;&lt;/figcaption&gt;
  448. &lt;/figure&gt;
  449. &lt;h2 id="hugo-the-speed-demon"&gt;Hugo: The Speed Demon&lt;/h2&gt;
  450. &lt;p&gt;&lt;strong&gt;Hugo&lt;/strong&gt; is often called the &amp;ldquo;world&amp;rsquo;s fastest framework for building websites.&amp;rdquo;
  451. Written in &lt;strong&gt;Go&lt;/strong&gt;, it is a single binary that delivers on its promise of
  452. near-instantaneous builds.&lt;/p&gt;
  453. &lt;h3 id="why-it-wins"&gt;Why It Wins&lt;/h3&gt;
  454. &lt;p&gt;For large-scale sites, Hugo is the undisputed king. If you have 5,000 pages of
  455. documentation, Jekyll might take 10 minutes to build, while Hugo will finish in
  456. under two seconds. This feedback loop is addictive for developers.&lt;/p&gt;
  457. &lt;p&gt;&lt;strong&gt;Pro Tip: Hugo Pipes&lt;/strong&gt; One of Hugo&amp;rsquo;s most underrated features is &lt;strong&gt;Hugo
  458. Pipes&lt;/strong&gt;. It handles &lt;strong&gt;Sass compilation&lt;/strong&gt;, &lt;strong&gt;JS bundling&lt;/strong&gt; (via &lt;strong&gt;ESBuild&lt;/strong&gt;), and
  459. &lt;strong&gt;image processing&lt;/strong&gt; (resizing, &lt;strong&gt;WebP conversion&lt;/strong&gt;) natively. You don&amp;rsquo;t need
  460. Webpack or Gulp; Hugo does it all in-memory during the build.&lt;/p&gt;
  461. &lt;h3 id="the-trade-off"&gt;The Trade-off&lt;/h3&gt;
  462. &lt;p&gt;The learning curve for &lt;strong&gt;Go Templating&lt;/strong&gt; can be steep. Unlike JSX or Liquid, Go
  463. templates use a dot-notation context (&lt;code&gt;{{ .Title }}&lt;/code&gt;) that can be confusing for
  464. beginners.&lt;/p&gt;
  465. &lt;p&gt;&lt;strong&gt;Code Snippet: Listing Posts in Hugo&lt;/strong&gt;&lt;/p&gt;
  466. &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;{{ range .Pages }}
  467. &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;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  468. &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;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;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="p"&gt;&amp;gt;&lt;/span&gt;{{ .Title }}&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;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  469. &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;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;{{ .Date.Format &amp;#34;Jan 2, 2006&amp;#34; }}&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  470. &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;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  471. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
  472. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="jekyll-the-simple-classic"&gt;Jekyll: The Simple Classic&lt;/h2&gt;
  473. &lt;p&gt;&lt;strong&gt;Jekyll&lt;/strong&gt; is the &amp;ldquo;grandparent&amp;rdquo; of the SSG world. It’s written in &lt;strong&gt;Ruby&lt;/strong&gt; and
  474. gained massive popularity as the engine behind &lt;strong&gt;GitHub Pages&lt;/strong&gt;.&lt;/p&gt;
  475. &lt;h3 id="why-it-wins-1"&gt;Why It Wins&lt;/h3&gt;
  476. &lt;p&gt;Jekyll’s greatest strength is its ubiquity and simplicity. The &lt;strong&gt;Liquid
  477. templating engine&lt;/strong&gt; is incredibly intuitive — if you can write HTML, you can
  478. write Liquid. Because it&amp;rsquo;s natively supported by GitHub, you can host a Jekyll
  479. site for free without even setting up a &lt;strong&gt;CI/CD pipeline&lt;/strong&gt;.&lt;/p&gt;
  480. &lt;h3 id="the-ruby-problem"&gt;The &amp;ldquo;Ruby&amp;rdquo; Problem&lt;/h3&gt;
  481. &lt;p&gt;Jekyll&amp;rsquo;s biggest weakness is its dependency on the Ruby ecosystem. If you&amp;rsquo;ve
  482. ever spent three hours trying to fix a &lt;code&gt;gem install&lt;/code&gt; error or a &lt;code&gt;bundle exec&lt;/code&gt;
  483. conflict, you know the pain. For many modern developers, managing a Ruby
  484. environment just to build a blog feels like overkill.&lt;/p&gt;
  485. &lt;p&gt;&lt;strong&gt;Common Pitfall: The &amp;ldquo;Dependency Hell&amp;rdquo;&lt;/strong&gt; Always use a &lt;code&gt;Gemfile&lt;/code&gt; and
  486. &lt;code&gt;bundle install&lt;/code&gt; to lock your versions. Never rely on the system-wide Ruby gems,
  487. or your build will inevitably break when you switch machines or update your OS.&lt;/p&gt;
  488. &lt;h2 id="nextjs-static-export-the-hybrid"&gt;Next.js (Static Export): The Hybrid&lt;/h2&gt;
  489. &lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; is primarily a &lt;strong&gt;React framework&lt;/strong&gt;, but its &lt;code&gt;output: 'export'&lt;/code&gt; mode
  490. allows it to function as a powerful SSG.&lt;/p&gt;
  491. &lt;h3 id="why-it-wins-2"&gt;Why It Wins&lt;/h3&gt;
  492. &lt;p&gt;If you are building a site that needs complex state management, interactive
  493. dashboards, or a &amp;ldquo;pure&amp;rdquo; React ecosystem, Next.js is the choice. You get the full
  494. power of React hooks, components, and libraries. It also offers &lt;strong&gt;ISR
  495. (Incremental Static Regeneration)&lt;/strong&gt;, which allows you to update static content
  496. after you&amp;rsquo;ve deployed, without a full rebuild.&lt;/p&gt;
  497. &lt;h3 id="the-overhead-problem"&gt;The &amp;ldquo;Overhead&amp;rdquo; Problem&lt;/h3&gt;
  498. &lt;p&gt;Next.js sites are &amp;ldquo;heavier&amp;rdquo; by default. Even a simple static page will ship a
  499. few hundred KB of JavaScript to &amp;ldquo;hydrate&amp;rdquo; the React application. For a simple
  500. blog, this is often unnecessary and can hurt your &lt;strong&gt;Core Web Vitals&lt;/strong&gt;.&lt;/p&gt;
  501. &lt;p&gt;&lt;strong&gt;Code Snippet: Listing Posts in Next.js&lt;/strong&gt;&lt;/p&gt;
  502. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsx" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  503. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  504. &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;
  505. &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="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&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;
  506. &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;article&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;&lt;/span&gt;
  507. &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;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  508. &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;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sb"&gt;`/posts/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&amp;gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  509. &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;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  510. &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;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;()}&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  511. &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;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  512. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;))}&lt;/span&gt;
  513. &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;
  514. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
  515. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  516. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="technical-comparison-matrix"&gt;Technical Comparison Matrix&lt;/h2&gt;
  517. &lt;div class="table-wrapper"&gt;
  518. &lt;table&gt;
  519. &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Hugo&lt;/th&gt;&lt;th&gt;Jekyll&lt;/th&gt;&lt;th&gt;Next.js (Static)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
  520. &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Primary Language&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Go&lt;/td&gt;&lt;td&gt;Ruby&lt;/td&gt;&lt;td&gt;JavaScript (React)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Templating&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Go Templates&lt;/td&gt;&lt;td&gt;Liquid&lt;/td&gt;&lt;td&gt;JSX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Build Speed (1k pages)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;~1s&lt;/td&gt;&lt;td&gt;~300s&lt;/td&gt;&lt;td&gt;~45s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Asset Pipeline&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Built-in (Pipes)&lt;/td&gt;&lt;td&gt;Plugins (Jekyll Assets)&lt;/td&gt;&lt;td&gt;External (Webpack/Turbopack)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Client-Side JS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Zero (Optional)&lt;/td&gt;&lt;td&gt;Zero (Optional)&lt;/td&gt;&lt;td&gt;Required (Hydration)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Data Sources&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Markdown, JSON, YAML&lt;/td&gt;&lt;td&gt;Markdown, YAML&lt;/td&gt;&lt;td&gt;APIs, Markdown, CMS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;
  521. &lt;/table&gt;
  522. &lt;/div&gt;
  523. &lt;h2 id="the-wildcard-why-im-watching-astro"&gt;The Wildcard: Why I&amp;rsquo;m Watching Astro&lt;/h2&gt;
  524. &lt;p&gt;I would be remiss if I didn&amp;rsquo;t mention &lt;strong&gt;Astro&lt;/strong&gt;. In 2026, Astro has become the
  525. &amp;ldquo;sweet spot&amp;rdquo; for many. It uses an &lt;strong&gt;Islands Architecture&lt;/strong&gt;, which allows you to
  526. use React/Vue/Svelte components but renders them to static HTML at build time,
  527. stripping away the JS unless it&amp;rsquo;s needed for interactivity. If you&amp;rsquo;re struggling
  528. to choose between Hugo&amp;rsquo;s speed and Next.js&amp;rsquo;s component model, Astro is likely
  529. your answer.&lt;/p&gt;
  530. &lt;h2 id="deployment-and-cicd"&gt;Deployment and CI/CD&lt;/h2&gt;
  531. &lt;p&gt;Regardless of the tool, the deployment strategy for static sites has converged.&lt;/p&gt;
  532. &lt;ol&gt;
  533. &lt;li&gt;&lt;strong&gt;Netlify&lt;/strong&gt;/&lt;strong&gt;Vercel&lt;/strong&gt;: The gold standard. Git-based deployments, global CDN,
  534. and automatic SSL.&lt;/li&gt;
  535. &lt;li&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;: Faster edge network and excellent free tier.&lt;/li&gt;
  536. &lt;li&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt;: Best for Jekyll or simple documentation.&lt;/li&gt;
  537. &lt;/ol&gt;
  538. &lt;p&gt;For a deeper look at how to deploy these efficiently, see my guide on How to
  539. Deploy on Netlify.&lt;/p&gt;
  540. &lt;h2 id="security-the-unfair-advantage"&gt;Security: The Unfair Advantage&lt;/h2&gt;
  541. &lt;p&gt;The primary reason I advocate for SSGs over WordPress or other database-driven
  542. CMSs is security.&lt;/p&gt;
  543. &lt;ul&gt;
  544. &lt;li&gt;&lt;strong&gt;No Database&lt;/strong&gt;: No &lt;strong&gt;SQL injection attacks&lt;/strong&gt;.&lt;/li&gt;
  545. &lt;li&gt;&lt;strong&gt;No Server-Side Runtime&lt;/strong&gt;: No PHP or Node.js vulnerabilities on the live
  546. server.&lt;/li&gt;
  547. &lt;li&gt;&lt;strong&gt;Read-Only&lt;/strong&gt;: The server is just serving flat files. There is nothing to
  548. &amp;ldquo;hack.&amp;rdquo;&lt;/li&gt;
  549. &lt;/ul&gt;
  550. &lt;h2 id="conclusion-which-one-should-you-choose"&gt;Conclusion: Which One Should You Choose?&lt;/h2&gt;
  551. &lt;p&gt;The &amp;ldquo;best&amp;rdquo; static site generator is the one that aligns with your project goals:&lt;/p&gt;
  552. &lt;ul&gt;
  553. &lt;li&gt;&lt;strong&gt;Choose Hugo&lt;/strong&gt; if you are a content-first developer who values speed and
  554. simplicity. It’s what I used for this site, and you can see the results in my
  555. Introducing Olivero Hugo Theme showcase.&lt;/li&gt;
  556. &lt;li&gt;&lt;strong&gt;Choose Jekyll&lt;/strong&gt; if you want the path of least resistance for a small
  557. GitHub-hosted project and love the Ruby/Liquid syntax.&lt;/li&gt;
  558. &lt;li&gt;&lt;strong&gt;Choose Next.js&lt;/strong&gt; if you are building a complex web application where the
  559. content is just one part of the interactive experience.&lt;/li&gt;
  560. &lt;/ul&gt;
  561. &lt;p&gt;If you&amp;rsquo;re feeling adventurous and want to build a high-performance site without
  562. the weight of React, stay tuned for my upcoming tutorial on building a
  563. minimalist portfolio.&lt;/p&gt;
  564. &lt;p&gt;The web is moving toward &amp;ldquo;Static First.&amp;rdquo; Whatever tool you choose, you&amp;rsquo;re making
  565. the right architectural decision for performance, security, and scalability.&lt;/p&gt;
  566. </content:encoded>
  567. <dc:creator>Val Paliy</dc:creator>
  568. </item>
  569. <item>
  570. <title>Learn Hugo With Build Websites With Hugo</title>
  571. <link>https://valticus.pro/posts/learn-hugo-with-build-websites-with-hugo/</link>
  572. <pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate>
  573. <guid isPermaLink="true">https://valticus.pro/posts/learn-hugo-with-build-websites-with-hugo/</guid>
  574. <description>A practical review of Build Websites With Hugo by Brian P. Hogan. See how this concise book teaches Hugo through real project-based learning.</description>
  575. <category>Web Development</category>
  576. <category>Technology</category><content:encoded>&lt;p&gt;I have been building sites with Hugo for years. I wrote my own theme, tuned my
  577. build pipeline, and deployed more static sites than I can count. But I rarely
  578. see a resource that captures the &lt;em&gt;why&lt;/em&gt; behind Hugo as well as the &lt;em&gt;how&lt;/em&gt;. Brian
  579. P. Hogan&amp;rsquo;s &lt;strong&gt;Build Websites With Hugo&lt;/strong&gt; does exactly that.&lt;/p&gt;
  580. &lt;p&gt;Published by Pragmatic Bookshelf in 2020, this 154-page book is not a reference
  581. manual. It is a guided tour through building a real portfolio site from scratch.
  582. You install Hugo, create a theme, add projects and a blog, wire up data sources,
  583. and deploy the final result — all while learning Hugo&amp;rsquo;s mental model.&lt;/p&gt;
  584. &lt;figure&gt;
  585. &lt;div class="progressive-image"&gt;
  586. &lt;img class="progressive-image__img"
  587. src="https://valticus.pro/images/learn-hugo-with-build-websites-with-hugo_hu_59396f202ad04ddf.webp"
  588. alt="Build Websites With Hugo by Brian P. Hogan book cover."
  589. width="800"
  590. height="436"&gt;
  591. &lt;/div&gt;
  592. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Build Websites With Hugo by Brian P. Hogan.&lt;/p&gt;&lt;/figcaption&gt;
  593. &lt;/figure&gt;
  594. &lt;h2 id="what-makes-this-book-different"&gt;What Makes This Book Different&lt;/h2&gt;
  595. &lt;p&gt;Most Hugo tutorials throw config snippets at you and call it a day. Hogan takes
  596. the opposite approach. Every chapter builds on the last. You start with a blank
  597. directory, run &lt;code&gt;hugo new site&lt;/code&gt;, and by the end you have a live site with a blog,
  598. RSS feed, JSON endpoint, search, and a deployment pipeline.&lt;/p&gt;
  599. &lt;p&gt;The book is split into eight chapters plus an appendix on migration:&lt;/p&gt;
  600. &lt;ol&gt;
  601. &lt;li&gt;&lt;strong&gt;Kicking the Tires&lt;/strong&gt; — Installing Hugo, scaffolding a site, creating content
  602. with archetypes, and understanding the output structure.&lt;/li&gt;
  603. &lt;li&gt;&lt;strong&gt;Building a Basic Theme&lt;/strong&gt; — Generating a theme, using &lt;code&gt;baseof.html&lt;/code&gt; and
  604. partials, and styling with CSS. This chapter alone is worth the price.&lt;/li&gt;
  605. &lt;li&gt;&lt;strong&gt;Adding Content Sections&lt;/strong&gt; — Creating a projects section with custom
  606. archetypes, list layouts, and section-specific templates.&lt;/li&gt;
  607. &lt;li&gt;&lt;strong&gt;Working with Data&lt;/strong&gt; — Pulling data from front matter, local files, and
  608. remote JSON sources. Rendering RSS and custom JSON output.&lt;/li&gt;
  609. &lt;li&gt;&lt;strong&gt;Adding a Blog&lt;/strong&gt; — Taxonomies, pagination, Disqus comments, and related
  610. content. Everything you need for a production blog.&lt;/li&gt;
  611. &lt;li&gt;&lt;strong&gt;Adding Search to Your Site&lt;/strong&gt; — Building a client-side search index using
  612. Hugo&amp;rsquo;s JSON output and wiring it up with JavaScript.&lt;/li&gt;
  613. &lt;li&gt;&lt;strong&gt;Managing Assets with Pipes&lt;/strong&gt; — Hugo Pipes for CSS/JS bundling, image
  614. processing, and integrating Webpack and npm.&lt;/li&gt;
  615. &lt;li&gt;&lt;strong&gt;Deploying&lt;/strong&gt; — Netlify, cloud storage (S3), and traditional web servers.&lt;/li&gt;
  616. &lt;/ol&gt;
  617. &lt;p&gt;The structure mirrors how you would actually build a site. You never learn a
  618. feature in isolation — you learn it because your site needs it.&lt;/p&gt;
  619. &lt;h2 id="the-theme-chapter-is-the-highlight"&gt;The Theme Chapter Is the Highlight&lt;/h2&gt;
  620. &lt;p&gt;Chapter 2 alone justifies the book. Hogan walks through creating a theme by hand
  621. — no cloning someone else&amp;rsquo;s repo, no fighting with a pre-built monster. You
  622. create &lt;code&gt;layouts/_default/baseof.html&lt;/code&gt;, extract partials for &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;header&lt;/code&gt;,
  623. and &lt;code&gt;footer&lt;/code&gt;, and see exactly how Hugo assembles pages.&lt;/p&gt;
  624. &lt;p&gt;This is the chapter that made Hugo click for me when I first started. The
  625. baseof/block/partial model is Hugo&amp;rsquo;s superpower, but most tutorials gloss over
  626. it. Hogan lingers on it, and it pays off for every chapter that follows.&lt;/p&gt;
  627. &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;{{- partial &amp;#34;head.html&amp;#34; . -}} {{- partial &amp;#34;header.html&amp;#34; . -}} {{- block &amp;#34;main&amp;#34; .
  628. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}}{{ end }} {{- partial &amp;#34;footer.html&amp;#34; . -}}
  629. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Four lines that define the architecture of an entire site.&lt;/p&gt;
  630. &lt;h2 id="data-driven-content-without-the-backend"&gt;Data-Driven Content Without the Backend&lt;/h2&gt;
  631. &lt;p&gt;Chapter 4 is where the book punches above its weight. Hogan shows how to pull
  632. data from:&lt;/p&gt;
  633. &lt;ul&gt;
  634. &lt;li&gt;&lt;strong&gt;Front matter&lt;/strong&gt; — per-page metadata rendered in templates&lt;/li&gt;
  635. &lt;li&gt;&lt;strong&gt;Site config&lt;/strong&gt; — global params accessed via &lt;code&gt;.Site.Params&lt;/code&gt;&lt;/li&gt;
  636. &lt;li&gt;&lt;strong&gt;Local data files&lt;/strong&gt; — YAML/TOML/JSON in the &lt;code&gt;data/&lt;/code&gt; directory&lt;/li&gt;
  637. &lt;li&gt;&lt;strong&gt;Remote APIs&lt;/strong&gt; — fetching JSON at build time with &lt;code&gt;getJSON&lt;/code&gt;&lt;/li&gt;
  638. &lt;/ul&gt;
  639. &lt;p&gt;Then he flips it around and renders your content &lt;em&gt;as&lt;/em&gt; JSON, creating an API from
  640. your static site. This is the pattern I use for this blog&amp;rsquo;s search index, and it
  641. is refreshing to see it explained so clearly.&lt;/p&gt;
  642. &lt;h2 id="who-should-read-this-book"&gt;Who Should Read This Book&lt;/h2&gt;
  643. &lt;p&gt;This book is for developers who know HTML and CSS and want to build content
  644. sites without the overhead of a database or JavaScript framework. You do not
  645. need to know Go (Hugo&amp;rsquo;s templating language is its own thing), but you should be
  646. comfortable with a terminal and a text editor.&lt;/p&gt;
  647. &lt;p&gt;If you are already a Hugo power user, you might find the first few chapters
  648. slow. But the later material — custom output formats, Hugo Pipes, Webpack
  649. integration, and the migration appendix — has enough depth to make it worth the
  650. read.&lt;/p&gt;
  651. &lt;h2 id="what-is-missing"&gt;What Is Missing&lt;/h2&gt;
  652. &lt;p&gt;The book was published in 2020, and Hugo has evolved since then. Hugo Modules
  653. (which replaced much of the theme copy-paste workflow) are not covered. The
  654. image processing chapter uses the older &lt;code&gt;.Resize&lt;/code&gt; and &lt;code&gt;.Fill&lt;/code&gt; methods rather
  655. than the newer &lt;code&gt;.Process&lt;/code&gt; filter pipeline. And the deployment chapter leans
  656. heavily on Netlify, which is fine, but other options like Cloudflare Pages or
  657. self-hosted servers get less attention.&lt;/p&gt;
  658. &lt;p&gt;These are minor issues. The core concepts — templates, partials, content
  659. sections, data, and deployment — are unchanged and form the foundation of every
  660. Hugo site built today.&lt;/p&gt;
  661. &lt;h2 id="final-verdict"&gt;Final Verdict&lt;/h2&gt;
  662. &lt;p&gt;Build Websites With Hugo is the best introductory book on Hugo I have read. It
  663. is concise (154 pages), practical (you build a real site), and well-paced (each
  664. chapter is a natural next step). Hogan writes the way good technical authors do:
  665. he explains the concept, shows the code, and gets out of your way.&lt;/p&gt;
  666. &lt;p&gt;If you are learning Hugo, start here. Skip the YouTube marathon and the
  667. copy-pasted config gists. Spend a weekend with this book and build something you
  668. own.&lt;/p&gt;
  669. &lt;hr&gt;
  670. &lt;p&gt;&lt;em&gt;Build Websites With Hugo by Brian P. Hogan. Pragmatic Bookshelf, 2020. 154
  671. pages. ISBN 978-1-68050-726-3. Available at
  672. &lt;a href="https://pragprog.com/titles/bhhugo/build-websites-with-hugo/"&gt;pragprog.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  673. </content:encoded>
  674. <dc:creator>Val Paliy</dc:creator>
  675. </item>
  676. <item>
  677. <title>Hodo-Hodo: The Japanese Philosophy That Could Fix Web Design</title>
  678. <link>https://valticus.pro/posts/hodo-hodo-the-japanese-philosophy-that-could-fix-web-design/</link>
  679. <pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate>
  680. <guid isPermaLink="true">https://valticus.pro/posts/hodo-hodo-the-japanese-philosophy-that-could-fix-web-design/</guid>
  681. <description>How the ancient Japanese concept of 'just enough' challenges modern web design excess — from bloated frameworks to infinite scroll — and offers a quieter, more human alternative.</description>
  682. <category>Web Development</category>
  683. <category>Design</category><content:encoded>&lt;h2 id="the-book-that-changed-how-i-see-websites"&gt;The Book That Changed How I See Websites&lt;/h2&gt;
  684. &lt;p&gt;I have recently read &lt;em&gt;Just Enough Design&lt;/em&gt; by Taku Satoh, a slim but powerful
  685. book published by Chronicle Books. Satoh is one of Japan&amp;rsquo;s most respected living
  686. designers — he has shaped everything from packaging for major brands to museum
  687. exhibits — and in this book he distills decades of work into a single idea:
  688. &lt;strong&gt;hodo-hodo&lt;/strong&gt; (ほどほど).&lt;/p&gt;
  689. &lt;p&gt;The word is ancient Japanese. It means &amp;ldquo;just enough,&amp;rdquo; &amp;ldquo;moderation,&amp;rdquo; or &amp;ldquo;the
  690. right amount.&amp;rdquo; When Satoh applies it to his work, it becomes a design
  691. philosophy: deliberately holding back, leaving room for the person on the other
  692. side to engage with an object according to their own sensibility.&lt;/p&gt;
  693. &lt;figure&gt;
  694. &lt;div class="progressive-image"&gt;
  695. &lt;img class="progressive-image__img"
  696. src="https://valticus.pro/images/hodo-hodo-the-japanese-philosophy-that-could-fix-web-design_hu_f68595844c37b46e.webp"
  697. alt="Hodo-Hodo: The Japanese Philosophy That Could Fix Web Design."
  698. width="800"
  699. height="436"&gt;
  700. &lt;/div&gt;
  701. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Hodo-Hodo: The Japanese Philosophy That Could Fix Web Design.&lt;/p&gt;&lt;/figcaption&gt;
  702. &lt;/figure&gt;
  703. &lt;p&gt;Reading it, I kept thinking about the web. Not abstractly — I kept thinking
  704. about specific buttons, specific modals, specific JavaScript bundles that I
  705. encounter every day. Hodo-hodo is not minimalism for its own sake. It is
  706. &lt;strong&gt;restraint as respect&lt;/strong&gt;. And the modern web has almost none of it.&lt;/p&gt;
  707. &lt;h2 id="what-hodo-hodo-actually-means"&gt;What Hodo-Hodo Actually Means&lt;/h2&gt;
  708. &lt;p&gt;Satoh does not advocate for austerity. He is not telling designers to strip
  709. everything away until only a single black link on a white background remains.
  710. That is a Western misreading of Japanese simplicity.&lt;/p&gt;
  711. &lt;p&gt;Hodo-hodo means that a design should provide &lt;strong&gt;exactly what is needed&lt;/strong&gt; and no
  712. more. Not less — not a stripped-down, frustrating experience — but not more,
  713. either. The extra is not just unnecessary; it is disrespectful. It assumes the
  714. user cannot figure things out on their own. It assumes they need to be managed,
  715. guided, nudged, and entertained at every step.&lt;/p&gt;
  716. &lt;p&gt;The concept connects to other Japanese aesthetic ideas: &lt;strong&gt;ma&lt;/strong&gt; (the meaningful
  717. use of negative space), &lt;strong&gt;wabi-sabi&lt;/strong&gt; (beauty in imperfection), and &lt;strong&gt;shibui&lt;/strong&gt;
  718. (unobtrusive beauty). But hodo-hodo is specifically about &lt;strong&gt;restraint in service
  719. of the other person&lt;/strong&gt;. It is design that says: I trust you.&lt;/p&gt;
  720. &lt;h2 id="the-webs-abundance-problem"&gt;The Web&amp;rsquo;s Abundance Problem&lt;/h2&gt;
  721. &lt;p&gt;Modern web design has an abundance problem. Not an abundance of content — an
  722. abundance of &lt;strong&gt;stuff that does not need to be there&lt;/strong&gt;.&lt;/p&gt;
  723. &lt;p&gt;Consider what a visitor encounters on a typical website in 2026:&lt;/p&gt;
  724. &lt;ul&gt;
  725. &lt;li&gt;A &lt;strong&gt;cookie consent banner&lt;/strong&gt; (even on sites that use no tracking)&lt;/li&gt;
  726. &lt;li&gt;A &lt;strong&gt;newsletter popup&lt;/strong&gt; after 30 seconds&lt;/li&gt;
  727. &lt;li&gt;A &lt;strong&gt;notification permission prompt&lt;/strong&gt; from the browser&lt;/li&gt;
  728. &lt;li&gt;An &lt;strong&gt;install app&lt;/strong&gt; banner&lt;/li&gt;
  729. &lt;li&gt;A &lt;strong&gt;&amp;ldquo;Sign up for free&amp;rdquo;&lt;/strong&gt; modal with an X that is intentionally hard to find&lt;/li&gt;
  730. &lt;li&gt;A &lt;strong&gt;chat widget&lt;/strong&gt; that slides in from the corner&lt;/li&gt;
  731. &lt;li&gt;An &lt;strong&gt;accessibility overlay&lt;/strong&gt; that actually makes the site less accessible&lt;/li&gt;
  732. &lt;li&gt;A &lt;strong&gt;&amp;ldquo;Back to top&amp;rdquo;&lt;/strong&gt; button that appears before you have scrolled past the
  733. first paragraph&lt;/li&gt;
  734. &lt;/ul&gt;
  735. &lt;p&gt;None of these exist because the designer thought: &amp;ldquo;This will make the user&amp;rsquo;s
  736. experience better.&amp;rdquo; They exist because someone decided the user needed to be
  737. &lt;strong&gt;captured&lt;/strong&gt;, &lt;strong&gt;converted&lt;/strong&gt;, or &lt;strong&gt;retained&lt;/strong&gt;. The user&amp;rsquo;s actual task — reading
  738. an article, finding a phone number, understanding a product — is secondary to
  739. the business goal of keeping them engaged.&lt;/p&gt;
  740. &lt;p&gt;This is the opposite of hodo-hodo. It is &lt;strong&gt;more-more&lt;/strong&gt; design. More features,
  741. more prompts, more distractions, more &amp;ldquo;value-adds&amp;rdquo; that add nothing of value.&lt;/p&gt;
  742. &lt;h2 id="the-framework-trap"&gt;The Framework Trap&lt;/h2&gt;
  743. &lt;p&gt;The abundance problem is not limited to marketing patterns. It is baked into the
  744. tools themselves.&lt;/p&gt;
  745. &lt;p&gt;When a developer starts a new project in 2026, the default is to reach for a
  746. framework. Need a personal site? Next.js. A blog? Astro or Gatsby. A landing
  747. page? Probably still React, because that is what the developer knows.&lt;/p&gt;
  748. &lt;p&gt;Each of these frameworks ships with a runtime. Hydration logic. State management
  749. conventions. Build tooling. Configuration files. The developer spends hours
  750. setting up the machinery before writing a single line of meaningful content.&lt;/p&gt;
  751. &lt;p&gt;Satoh would call this &lt;strong&gt;design that serves the designer, not the user&lt;/strong&gt;. The
  752. framework makes the developer&amp;rsquo;s life easier (or more familiar), but the user
  753. receives a page that is heavier, slower, and more complex than it needs to be. A
  754. blog post does not need a JavaScript runtime. A contact form does not need a
  755. virtual DOM. A portfolio does not need server-side rendering.&lt;/p&gt;
  756. &lt;p&gt;The hodo-hodo approach would be to ask: &lt;strong&gt;What is the minimum technology that
  757. serves this content well?&lt;/strong&gt; For most websites, the answer is HTML, a small
  758. amount of CSS, and vanilla JavaScript for the few interactions that genuinely
  759. require it. Everything else is excess.&lt;/p&gt;
  760. &lt;h2 id="what-hodo-hodo-looks-like-on-the-web"&gt;What Hodo-Hodo Looks Like on the Web&lt;/h2&gt;
  761. &lt;p&gt;It is easier to describe what hodo-hodo is not than what it is. So let me try to
  762. describe what it looks like when a website gets it right.&lt;/p&gt;
  763. &lt;h3 id="system-fonts-not-font-cdns"&gt;System Fonts, Not Font CDNs&lt;/h3&gt;
  764. &lt;p&gt;A hodo-hodo site uses the system font stack. Not because custom fonts are wrong,
  765. but because loading a 400KB font file to render a heading in a slightly
  766. different serif is a trade-off that rarely benefits the user. The system font is
  767. instant. It is already there. It respects the user&amp;rsquo;s existing environment.&lt;/p&gt;
  768. &lt;p&gt;If a custom font is genuinely necessary for the brand — a newspaper, a design
  769. studio — it should be subset, self-hosted, and loaded with a proper
  770. &lt;code&gt;font-display&lt;/code&gt; strategy. Not shoved through a Google Fonts CDN with seven
  771. weights and three styles.&lt;/p&gt;
  772. &lt;h3 id="dark-mode-as-a-quiet-option"&gt;Dark Mode as a Quiet Option&lt;/h3&gt;
  773. &lt;p&gt;A hodo-hodo dark mode toggle does not announce itself. It does not slide in from
  774. the side with an animation. It sits in the header, a small button that respects
  775. the user&amp;rsquo;s system preference by default and allows manual override when
  776. requested. The transition is immediate — no flashing, no animation, no drama.&lt;/p&gt;
  777. &lt;h3 id="content-that-breathes"&gt;Content That Breathes&lt;/h3&gt;
  778. &lt;p&gt;Whitespace is not wasted space. A hodo-hodo layout gives content room. The line
  779. length stays between 60 and 80 characters. Paragraphs are separated by generous
  780. margins. Headings have breathing room above and below. The page does not feel
  781. crowded, even when it is dense with information.&lt;/p&gt;
  782. &lt;p&gt;This is &lt;strong&gt;ma&lt;/strong&gt; — the Japanese concept of negative space as a design element
  783. itself. The space between things is not absence; it is presence. It is what
  784. allows the content to be read, understood, and remembered.&lt;/p&gt;
  785. &lt;h3 id="interactions-that-disappear"&gt;Interactions That Disappear&lt;/h3&gt;
  786. &lt;p&gt;A hodo-hodo interaction is one you do not notice. The copy button on a code
  787. block appears on hover and disappears after use. The search bar opens with a
  788. keyboard shortcut and closes with Escape. The mobile menu toggles without
  789. animation, without a backdrop overlay that dims the entire page.&lt;/p&gt;
  790. &lt;p&gt;The goal is not &amp;ldquo;no interaction.&amp;rdquo; It is &lt;strong&gt;interaction that does not call
  791. attention to itself&lt;/strong&gt;. The user performs a task and moves on. They do not admire
  792. the animation. They do not think about the UI. They think about what they came
  793. to do.&lt;/p&gt;
  794. &lt;h3 id="no-dark-patterns"&gt;No Dark Patterns&lt;/h3&gt;
  795. &lt;p&gt;A hodo-hodo site does not trick the user. The &amp;ldquo;unsubscribe&amp;rdquo; link is as prominent
  796. as the &amp;ldquo;subscribe&amp;rdquo; link. The close button on a modal is in the expected location
  797. and is the expected size. The privacy policy is written in plain language, not
  798. in legal jargon designed to obscure.&lt;/p&gt;
  799. &lt;p&gt;Satoh&amp;rsquo;s point is that restraint is a form of respect. When you manipulate the
  800. user — when you make the &amp;ldquo;No thanks&amp;rdquo; button gray and small while the &amp;ldquo;Sign up&amp;rdquo;
  801. button is blue and large — you are telling the user that you do not trust them
  802. to make the right choice. You are designing for yourself, not for them.&lt;/p&gt;
  803. &lt;h2 id="the-paradox-of-the-hodo-hodo-website"&gt;The Paradox of the Hodo-Hodo Website&lt;/h2&gt;
  804. &lt;p&gt;Here is the uncomfortable truth: achieving hodo-hodo on the web often requires
  805. &lt;strong&gt;more&lt;/strong&gt; engineering, not less.&lt;/p&gt;
  806. &lt;p&gt;A clean, fast, accessible website is harder to build than a bloated one. It is
  807. easier to add a React dependency than to write semantic HTML. It is easier to
  808. install a cookie consent library than to ensure your analytics respects privacy
  809. by design. It is easier to add a chat widget than to write a clear, findable
  810. contact page.&lt;/p&gt;
  811. &lt;p&gt;The simplicity the user sees is the result of disciplined engineering behind the
  812. scenes. This is exactly Satoh&amp;rsquo;s point. Hodo-hodo is not laziness. It is not
  813. cutting corners. It is &lt;strong&gt;knowing where to stop&lt;/strong&gt; — and that requires a depth of
  814. understanding that casual excess does not.&lt;/p&gt;
  815. &lt;p&gt;A developer who adds seven npm dependencies to build a button has not thought
  816. enough about the button. A designer who adds a particle animation background has
  817. not thought enough about what the page is for. Hodo-hodo demands that you think
  818. &lt;strong&gt;before&lt;/strong&gt; you build, not after.&lt;/p&gt;
  819. &lt;h2 id="a-practical-checklist"&gt;A Practical Checklist&lt;/h2&gt;
  820. &lt;p&gt;You do not need to adopt a Japanese philosophy to build a better website. But if
  821. hodo-hodo resonates, here are some concrete questions to ask before shipping
  822. your next project:&lt;/p&gt;
  823. &lt;ol&gt;
  824. &lt;li&gt;
  825. &lt;p&gt;&lt;strong&gt;Does this feature serve the user or the business?&lt;/strong&gt; If it serves the
  826. business at the user&amp;rsquo;s expense, remove it.&lt;/p&gt;
  827. &lt;/li&gt;
  828. &lt;li&gt;
  829. &lt;p&gt;&lt;strong&gt;Can this be done without JavaScript?&lt;/strong&gt; If the interaction works without JS,
  830. do not add JS. If JS is necessary, use the smallest possible amount.&lt;/p&gt;
  831. &lt;/li&gt;
  832. &lt;li&gt;
  833. &lt;p&gt;&lt;strong&gt;Is this the right amount?&lt;/strong&gt; Not &amp;ldquo;can we add more?&amp;rdquo; but &amp;ldquo;is this enough?&amp;rdquo;
  834. The answer is usually yes.&lt;/p&gt;
  835. &lt;/li&gt;
  836. &lt;li&gt;
  837. &lt;p&gt;&lt;strong&gt;Does this respect the user&amp;rsquo;s attention?&lt;/strong&gt; Every element on the page
  838. competes for attention. Be deliberate about what you put in front of them.&lt;/p&gt;
  839. &lt;/li&gt;
  840. &lt;li&gt;
  841. &lt;p&gt;&lt;strong&gt;Would this make sense to someone who has never seen a website before?&lt;/strong&gt; If
  842. the design requires explanation, it is too clever.&lt;/p&gt;
  843. &lt;/li&gt;
  844. &lt;li&gt;
  845. &lt;p&gt;&lt;strong&gt;Can I remove this without the user noticing?&lt;/strong&gt; If yes, it should not be
  846. there.&lt;/p&gt;
  847. &lt;/li&gt;
  848. &lt;li&gt;
  849. &lt;p&gt;&lt;strong&gt;Am I designing for the user or for my portfolio?&lt;/strong&gt; Be honest.&lt;/p&gt;
  850. &lt;/li&gt;
  851. &lt;/ol&gt;
  852. &lt;h2 id="closing-thought"&gt;Closing Thought&lt;/h2&gt;
  853. &lt;p&gt;Satoh writes that hodo-hodo is not about achieving a specific aesthetic. It is
  854. not about making things look minimal. It is about a &lt;strong&gt;relationship&lt;/strong&gt; — between
  855. the designer and the user, between the object and the person who uses it.&lt;/p&gt;
  856. &lt;p&gt;The web has forgotten this. We design for metrics, for engagement, for
  857. conversion rates. We A/B test button colors and measure time-on-page and call it
  858. &amp;ldquo;user experience.&amp;rdquo; But the user did not come to have an experience. They came to
  859. read an article, or find a recipe, or check a bus schedule. Everything we add
  860. between them and their task is a failure of hodo-hodo.&lt;/p&gt;
  861. &lt;p&gt;The quietest website is not always the best website. But the website that
  862. provides &lt;strong&gt;exactly what the user needs&lt;/strong&gt; — and nothing more — is the one they
  863. will trust. And trust, in the end, is worth more than any conversion rate.&lt;/p&gt;
  864. &lt;p&gt;I will leave you with Satoh&amp;rsquo;s simplest insight, translated from the Japanese:
  865. &lt;strong&gt;&amp;ldquo;Just enough is not less. It is precisely enough.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
  866. </content:encoded>
  867. <dc:creator>Val Paliy</dc:creator>
  868. </item>
  869. <item>
  870. <title>What I'd Learn If Starting Today: A No-Nonsense Dev Career Roadmap</title>
  871. <link>https://valticus.pro/posts/what-id-learn-if-starting-today-dev-career-advice/</link>
  872. <pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate>
  873. <guid isPermaLink="true">https://valticus.pro/posts/what-id-learn-if-starting-today-dev-career-advice/</guid>
  874. <description>A comprehensive guide on how to start a career in web development in 2026, focusing on fundamentals, the right stack, and avoiding the 'framework trap' based on 20+ years of experience.</description>
  875. <category>Career</category><content:encoded>&lt;h2 id="the-hindsight-of-two-decades"&gt;The Hindsight of Two Decades&lt;/h2&gt;
  876. &lt;p&gt;Twenty years in web development. Hundreds of projects. Dozens of technologies
  877. learned, mastered, and eventually discarded. If I could step into a time machine
  878. and talk to my younger self on day one, my advice wouldn&amp;rsquo;t be about the latest
  879. &amp;ldquo;hot&amp;rdquo; framework or a specific library. It would be about &lt;strong&gt;compound interest in
  880. knowledge&lt;/strong&gt;.&lt;/p&gt;
  881. &lt;p&gt;The industry is noisier than ever. Every week, there&amp;rsquo;s a new &amp;ldquo;game-changing&amp;rdquo;
  882. tool that promises to make you 10x more productive. But here’s the cold truth:
  883. the most successful developers I know aren&amp;rsquo;t the ones who know the most
  884. frameworks; they are the ones who understand the &lt;strong&gt;fundamentals&lt;/strong&gt; so deeply that
  885. they can pick up any framework in a weekend.&lt;/p&gt;
  886. &lt;figure&gt;
  887. &lt;div class="progressive-image"&gt;
  888. &lt;img class="progressive-image__img"
  889. src="https://valticus.pro/images/what-id-learn-if-starting-today-dev-career-advice_hu_119a4b1857525206.webp"
  890. alt="What I&amp;#39;d Learn If Starting Today: A No-Nonsense Dev Career Roadmap."
  891. width="800"
  892. height="436"&gt;
  893. &lt;/div&gt;
  894. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;What I&amp;#39;d Learn If Starting Today: A No-Nonsense Dev Career Roadmap.&lt;/p&gt;&lt;/figcaption&gt;
  895. &lt;/figure&gt;
  896. &lt;p&gt;If I were starting today, this is exactly how I would navigate the path from
  897. absolute beginner to senior engineer.&lt;/p&gt;
  898. &lt;h2 id="phase-1-learn-the-platform-not-the-abstractions"&gt;Phase 1: Learn the Platform, Not the Abstractions&lt;/h2&gt;
  899. &lt;p&gt;The biggest mistake I see juniors make today is the &amp;ldquo;Framework Trap.&amp;rdquo; They learn
  900. &lt;strong&gt;React&lt;/strong&gt; before they understand &lt;strong&gt;JavaScript&lt;/strong&gt;. They learn &lt;strong&gt;Tailwind&lt;/strong&gt; before
  901. they understand &lt;strong&gt;CSS&lt;/strong&gt;. They learn &lt;strong&gt;Next.js&lt;/strong&gt; before they understand how a
  902. basic &lt;strong&gt;HTTP request&lt;/strong&gt; works.&lt;/p&gt;
  903. &lt;p&gt;When you learn an abstraction first, you are building your career on sand. When
  904. that framework inevitably falls out of favor, your skills go with it.&lt;/p&gt;
  905. &lt;h3 id="the-fundamental-learning-stack"&gt;The Fundamental Learning Stack&lt;/h3&gt;
  906. &lt;p&gt;Before you even think about installing a package manager, you must master these
  907. five pillars:&lt;/p&gt;
  908. &lt;ol&gt;
  909. &lt;li&gt;&lt;strong&gt;Semantic HTML&lt;/strong&gt;: Understand the &lt;strong&gt;document object model (DOM)&lt;/strong&gt;,
  910. &lt;strong&gt;accessibility&lt;/strong&gt; (ARIA roles), and why using a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; is better than a
  911. &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with an &lt;code&gt;onclick&lt;/code&gt; handler.&lt;/li&gt;
  912. &lt;li&gt;&lt;strong&gt;Modern CSS&lt;/strong&gt;: Forget libraries for a moment. Master the &lt;strong&gt;Box Model&lt;/strong&gt;,
  913. &lt;strong&gt;Flexbox&lt;/strong&gt;, &lt;strong&gt;CSS Grid&lt;/strong&gt;, and &lt;strong&gt;Custom Properties (CSS Variables)&lt;/strong&gt;. If you
  914. can&amp;rsquo;t build a responsive layout with pure CSS, you aren&amp;rsquo;t ready for
  915. &lt;strong&gt;Tailwind&lt;/strong&gt;.&lt;/li&gt;
  916. &lt;li&gt;&lt;strong&gt;Core JavaScript (ES6+)&lt;/strong&gt;: You need to understand closures, prototypes,
  917. &lt;strong&gt;asynchronous programming&lt;/strong&gt; (&lt;code&gt;async/await&lt;/code&gt;), and functional programming
  918. concepts. Learn how the browser actually executes your code.&lt;/li&gt;
  919. &lt;li&gt;&lt;strong&gt;Browser APIs&lt;/strong&gt;: Spend time with the &lt;strong&gt;Fetch API&lt;/strong&gt;, &lt;strong&gt;localStorage&lt;/strong&gt;,
  920. &lt;strong&gt;Intersection Observer&lt;/strong&gt;, and &lt;strong&gt;Web Workers&lt;/strong&gt;. These are the tools the
  921. browser gives you for free.&lt;/li&gt;
  922. &lt;li&gt;&lt;strong&gt;HTTP &amp;amp; Networking&lt;/strong&gt;: Understand status codes, headers, CORS, and the
  923. difference between &lt;strong&gt;REST&lt;/strong&gt; and &lt;strong&gt;GraphQL&lt;/strong&gt;. Knowing &lt;em&gt;how&lt;/em&gt; data moves across
  924. the wire is more important than the library you use to fetch it.&lt;/li&gt;
  925. &lt;/ol&gt;
  926. &lt;blockquote&gt;
  927. &lt;p&gt;&lt;strong&gt;Common Pitfall: Tutorial Hell&lt;/strong&gt; Many beginners fall into the trap of
  928. watching 50-hour courses and following along line-by-line. This gives you a
  929. false sense of competence. You aren&amp;rsquo;t learning to code; you&amp;rsquo;re learning to
  930. transcribe. Break the cycle by building something unique every time you finish
  931. a module.&lt;/p&gt;
  932. &lt;/blockquote&gt;
  933. &lt;h2 id="phase-2-the-first-project-architecture"&gt;Phase 2: The &amp;ldquo;First Project&amp;rdquo; Architecture&lt;/h2&gt;
  934. &lt;p&gt;Once you have the basics, don&amp;rsquo;t build another Todo list. Build something that
  935. solves a real problem. If I were starting today, my first &amp;ldquo;serious&amp;rdquo; project
  936. would be a &lt;strong&gt;Personal Knowledge Base&lt;/strong&gt; or a &lt;strong&gt;Custom CMS&lt;/strong&gt;.&lt;/p&gt;
  937. &lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because it forces you to handle:&lt;/p&gt;
  938. &lt;ul&gt;
  939. &lt;li&gt;&lt;strong&gt;Data Persistence&lt;/strong&gt;: Connecting to a database (SQL or NoSQL).&lt;/li&gt;
  940. &lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: Implementing secure login and sessions.&lt;/li&gt;
  941. &lt;li&gt;&lt;strong&gt;CRUD Operations&lt;/strong&gt;: Create, Read, Update, Delete.&lt;/li&gt;
  942. &lt;li&gt;&lt;strong&gt;State Management&lt;/strong&gt;: Managing complex data on the frontend.&lt;/li&gt;
  943. &lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: Getting your code into the real world.&lt;/li&gt;
  944. &lt;/ul&gt;
  945. &lt;h2 id="phase-3-version-control--collaboration"&gt;Phase 3: Version Control &amp;amp; Collaboration&lt;/h2&gt;
  946. &lt;p&gt;I avoided &lt;strong&gt;Git&lt;/strong&gt; for too long in my early years, thinking it was only for
  947. teams. That was a massive mistake. &lt;strong&gt;Git&lt;/strong&gt; isn&amp;rsquo;t just a backup tool; it&amp;rsquo;s a
  948. &lt;strong&gt;time machine&lt;/strong&gt; and a &lt;strong&gt;collaboration engine&lt;/strong&gt;.&lt;/p&gt;
  949. &lt;p&gt;If you want to be a professional, you must be comfortable with the &lt;strong&gt;terminal&lt;/strong&gt;.
  950. Learn how to:&lt;/p&gt;
  951. &lt;ul&gt;
  952. &lt;li&gt;Branch, merge, and handle merge conflicts.&lt;/li&gt;
  953. &lt;li&gt;Write meaningful commit messages (e.g.,
  954. &lt;a href="https://www.conventionalcommits.org/"&gt;Conventional Commits&lt;/a&gt;).&lt;/li&gt;
  955. &lt;li&gt;Perform code reviews on GitHub/GitLab.&lt;/li&gt;
  956. &lt;li&gt;Use &lt;code&gt;git rebase&lt;/code&gt; to keep your history clean.&lt;/li&gt;
  957. &lt;/ul&gt;
  958. &lt;h2 id="phase-4-integrating-ai-the-2026-reality"&gt;Phase 4: Integrating AI (The 2026 Reality)&lt;/h2&gt;
  959. &lt;p&gt;We cannot talk about starting a dev career today without mentioning &lt;strong&gt;AI&lt;/strong&gt;. In
  960. 2026, &lt;strong&gt;AI&lt;/strong&gt; is no longer a luxury; it&amp;rsquo;s a standard part of the workflow.
  961. However, it is a double-edged sword.&lt;/p&gt;
  962. &lt;p&gt;As I&amp;rsquo;ve written about previously, the goal is to use &lt;strong&gt;AI&lt;/strong&gt; as a &lt;strong&gt;copilot&lt;/strong&gt;,
  963. not the captain. If you use &lt;strong&gt;AI&lt;/strong&gt; to write code you don&amp;rsquo;t understand, you
  964. aren&amp;rsquo;t a developer; you&amp;rsquo;re a prompt engineer with a looming technical debt
  965. crisis.&lt;/p&gt;
  966. &lt;blockquote&gt;
  967. &lt;p&gt;&lt;strong&gt;Pro Tip: The 15-Minute Rule&lt;/strong&gt; When you hit a bug, spend exactly 15 minutes
  968. trying to solve it yourself by reading the docs and debugging. If you&amp;rsquo;re still
  969. stuck, use &lt;strong&gt;AI&lt;/strong&gt; to explain the concept, not just give you the fix. This
  970. ensures you&amp;rsquo;re still growing your &amp;ldquo;mental muscle.&amp;rdquo;&lt;/p&gt;
  971. &lt;/blockquote&gt;
  972. &lt;h2 id="the-career-roadmap-from-junior-to-lead"&gt;The Career Roadmap: From Junior to Lead&lt;/h2&gt;
  973. &lt;p&gt;Success in this industry isn&amp;rsquo;t just about code. It&amp;rsquo;s about how your
  974. responsibilities shift as you grow.&lt;/p&gt;
  975. &lt;table&gt;
  976. &lt;thead&gt;
  977. &lt;tr&gt;
  978. &lt;th style="text-align: left"&gt;Level&lt;/th&gt;
  979. &lt;th style="text-align: left"&gt;Primary Focus&lt;/th&gt;
  980. &lt;th style="text-align: left"&gt;Key Skill to Master&lt;/th&gt;
  981. &lt;th style="text-align: left"&gt;Output&lt;/th&gt;
  982. &lt;/tr&gt;
  983. &lt;/thead&gt;
  984. &lt;tbody&gt;
  985. &lt;tr&gt;
  986. &lt;td style="text-align: left"&gt;&lt;strong&gt;Junior&lt;/strong&gt;&lt;/td&gt;
  987. &lt;td style="text-align: left"&gt;Syntax &amp;amp; Implementation&lt;/td&gt;
  988. &lt;td style="text-align: left"&gt;Reading Documentation&lt;/td&gt;
  989. &lt;td style="text-align: left"&gt;Working code that follows instructions.&lt;/td&gt;
  990. &lt;/tr&gt;
  991. &lt;tr&gt;
  992. &lt;td style="text-align: left"&gt;&lt;strong&gt;Mid-Level&lt;/strong&gt;&lt;/td&gt;
  993. &lt;td style="text-align: left"&gt;Architecture &amp;amp; Patterns&lt;/td&gt;
  994. &lt;td style="text-align: left"&gt;Testing &amp;amp; Maintainability&lt;/td&gt;
  995. &lt;td style="text-align: left"&gt;Scalable features with minimal bugs.&lt;/td&gt;
  996. &lt;/tr&gt;
  997. &lt;tr&gt;
  998. &lt;td style="text-align: left"&gt;&lt;strong&gt;Senior&lt;/strong&gt;&lt;/td&gt;
  999. &lt;td style="text-align: left"&gt;Problem Solving &amp;amp; Systems&lt;/td&gt;
  1000. &lt;td style="text-align: left"&gt;Communication &amp;amp; Mentorship&lt;/td&gt;
  1001. &lt;td style="text-align: left"&gt;Technical direction and team productivity.&lt;/td&gt;
  1002. &lt;/tr&gt;
  1003. &lt;tr&gt;
  1004. &lt;td style="text-align: left"&gt;&lt;strong&gt;Lead&lt;/strong&gt;&lt;/td&gt;
  1005. &lt;td style="text-align: left"&gt;Business Value &amp;amp; Strategy&lt;/td&gt;
  1006. &lt;td style="text-align: left"&gt;Decision Making&lt;/td&gt;
  1007. &lt;td style="text-align: left"&gt;High-impact architectural and organizational changes.&lt;/td&gt;
  1008. &lt;/tr&gt;
  1009. &lt;/tbody&gt;
  1010. &lt;/table&gt;
  1011. &lt;h2 id="the-business-of-code"&gt;The Business of Code&lt;/h2&gt;
  1012. &lt;p&gt;This is the lesson that took me a decade to truly internalize: &lt;strong&gt;Code is a
  1013. liability, not an asset.&lt;/strong&gt;&lt;/p&gt;
  1014. &lt;p&gt;Companies don&amp;rsquo;t pay you to write code; they pay you to solve problems. Sometimes
  1015. the best solution to a problem is &lt;em&gt;not&lt;/em&gt; writing code at all. Understanding the
  1016. business context of your work — how it makes money, how it saves time, or how it
  1017. reduces risk — will make you ten times more valuable than the best &amp;ldquo;pure&amp;rdquo; coder.&lt;/p&gt;
  1018. &lt;h2 id="soft-skills-the-secret-weapon"&gt;Soft Skills: The &amp;ldquo;Secret&amp;rdquo; Weapon&lt;/h2&gt;
  1019. &lt;p&gt;Technical skills get you the interview. &lt;strong&gt;Soft Skills&lt;/strong&gt; get you the job and the
  1020. promotion. In a world where &lt;strong&gt;AI&lt;/strong&gt; can write a boilerplate &lt;strong&gt;React&lt;/strong&gt; component
  1021. in seconds, your ability to &lt;strong&gt;communicate&lt;/strong&gt;, &lt;strong&gt;empathize&lt;/strong&gt;, and &lt;strong&gt;negotiate&lt;/strong&gt; is
  1022. your moat.&lt;/p&gt;
  1023. &lt;ul&gt;
  1024. &lt;li&gt;&lt;strong&gt;Writing&lt;/strong&gt;: Can you explain a complex bug in a Jira ticket? Can you write a
  1025. clear README?&lt;/li&gt;
  1026. &lt;li&gt;&lt;strong&gt;Public Speaking&lt;/strong&gt;: Can you demo your work to stakeholders?&lt;/li&gt;
  1027. &lt;li&gt;&lt;strong&gt;Empathy&lt;/strong&gt;: Can you understand why a designer is frustrated with your
  1028. implementation?&lt;/li&gt;
  1029. &lt;li&gt;&lt;strong&gt;Reliability&lt;/strong&gt;: Do you do what you say you&amp;rsquo;re going to do?&lt;/li&gt;
  1030. &lt;/ul&gt;
  1031. &lt;h2 id="dont-chase-trends"&gt;Don&amp;rsquo;t Chase Trends&lt;/h2&gt;
  1032. &lt;p&gt;I&amp;rsquo;ve watched jQuery, Backbone, Angular, and countless others rise and fall. If
  1033. you chase every trend, you will burn out.&lt;/p&gt;
  1034. &lt;p&gt;Instead, adopt the &lt;strong&gt;80/20 Rule for Learning&lt;/strong&gt;:&lt;/p&gt;
  1035. &lt;ul&gt;
  1036. &lt;li&gt;Spend &lt;strong&gt;80%&lt;/strong&gt; of your time mastering established, &amp;ldquo;boring&amp;rdquo; technologies
  1037. (&lt;strong&gt;SQL&lt;/strong&gt;, &lt;strong&gt;Bash&lt;/strong&gt;, &lt;strong&gt;vanilla JS&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt;, &lt;strong&gt;Docker&lt;/strong&gt;).&lt;/li&gt;
  1038. &lt;li&gt;Spend &lt;strong&gt;20%&lt;/strong&gt; of your time playing with the new shiny stuff (new frameworks,
  1039. &lt;strong&gt;AI&lt;/strong&gt; agents, etc.).&lt;/li&gt;
  1040. &lt;/ul&gt;
  1041. &lt;h2 id="the-advice-i-wish-id-followed"&gt;The Advice I Wish I&amp;rsquo;d Followed&lt;/h2&gt;
  1042. &lt;ol&gt;
  1043. &lt;li&gt;&lt;strong&gt;Write about what you learn&lt;/strong&gt;: Teaching is the highest form of learning.
  1044. Start a blog on day one.&lt;/li&gt;
  1045. &lt;li&gt;&lt;strong&gt;Contribute to Open Source&lt;/strong&gt;: Don&amp;rsquo;t start with code. Start with
  1046. documentation or fixing typos. It teaches you how professional repositories
  1047. are managed.&lt;/li&gt;
  1048. &lt;li&gt;&lt;strong&gt;Take care of your health&lt;/strong&gt;: This is a sedentary job. If you don&amp;rsquo;t schedule
  1049. time for movement, your back and wrists will remind you in ten years.&lt;/li&gt;
  1050. &lt;li&gt;&lt;strong&gt;Save your &amp;ldquo;F-you&amp;rdquo; money&lt;/strong&gt;: Freelancing and tech jobs can be volatile.
  1051. Having a financial buffer gives you the freedom to say &amp;ldquo;no&amp;rdquo; to toxic
  1052. projects.&lt;/li&gt;
  1053. &lt;/ol&gt;
  1054. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1055. &lt;p&gt;If you&amp;rsquo;re starting today, the mountain might look insurmountable. The stack is
  1056. taller, the competition is global, and the tools are more complex. But the
  1057. reward for those who focus on the &lt;strong&gt;fundamentals&lt;/strong&gt; remains higher than ever.&lt;/p&gt;
  1058. &lt;p&gt;The specific technologies will change — they always do. But the ability to
  1059. learn, solve problems, and communicate effectively will serve you for decades.
  1060. Stop looking for the perfect tutorial and start building something that breaks.
  1061. That’s where the real learning happens.&lt;/p&gt;
  1062. &lt;p&gt;The best time to start was twenty years ago. The second best time is now. &lt;strong&gt;Get
  1063. to work.&lt;/strong&gt;&lt;/p&gt;
  1064. </content:encoded>
  1065. <dc:creator>Val Paliy</dc:creator>
  1066. </item>
  1067. <item>
  1068. <title>Quora: The Knowledge-Sharing Platform That Still Matters</title>
  1069. <link>https://valticus.pro/posts/quora-the-knowledge-sharing-platform/</link>
  1070. <pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate>
  1071. <guid isPermaLink="true">https://valticus.pro/posts/quora-the-knowledge-sharing-platform/</guid>
  1072. <description>Discover why Quora remains a valuable resource for knowledge sharing, how to leverage it for learning and growth, and why it's still relevant in 2026.</description>
  1073. <category>Technology</category><content:encoded>&lt;p&gt;In an era dominated by short-form video and algorithmic feeds, Quora stands as a
  1074. beacon for those who crave in-depth knowledge and thoughtful discussion. Founded
  1075. in 2009 by former Facebook employees Adam D&amp;rsquo;Angelo and Charlie Cheever, Quora
  1076. has evolved into one of the internet&amp;rsquo;s most comprehensive Q&amp;amp;A platforms.&lt;/p&gt;
  1077. &lt;h2 id="what-makes-quora-special"&gt;What Makes Quora Special?&lt;/h2&gt;
  1078. &lt;p&gt;Quora&amp;rsquo;s strength lies in its commitment to quality answers. Unlike social media
  1079. platforms optimized for engagement, Quora prioritizes expertise and depth. Users
  1080. can ask questions on virtually any topic — from programming and science to
  1081. philosophy and personal development — and receive answers from knowledgeable
  1082. contributors, including verified experts and industry professionals.&lt;/p&gt;
  1083. &lt;p&gt;The platform&amp;rsquo;s upvote system ensures that the most helpful answers rise to the
  1084. top, creating a self-curated knowledge base that grows richer over time. For
  1085. developers and tech enthusiasts, Quora offers invaluable insights into career
  1086. advice, coding challenges, and industry trends.&lt;/p&gt;
  1087. &lt;h2 id="quora-for-learning-and-growth"&gt;Quora for Learning and Growth&lt;/h2&gt;
  1088. &lt;p&gt;One of Quora&amp;rsquo;s most underappreciated features is its potential for continuous
  1089. learning. By following topics aligned with your interests, you create a
  1090. personalized feed of high-quality content. Whether you&amp;rsquo;re exploring new
  1091. programming languages, understanding system design patterns, or diving into
  1092. business strategy, Quora provides diverse perspectives that textbooks simply
  1093. can&amp;rsquo;t match.&lt;/p&gt;
  1094. &lt;p&gt;The platform also allows you to build a presence by sharing your expertise. If
  1095. you have deep knowledge in a particular area, answering questions on Quora can
  1096. establish you as a thought leader while helping others.&lt;/p&gt;
  1097. &lt;h2 id="my-quora-journey"&gt;My Quora Journey&lt;/h2&gt;
  1098. &lt;p&gt;I&amp;rsquo;ve found Quora to be an excellent space for sharing thoughts on technology,
  1099. development practices, and the broader tech landscape. You can follow my
  1100. contributions and explore the topics I cover on my
  1101. &lt;a href="https://valticus.quora.com/"&gt;Quora blog&lt;/a&gt;.&lt;/p&gt;
  1102. &lt;h2 id="why-quora-still-matters-in-2026"&gt;Why Quora Still Matters in 2026&lt;/h2&gt;
  1103. &lt;p&gt;Despite the rise of AI-generated answers and social media alternatives, Quora
  1104. remains relevant because it fosters genuine human expertise. The platform&amp;rsquo;s
  1105. evolution — including Quora+ and Spaces — has added new dimensions to content
  1106. creation and community building while maintaining its core mission of sharing
  1107. knowledge.&lt;/p&gt;
  1108. &lt;p&gt;For anyone serious about learning, growing their expertise, or connecting with
  1109. like-minded professionals, Quora deserves a place in your digital toolkit.&lt;/p&gt;
  1110. </content:encoded>
  1111. <dc:creator>Val Paliy</dc:creator>
  1112. </item>
  1113. <item>
  1114. <title>Minimalist Development Workflow: My Experience and Insights</title>
  1115. <link>https://valticus.pro/posts/minimalist-development-workflow-my-experience-and-insights/</link>
  1116. <pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate>
  1117. <guid isPermaLink="true">https://valticus.pro/posts/minimalist-development-workflow-my-experience-and-insights/</guid>
  1118. <description>A personal account of adopting a minimalist approach to development workflows, exploring the benefits, challenges, and practical strategies for reducing complexity without sacrificing productivity.</description>
  1119. <category>Web Development</category><content:encoded>&lt;p&gt;After twenty years in web development, I&amp;rsquo;ve realized that the most dangerous
  1120. thing in our industry isn&amp;rsquo;t a security vulnerability or a system outage — it&amp;rsquo;s
  1121. &lt;strong&gt;creeping complexity&lt;/strong&gt;. We are conditioned to believe that a more sophisticated
  1122. setup equals a more professional output. We stack layers of abstraction until we
  1123. can no longer see the foundation of our own applications.&lt;/p&gt;
  1124. &lt;p&gt;I spent the first decade of my career as a &amp;ldquo;maximalist.&amp;rdquo; I wanted the flashiest
  1125. IDE, the most complex build pipelines, and the latest alpha-version frameworks.
  1126. But eventually, the weight of that tooling became a burden. I was spending 40%
  1127. of my time fighting my environment rather than shipping code.&lt;/p&gt;
  1128. &lt;figure&gt;
  1129. &lt;div class="progressive-image"&gt;
  1130. &lt;img class="progressive-image__img"
  1131. src="https://valticus.pro/images/minimalist-development-workflow-my-experience-and-insights_hu_44c6f909c36cf879.webp"
  1132. alt="Minimalist Development Workflow: My Experience and Insights."
  1133. width="800"
  1134. height="436"&gt;
  1135. &lt;/div&gt;
  1136. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Minimalist Development Workflow: My Experience and Insights.&lt;/p&gt;&lt;/figcaption&gt;
  1137. &lt;/figure&gt;
  1138. &lt;p&gt;Now? I pride myself on how little I need to get the job done. This is my journey
  1139. toward a &lt;strong&gt;Minimalist Development Workflow&lt;/strong&gt;.&lt;/p&gt;
  1140. &lt;h2 id="the-breaking-point-complexity-debt"&gt;The Breaking Point: Complexity Debt&lt;/h2&gt;
  1141. &lt;p&gt;The realization hit me during a routine update. A simple project with a dozen
  1142. pages required a &lt;code&gt;npm install&lt;/code&gt; that downloaded 800MB of dependencies and
  1143. triggered three different security warnings in libraries I didn&amp;rsquo;t even know I
  1144. was using.&lt;/p&gt;
  1145. &lt;p&gt;My &amp;ldquo;productivity&amp;rdquo; had become a facade. I was paying &lt;strong&gt;Complexity Debt&lt;/strong&gt; every
  1146. single day:&lt;/p&gt;
  1147. &lt;ul&gt;
  1148. &lt;li&gt;&lt;strong&gt;Build Times&lt;/strong&gt;: Waiting 60 seconds for a &amp;ldquo;hot reload&amp;rdquo; of a CSS change.&lt;/li&gt;
  1149. &lt;li&gt;&lt;strong&gt;Onboarding&lt;/strong&gt;: Taking two days to explain the environment to a new developer.&lt;/li&gt;
  1150. &lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: Spending weekends fixing breaking changes in a framework that
  1151. I didn&amp;rsquo;t really need.&lt;/li&gt;
  1152. &lt;/ul&gt;
  1153. &lt;p&gt;I decided to burn it down and start from the fundamentals.&lt;/p&gt;
  1154. &lt;h2 id="the-boring-technology-philosophy"&gt;The &amp;ldquo;Boring Technology&amp;rdquo; Philosophy&lt;/h2&gt;
  1155. &lt;p&gt;I adopted the &amp;ldquo;&lt;strong&gt;Boring Technology&lt;/strong&gt;&amp;rdquo; mindset. Boring technology is reliable.
  1156. Its edge cases are known. It doesn&amp;rsquo;t change its API every six months. For a
  1157. minimalist workflow, boring is beautiful.&lt;/p&gt;
  1158. &lt;h3 id="what-i-kept-the-essentials"&gt;What I Kept (The Essentials)&lt;/h3&gt;
  1159. &lt;ol&gt;
  1160. &lt;li&gt;&lt;strong&gt;The Editor&lt;/strong&gt;: VS Code, but stripped to the bone. No &amp;ldquo;AI Autocomplete&amp;rdquo; that
  1161. guesses wrong 40% of the time. No 15-extension &amp;ldquo;Pack for React Developers.&amp;rdquo;
  1162. Just a good mono font, a fast terminal, and built-in Git support.&lt;/li&gt;
  1163. &lt;li&gt;&lt;strong&gt;The Stack&lt;/strong&gt;: Whenever possible, I return to the &amp;ldquo;Holy Trinity&amp;rdquo;: &lt;strong&gt;Semantic
  1164. HTML&lt;/strong&gt;, &lt;strong&gt;Modern CSS&lt;/strong&gt;, and &lt;strong&gt;Vanilla JavaScript&lt;/strong&gt;.&lt;/li&gt;
  1165. &lt;li&gt;&lt;strong&gt;The Static Engine&lt;/strong&gt;: I use &lt;strong&gt;Hugo&lt;/strong&gt; for almost everything. It&amp;rsquo;s a single
  1166. binary, it&amp;rsquo;s written in &lt;strong&gt;Go&lt;/strong&gt;, and it builds 5,000 pages in under a second.
  1167. No &lt;code&gt;node_modules&lt;/code&gt; required for the core engine.&lt;/li&gt;
  1168. &lt;/ol&gt;
  1169. &lt;h2 id="replacing-complex-tools-with-simple-scripts"&gt;Replacing Complex Tools with Simple Scripts&lt;/h2&gt;
  1170. &lt;p&gt;The biggest win in my minimalist transition was replacing &amp;ldquo;Task Runners&amp;rdquo; (Gulp,
  1171. Grunt, and even complex npm scripts) with a tool that has been around since
  1172. 1976: &lt;strong&gt;The Makefile&lt;/strong&gt;.&lt;/p&gt;
  1173. &lt;p&gt;A &lt;code&gt;Makefile&lt;/code&gt; is transparent, fast, and doesn&amp;rsquo;t require a runtime. It serves as
  1174. the &amp;ldquo;source of truth&amp;rdquo; for how to build and deploy your project.&lt;/p&gt;
  1175. &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-makefile" &gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Minimalist Development Workflow Makefile
  1176. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;deploy&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;
  1177. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1178. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;help&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;## Show this help message
  1179. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @grep -E &lt;span class="s1"&gt;&amp;#39;^[a-zA-Z_-]+:.*?## .*$$&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;MAKEFILE_LIST&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;BEGIN {FS = &amp;#34;:.*?## &amp;#34;}; {printf &amp;#34;\033[36m%-15s\033[0m %s\n&amp;#34;, $$1, $$2}&amp;#39;&lt;/span&gt;
  1180. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1181. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;## Start Hugo development server
  1182. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hugo server -D -E -F --minify
  1183. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1184. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;## Build the production site
  1185. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -rf public
  1186. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hugo --gc --minify
  1187. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1188. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="c"&gt;## Deploy to production via Netlify
  1189. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; npx netlify-cli deploy --prod --dir&lt;span class="o"&gt;=&lt;/span&gt;public
  1190. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1191. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c"&gt;## Remove build artifacts
  1192. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -rf public resources
  1193. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By using this, I don&amp;rsquo;t need to remember 20 different CLI flags. I just type
  1194. &lt;code&gt;make dev&lt;/code&gt; or &lt;code&gt;make deploy&lt;/code&gt;. It&amp;rsquo;s portable, version-controlled, and requires
  1195. zero configuration on a new machine.&lt;/p&gt;
  1196. &lt;h2 id="what-i-dropped-and-why"&gt;What I Dropped (And Why)&lt;/h2&gt;
  1197. &lt;h3 id="1-the-big-three-frameworks"&gt;1. The &amp;ldquo;Big Three&amp;rdquo; Frameworks&lt;/h3&gt;
  1198. &lt;p&gt;Unless I&amp;rsquo;m building a highly dynamic, state-heavy dashboard, I don&amp;rsquo;t use React,
  1199. Vue, or Angular. Most websites are content, and content doesn&amp;rsquo;t need a &lt;strong&gt;virtual
  1200. DOM&lt;/strong&gt;. It needs a fast server and a browser.&lt;/p&gt;
  1201. &lt;h3 id="2-utility-first-css-frameworks"&gt;2. Utility-First CSS Frameworks&lt;/h3&gt;
  1202. &lt;p&gt;While I appreciate the speed of Tailwind, I&amp;rsquo;ve returned to &lt;strong&gt;Vanilla CSS with
  1203. Custom Properties&lt;/strong&gt;. Modern CSS (&lt;strong&gt;Grid&lt;/strong&gt;, &lt;strong&gt;Flexbox&lt;/strong&gt;, &lt;strong&gt;Containers&lt;/strong&gt;) has made
  1204. frameworks largely redundant for those who actually know the language.&lt;/p&gt;
  1205. &lt;h3 id="3-heavy-ides"&gt;3. &amp;ldquo;Heavy&amp;rdquo; IDES&lt;/h3&gt;
  1206. &lt;p&gt;I moved away from heavy, RAM-hungry IDEs. If I can&amp;rsquo;t run my development
  1207. environment on a 5-year-old laptop without the fans spinning up, my workflow is
  1208. too heavy. This ties back to my philosophy on digital minimalism for developers,
  1209. where I discuss the mental impact of digital clutter.&lt;/p&gt;
  1210. &lt;blockquote&gt;
  1211. &lt;h3 id="-common-pitfall-not-invented-here-nih"&gt;🚩 Common Pitfall: &amp;ldquo;Not Invented Here&amp;rdquo; (NIH)&lt;/h3&gt;
  1212. &lt;p&gt;Minimalists often fall into the trap of wanting to build everything from
  1213. scratch. This can lead to its own kind of complexity. The goal isn&amp;rsquo;t to write
  1214. your own database; it&amp;rsquo;s to avoid installing a database when a JSON file will
  1215. do.&lt;/p&gt;
  1216. &lt;/blockquote&gt;
  1217. &lt;h2 id="the-minimalist-project-checklist"&gt;The Minimalist Project Checklist&lt;/h2&gt;
  1218. &lt;p&gt;Before starting a new project, I run it through this &amp;ldquo;Pruning Filter&amp;rdquo;:&lt;/p&gt;
  1219. &lt;ul&gt;
  1220. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Can this be static?&lt;/strong&gt; If yes, no server-side code.&lt;/li&gt;
  1221. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Does it need JS?&lt;/strong&gt; If the interaction can be done with HTML/CSS (like a
  1222. toggle menu), skip the JS.&lt;/li&gt;
  1223. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Single Binary Rule&lt;/strong&gt;: Can I build this using only tools that are single
  1224. binaries (like Hugo, Go, or Rust tools)?&lt;/li&gt;
  1225. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Zero-Config Onboarding&lt;/strong&gt;: Can a developer clone this and run it with one
  1226. command (e.g., &lt;code&gt;make dev&lt;/code&gt;)?&lt;/li&gt;
  1227. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;No-Build CSS&lt;/strong&gt;: Can I use standard CSS files without a pre-processor?&lt;/li&gt;
  1228. &lt;/ul&gt;
  1229. &lt;h2 id="the-benefits-of-less"&gt;The Benefits of Less&lt;/h2&gt;
  1230. &lt;h3 id="instant-context-re-entry"&gt;Instant Context Re-entry&lt;/h3&gt;
  1231. &lt;p&gt;When I return to a project after six months, I don&amp;rsquo;t have to spend an hour
  1232. updating dependencies or remembering how the &amp;ldquo;Magic Build Tool&amp;rdquo; works. The code
  1233. is just code.&lt;/p&gt;
  1234. &lt;h3 id="faster-feedback-loops"&gt;Faster Feedback Loops&lt;/h3&gt;
  1235. &lt;p&gt;My build time is usually under 500ms. This instant feedback allows me to enter a
  1236. &lt;strong&gt;Flow State&lt;/strong&gt; that is impossible when you&amp;rsquo;re constantly waiting for a
  1237. transpiler to finish.&lt;/p&gt;
  1238. &lt;h3 id="improved-security"&gt;Improved Security&lt;/h3&gt;
  1239. &lt;p&gt;Every dependency you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; install is a &lt;strong&gt;supply-chain attack&lt;/strong&gt; that &lt;em&gt;can&amp;rsquo;t&lt;/em&gt;
  1240. happen to you. Minimalism is the ultimate security architecture.&lt;/p&gt;
  1241. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1242. &lt;p&gt;A minimalist workflow isn&amp;rsquo;t about being a Luddite or hating progress. It&amp;rsquo;s about
  1243. &lt;strong&gt;respecting your own time&lt;/strong&gt;. It&amp;rsquo;s about choosing tools that serve you, rather
  1244. than tools that require you to serve them.&lt;/p&gt;
  1245. &lt;p&gt;By stripping away the noise, you reveal the signal. You&amp;rsquo;ll find that you write
  1246. better code, understand your systems deeper, and — most importantly — you&amp;rsquo;ll
  1247. spend more time solving real problems and less time tweaking your configuration
  1248. files.&lt;/p&gt;
  1249. &lt;p&gt;&lt;strong&gt;Take a look at your current project. What is the one dependency you could
  1250. remove today and still deliver the same value? Try it.&lt;/strong&gt;&lt;/p&gt;
  1251. </content:encoded>
  1252. <dc:creator>Val Paliy</dc:creator>
  1253. </item>
  1254. <item>
  1255. <title>Why Frameworks Are Overused (And How to Avoid It)</title>
  1256. <link>https://valticus.pro/posts/why-frameworks-are-overused-and-how-to-avoid-it/</link>
  1257. <pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
  1258. <guid isPermaLink="true">https://valticus.pro/posts/why-frameworks-are-overused-and-how-to-avoid-it/</guid>
  1259. <description>A critical look at the 'Framework-First' mentality in modern web development. Learn when to reach for a library and when to stick to the fundamentals for better performance and maintainability.</description>
  1260. <category>Web Development</category><content:encoded>&lt;h2 id="the-framework-first-fallacy"&gt;The Framework-First Fallacy&lt;/h2&gt;
  1261. &lt;p&gt;In the landscape of 2026, the default response to almost any web development
  1262. project is to start with a framework. Need a personal landing page? Reach for
  1263. Next.js. Building a simple data dashboard? Boot up a React template. Creating a
  1264. documentation site? Gatsby or Nuxt is the presumed choice.&lt;/p&gt;
  1265. &lt;p&gt;We have reached a point where many developers — especially those who entered the
  1266. industry in the last five years — literally cannot build a website without first
  1267. installing a framework. This isn&amp;rsquo;t just a shift in preference; it&amp;rsquo;s a
  1268. &lt;strong&gt;Framework-First Fallacy&lt;/strong&gt; that prioritizes the developer&amp;rsquo;s comfort over the
  1269. user&amp;rsquo;s experience and the project&amp;rsquo;s long-term health.&lt;/p&gt;
  1270. &lt;figure&gt;
  1271. &lt;div class="progressive-image"&gt;
  1272. &lt;img class="progressive-image__img"
  1273. src="https://valticus.pro/images/why-frameworks-are-overused-and-how-to-avoid-it_hu_eae461301fe9faf6.webp"
  1274. alt="Why Frameworks Are Overused (And How to Avoid It)."
  1275. width="800"
  1276. height="436"&gt;
  1277. &lt;/div&gt;
  1278. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;Why Frameworks Are Overused (And How to Avoid It).&lt;/p&gt;&lt;/figcaption&gt;
  1279. &lt;/figure&gt;
  1280. &lt;h2 id="the-hidden-costs-of-abstraction"&gt;The Hidden Costs of Abstraction&lt;/h2&gt;
  1281. &lt;p&gt;While frameworks promise speed and consistency, they come with a significant
  1282. &amp;ldquo;&lt;strong&gt;Abstraction Tax&lt;/strong&gt;&amp;rdquo; that is rarely discussed in the hype-filled world of tech
  1283. social media and YouTube tutorials.&lt;/p&gt;
  1284. &lt;h3 id="1-the-bundle-size-reality-check"&gt;1. The Bundle Size Reality Check&lt;/h3&gt;
  1285. &lt;p&gt;Let&amp;rsquo;s look at the math for a &amp;ldquo;simple&amp;rdquo; interactive site in 2026. If you use a
  1286. modern meta-framework, your baseline might look like this:&lt;/p&gt;
  1287. &lt;ul&gt;
  1288. &lt;li&gt;&lt;strong&gt;Framework Core (React/Vue/Angular):&lt;/strong&gt; ~45KB – 130KB &lt;strong&gt;gzipped&lt;/strong&gt;&lt;/li&gt;
  1289. &lt;li&gt;&lt;strong&gt;Hydration Logic:&lt;/strong&gt; ~20KB – 50KB&lt;/li&gt;
  1290. &lt;li&gt;&lt;strong&gt;Routing &amp;amp; State Management:&lt;/strong&gt; ~30KB&lt;/li&gt;
  1291. &lt;li&gt;&lt;strong&gt;UI Component Library (Radix, HeadlessUI, etc.):&lt;/strong&gt; ~40KB&lt;/li&gt;
  1292. &lt;li&gt;&lt;strong&gt;Your Actual Business Logic:&lt;/strong&gt; ~15KB&lt;/li&gt;
  1293. &lt;/ul&gt;
  1294. &lt;p&gt;In this scenario, you are shipping nearly 300KB of JavaScript to the user just
  1295. to deliver 15KB of unique functionality. On a high-speed fiber connection, this
  1296. might feel negligible. But on a spotty 4G connection or an entry-level mobile
  1297. device, that 300KB represents a multi-second delay in &lt;strong&gt;Time to Interactive
  1298. (TTI)&lt;/strong&gt;. We are essentially forcing the user to download and execute a massive
  1299. engine just to move a few pixels.&lt;/p&gt;
  1300. &lt;h3 id="2-the-learning-curve-trap"&gt;2. The Learning Curve Trap&lt;/h3&gt;
  1301. &lt;p&gt;Frameworks don&amp;rsquo;t just require you to learn JavaScript; they require you to learn
  1302. a dialect of it. You aren&amp;rsquo;t just learning how to manipulate the DOM; you&amp;rsquo;re
  1303. learning about &amp;ldquo;&lt;strong&gt;Hooks&lt;/strong&gt;,&amp;rdquo; &amp;ldquo;&lt;strong&gt;Signals&lt;/strong&gt;,&amp;rdquo; &amp;ldquo;&lt;strong&gt;Observables&lt;/strong&gt;,&amp;rdquo; or &amp;ldquo;&lt;strong&gt;Virtual
  1304. DOM&lt;/strong&gt; reconciliation.&amp;rdquo;&lt;/p&gt;
  1305. &lt;p&gt;By the time a developer masters the specific idioms of Framework A, Framework B
  1306. has been released with a &amp;ldquo;revolutionary&amp;rdquo; new paradigm that makes Framework A
  1307. look antiquated. This creates a cycle of &lt;strong&gt;Perpetual Relearning&lt;/strong&gt; that steals
  1308. time away from mastering the fundamental technologies (HTML, CSS, &lt;strong&gt;Browser
  1309. APIs&lt;/strong&gt;) that have remained stable for decades.&lt;/p&gt;
  1310. &lt;h3 id="3-dependency-hell-and-maintenance-rot"&gt;3. Dependency Hell and Maintenance Rot&lt;/h3&gt;
  1311. &lt;p&gt;Modern framework projects don&amp;rsquo;t just have dependencies; they have ecosystems. A
  1312. simple &lt;code&gt;npm install&lt;/code&gt; today can result in 2,000+ folders in your
  1313. &lt;strong&gt;&lt;code&gt;node_modules&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
  1314. &lt;p&gt;This creates a massive surface area for:&lt;/p&gt;
  1315. &lt;ul&gt;
  1316. &lt;li&gt;&lt;strong&gt;Security Vulnerabilities&lt;/strong&gt;: Every transitive dependency is a potential entry
  1317. point.&lt;/li&gt;
  1318. &lt;li&gt;&lt;strong&gt;Breaking Changes&lt;/strong&gt;: A minor update in a sub-dependency can break your entire
  1319. build pipeline.&lt;/li&gt;
  1320. &lt;li&gt;&lt;strong&gt;Maintenance Rot&lt;/strong&gt;: Try opening a framework project from three years ago and
  1321. running it. The odds of it &amp;ldquo;just working&amp;rdquo; are near zero.&lt;/li&gt;
  1322. &lt;/ul&gt;
  1323. &lt;h2 id="the-framework-necessity-test"&gt;The Framework Necessity Test&lt;/h2&gt;
  1324. &lt;p&gt;Before you run &lt;code&gt;npx create-...&lt;/code&gt;, put your project through this checklist. If you
  1325. can&amp;rsquo;t check at least three boxes, you probably don&amp;rsquo;t need a framework.&lt;/p&gt;
  1326. &lt;ul&gt;
  1327. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Does the application have highly dynamic, synchronized state across
  1328. multiple UI components?&lt;/li&gt;
  1329. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Is the project being built by a team of 10+ developers who need strict
  1330. architectural guardrails?&lt;/li&gt;
  1331. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Does the UI require complex, real-time updates (e.g., a collaborative
  1332. editor or a high-frequency trading dashboard)?&lt;/li&gt;
  1333. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Are you building a &amp;ldquo;&lt;strong&gt;Single Page Application&lt;/strong&gt;&amp;rdquo; (&lt;strong&gt;SPA&lt;/strong&gt;) where
  1334. navigation must happen without full page reloads for a specific UX reason?&lt;/li&gt;
  1335. &lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Do you need to leverage a specific, massive ecosystem of pre-built
  1336. components that would take months to build from scratch?&lt;/li&gt;
  1337. &lt;/ul&gt;
  1338. &lt;h2 id="comparison-vanilla-vs-framework-the-modal-example"&gt;Comparison: Vanilla vs. Framework (The Modal Example)&lt;/h2&gt;
  1339. &lt;p&gt;To illustrate the point, let&amp;rsquo;s look at how we might build a simple modal.&lt;/p&gt;
  1340. &lt;p&gt;&lt;strong&gt;The &amp;ldquo;Modern Framework&amp;rdquo; Way:&lt;/strong&gt; You import a Modal component, a Portal, a State
  1341. hook, and probably an animation library. You write 50 lines of code, but you&amp;rsquo;ve
  1342. added 4 dependencies and 80KB to your bundle.&lt;/p&gt;
  1343. &lt;p&gt;&lt;strong&gt;The &amp;ldquo;Platform&amp;rdquo; Way (Vanilla JS):&lt;/strong&gt;&lt;/p&gt;
  1344. &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 modal in 2026 using the native &amp;lt;dialog&amp;gt; element
  1345. &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;modal&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;#myModal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  1346. &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;openBtn&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;#openModal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  1347. &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;closeBtn&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;#closeModal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  1348. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1349. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;openBtn&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="nx"&gt;modal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showModal&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  1350. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;closeBtn&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="nx"&gt;modal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  1351. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
  1352. &lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Simple, performant, and requires ZERO dependencies.
  1353. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By using the
  1354. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog"&gt;native &lt;strong&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element&lt;/strong&gt;&lt;/a&gt;,
  1355. you get accessibility (focus trapping, ESC key to close) for free, with zero
  1356. bundle size impact.&lt;/p&gt;
  1357. &lt;h2 id="the-progressive-enhancement-approach"&gt;The Progressive Enhancement Approach&lt;/h2&gt;
  1358. &lt;p&gt;The alternative to &amp;ldquo;Framework-First&amp;rdquo; is &lt;strong&gt;Progressive Enhancement&lt;/strong&gt;. It&amp;rsquo;s a
  1359. philosophy that has guided the web since its inception, yet it feels
  1360. revolutionary in the current climate.&lt;/p&gt;
  1361. &lt;ol&gt;
  1362. &lt;li&gt;&lt;strong&gt;Content First (HTML):&lt;/strong&gt; Start with the &lt;strong&gt;semantic structure&lt;/strong&gt;. Does the
  1363. site work if JavaScript is disabled? It should.&lt;/li&gt;
  1364. &lt;li&gt;&lt;strong&gt;Presentation (CSS):&lt;/strong&gt; Layer on the design. Modern CSS (Grid, &lt;strong&gt;Container
  1365. Queries&lt;/strong&gt;, Layers) can handle 90% of the layouts that used to require
  1366. JS-heavy libraries.&lt;/li&gt;
  1367. &lt;li&gt;&lt;strong&gt;Enhancement (JS):&lt;/strong&gt; Add interactivity. Use &lt;strong&gt;Vanilla JS&lt;/strong&gt; for simple
  1368. things. If a specific section of the page (like a complex filter or a
  1369. shopping cart) needs heavy state management, use a &amp;ldquo;&lt;strong&gt;micro-framework&lt;/strong&gt;&amp;rdquo; like
  1370. &lt;strong&gt;Alpine.js&lt;/strong&gt; or Petite-Vue only for that specific area.&lt;/li&gt;
  1371. &lt;/ol&gt;
  1372. &lt;p&gt;We need to stop treating frameworks as the foundation and start treating them as
  1373. the &lt;em&gt;accessory&lt;/em&gt;.&lt;/p&gt;
  1374. &lt;h2 id="when-frameworks-actually-make-sense"&gt;When Frameworks Actually Make Sense&lt;/h2&gt;
  1375. &lt;p&gt;Lest I be accused of being a luddite: frameworks &lt;em&gt;do&lt;/em&gt; have a place. If you are
  1376. building &lt;strong&gt;Spotify&lt;/strong&gt;, &lt;strong&gt;Figma&lt;/strong&gt;, or &lt;strong&gt;Discord&lt;/strong&gt;, a framework isn&amp;rsquo;t just helpful
  1377. — it&amp;rsquo;s essential. These are applications where the state is so complex and the
  1378. interactions so dense that managing them with &lt;strong&gt;Vanilla JS&lt;/strong&gt; would be an
  1379. exercise in masochism.&lt;/p&gt;
  1380. &lt;p&gt;The problem isn&amp;rsquo;t that frameworks exist; it&amp;rsquo;s that we use them for
  1381. &lt;strong&gt;everything&lt;/strong&gt;. We are using a sledgehammer to hang a picture frame.&lt;/p&gt;
  1382. &lt;blockquote&gt;
  1383. &lt;p&gt;&lt;strong&gt;Pro Tip: The 80/20 Rule of Tooling&lt;/strong&gt; 80% of the web consists of
  1384. content-heavy sites (blogs, portfolios, documentation, marketing pages). 20%
  1385. consists of complex &amp;ldquo;App-like&amp;rdquo; experiences. If you are in the 80%, you should
  1386. prioritize &lt;strong&gt;Static Site Generators&lt;/strong&gt; (like &lt;strong&gt;Hugo&lt;/strong&gt;) and &lt;strong&gt;Vanilla JS&lt;/strong&gt;. Save
  1387. the heavy frameworks for the remaining 20%.&lt;/p&gt;
  1388. &lt;/blockquote&gt;
  1389. &lt;h2 id="the-sustainability-argument"&gt;The Sustainability Argument&lt;/h2&gt;
  1390. &lt;p&gt;There is also a human and environmental cost to framework churn.&lt;/p&gt;
  1391. &lt;ul&gt;
  1392. &lt;li&gt;&lt;strong&gt;Mental Health:&lt;/strong&gt; The pressure to stay &amp;ldquo;current&amp;rdquo; with every framework update
  1393. contributes significantly to developer burnout.&lt;/li&gt;
  1394. &lt;li&gt;&lt;strong&gt;Environmental Impact:&lt;/strong&gt; Shipping megabytes of unnecessary JS across the
  1395. globe every second consumes massive amounts of energy. A &amp;ldquo;light&amp;rdquo; web is a
  1396. greener web.&lt;/li&gt;
  1397. &lt;li&gt;&lt;strong&gt;Accessibility:&lt;/strong&gt; Framework-heavy sites often fail the &amp;ldquo;low-end device&amp;rdquo; test,
  1398. effectively gatekeeping information from users who can&amp;rsquo;t afford the latest
  1399. iPhone.&lt;/li&gt;
  1400. &lt;/ul&gt;
  1401. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1402. &lt;p&gt;The next time you start a project, I challenge you to &lt;strong&gt;not&lt;/strong&gt; install a
  1403. framework. Try to see how far you can get with just HTML, CSS, and a sprinkle of
  1404. &lt;strong&gt;Vanilla JavaScript&lt;/strong&gt;. You&amp;rsquo;ll likely find that not only is it possible, but the
  1405. resulting site is faster, easier to maintain, and more satisfying to build.&lt;/p&gt;
  1406. &lt;p&gt;Learn the platform before you learn the abstraction. The framework you learn
  1407. today will be gone in five years, but the &lt;strong&gt;browser APIs&lt;/strong&gt; you learn today will
  1408. serve you for the rest of your career.&lt;/p&gt;
  1409. &lt;hr&gt;
  1410. &lt;p&gt;&lt;em&gt;As I argued in my comparison of static sites versus WordPress, I&amp;rsquo;ve broken down
  1411. why simple is often better for your next project&amp;rsquo;s architecture.&lt;/em&gt;&lt;/p&gt;
  1412. </content:encoded>
  1413. <dc:creator>Val Paliy</dc:creator>
  1414. </item>
  1415. <item>
  1416. <title>AI for Developers: A Practical Guide to Getting Started</title>
  1417. <link>https://valticus.pro/posts/ai-for-developers-a-practical-guide-to-getting-started/</link>
  1418. <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
  1419. <guid isPermaLink="true">https://valticus.pro/posts/ai-for-developers-a-practical-guide-to-getting-started/</guid>
  1420. <description>A hands-on guide to integrating AI tools and services into your development workflow, from code assistance to automated testing and intelligent debugging.</description>
  1421. <category>Web Development</category><content:encoded>&lt;h2 id="ai-has-entered-the-building"&gt;AI Has Entered the Building&lt;/h2&gt;
  1422. &lt;p&gt;In 2026, the question is no longer &amp;ldquo;Will AI change software development?&amp;rdquo; but
  1423. &amp;ldquo;How effectively are you using it?&amp;rdquo; AI tools have moved from experimental
  1424. novelties to indispensable force multipliers. However, the sheer volume of tools
  1425. — &lt;strong&gt;LLMs&lt;/strong&gt;, &lt;strong&gt;IDE extensions&lt;/strong&gt;, &lt;strong&gt;CLI wrappers&lt;/strong&gt;, and &lt;strong&gt;autonomous agents&lt;/strong&gt; —
  1426. has created a paradox of choice.&lt;/p&gt;
  1427. &lt;p&gt;This guide isn&amp;rsquo;t about the hype. It’s a pragmatic look at the current AI stack
  1428. for developers, how to build a workflow that actually saves time, and where the
  1429. &amp;ldquo;hidden costs&amp;rdquo; of AI adoption lie.&lt;/p&gt;
  1430. &lt;figure&gt;
  1431. &lt;div class="progressive-image"&gt;
  1432. &lt;img class="progressive-image__img"
  1433. src="https://valticus.pro/images/ai-for-developers-a-practical-guide-to-getting-started_hu_cc39ef3715a93792.webp"
  1434. alt="AI for Developers: A Practical Guide to Getting Started."
  1435. width="800"
  1436. height="436"&gt;
  1437. &lt;/div&gt;
  1438. &lt;figcaption&gt;&lt;p class="figure__caption"&gt;AI for Developers: A Practical Guide to Getting Started.&lt;/p&gt;&lt;/figcaption&gt;
  1439. &lt;/figure&gt;
  1440. &lt;h2 id="the-developers-ai-stack"&gt;The Developer&amp;rsquo;s AI Stack&lt;/h2&gt;
  1441. &lt;p&gt;To get started, you need to understand the three layers of the modern AI
  1442. developer stack: &lt;strong&gt;Models&lt;/strong&gt;, &lt;strong&gt;Interfaces&lt;/strong&gt;, and &lt;strong&gt;Context&lt;/strong&gt;.&lt;/p&gt;
  1443. &lt;h3 id="1-the-models-the-brains"&gt;1. The Models (The Brains)&lt;/h3&gt;
  1444. &lt;p&gt;Not all LLMs are created equal. Some excel at creative writing, while others are
  1445. fine-tuned for the rigid syntax of code.&lt;/p&gt;
  1446. &lt;table&gt;
  1447. &lt;thead&gt;
  1448. &lt;tr&gt;
  1449. &lt;th&gt;Model&lt;/th&gt;
  1450. &lt;th&gt;Strengths&lt;/th&gt;
  1451. &lt;th&gt;Best For&lt;/th&gt;
  1452. &lt;/tr&gt;
  1453. &lt;/thead&gt;
  1454. &lt;tbody&gt;
  1455. &lt;tr&gt;
  1456. &lt;td&gt;&lt;strong&gt;Claude 3.5 Sonnet&lt;/strong&gt;&lt;/td&gt;
  1457. &lt;td&gt;Exceptional reasoning, follows complex instructions&lt;/td&gt;
  1458. &lt;td&gt;Complex refactoring, architectural advice&lt;/td&gt;
  1459. &lt;/tr&gt;
  1460. &lt;tr&gt;
  1461. &lt;td&gt;&lt;strong&gt;GPT-4o&lt;/strong&gt;&lt;/td&gt;
  1462. &lt;td&gt;Fast, great at boilerplate and common patterns&lt;/td&gt;
  1463. &lt;td&gt;Day-to-day coding, unit tests&lt;/td&gt;
  1464. &lt;/tr&gt;
  1465. &lt;tr&gt;
  1466. &lt;td&gt;&lt;strong&gt;DeepSeek Coder&lt;/strong&gt;&lt;/td&gt;
  1467. &lt;td&gt;Open-weights, highly specialized for code&lt;/td&gt;
  1468. &lt;td&gt;Self-hosting, privacy-conscious tasks&lt;/td&gt;
  1469. &lt;/tr&gt;
  1470. &lt;tr&gt;
  1471. &lt;td&gt;&lt;strong&gt;Llama 3 (70B+)&lt;/strong&gt;&lt;/td&gt;
  1472. &lt;td&gt;Versatile, great general knowledge&lt;/td&gt;
  1473. &lt;td&gt;Documentation, explaining concepts&lt;/td&gt;
  1474. &lt;/tr&gt;
  1475. &lt;/tbody&gt;
  1476. &lt;/table&gt;
  1477. &lt;h3 id="2-the-interfaces-the-hands"&gt;2. The Interfaces (The Hands)&lt;/h3&gt;
  1478. &lt;p&gt;How you interact with these models determines your friction level.&lt;/p&gt;
  1479. &lt;ul&gt;
  1480. &lt;li&gt;&lt;strong&gt;AI-Native Editors (e.g., Cursor)&lt;/strong&gt;: These are forks of VS Code that have AI
  1481. baked into the core. They can &amp;ldquo;see&amp;rdquo; your entire codebase, not just the file
  1482. you&amp;rsquo;re working on.&lt;/li&gt;
  1483. &lt;li&gt;&lt;strong&gt;Extensions (e.g., GitHub Copilot, Codeium)&lt;/strong&gt;: Plugins for your existing
  1484. editor. Great for autocomplete but often lack the deep context of native
  1485. editors.&lt;/li&gt;
  1486. &lt;li&gt;&lt;strong&gt;CLI Tools (e.g., Aider, Gemini CLI)&lt;/strong&gt;: For those who live in the terminal.
  1487. These can perform multi-file edits and git commits directly from a prompt.&lt;/li&gt;
  1488. &lt;/ul&gt;
  1489. &lt;h3 id="3-the-context-the-memory"&gt;3. The Context (The Memory)&lt;/h3&gt;
  1490. &lt;p&gt;The secret sauce of AI productivity is &lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt;.
  1491. The more context you provide — your project structure, documentation, and coding
  1492. standards — the more accurate the AI becomes.&lt;/p&gt;
  1493. &lt;h2 id="prompt-engineering-the-new-syntax"&gt;Prompt Engineering: The New Syntax&lt;/h2&gt;
  1494. &lt;p&gt;Writing a prompt is like writing a specification. If your spec is vague, the
  1495. implementation will be buggy.&lt;/p&gt;
  1496. &lt;p&gt;&lt;strong&gt;Common Pitfall: The &amp;ldquo;One-Liner&amp;rdquo; Prompt&lt;/strong&gt; Don&amp;rsquo;t just ask: &lt;em&gt;&amp;ldquo;Write a React login
  1497. component.&amp;rdquo;&lt;/em&gt; You&amp;rsquo;ll get a generic, inaccessible component that uses libraries
  1498. you don&amp;rsquo;t want.&lt;/p&gt;
  1499. &lt;p&gt;&lt;strong&gt;The &amp;ldquo;Pro&amp;rdquo; Prompt Pattern:&lt;/strong&gt; Use the &lt;strong&gt;Role-Context-Task-Constraint&lt;/strong&gt;
  1500. framework:&lt;/p&gt;
  1501. &lt;ul&gt;
  1502. &lt;li&gt;&lt;strong&gt;Role&lt;/strong&gt;: &amp;ldquo;You are a senior React developer specializing in accessibility.&amp;rdquo;&lt;/li&gt;
  1503. &lt;li&gt;&lt;strong&gt;Context&lt;/strong&gt;: &amp;ldquo;We are using &lt;strong&gt;Tailwind CSS&lt;/strong&gt; and &lt;strong&gt;React Hook Form&lt;/strong&gt;.&amp;rdquo;&lt;/li&gt;
  1504. &lt;li&gt;&lt;strong&gt;Task&lt;/strong&gt;: &amp;ldquo;Create a login form with email and password fields.&amp;rdquo;&lt;/li&gt;
  1505. &lt;li&gt;&lt;strong&gt;Constraints&lt;/strong&gt;: &amp;ldquo;Must be WCAG 2.1 AA compliant, use semantic HTML, and
  1506. include client-side validation.&amp;rdquo;&lt;/li&gt;
  1507. &lt;/ul&gt;
  1508. &lt;p&gt;&lt;strong&gt;Pro Tip: Local LLMs for Privacy&lt;/strong&gt; If you&amp;rsquo;re working on sensitive or
  1509. proprietary code, use &lt;strong&gt;Ollama&lt;/strong&gt; or &lt;strong&gt;LM Studio&lt;/strong&gt;. You can run models like
  1510. DeepSeek Coder or Llama 3 entirely offline on your local machine (assuming you
  1511. have a decent GPU or Apple Silicon M-series chip). This ensures your code never
  1512. leaves your network.&lt;/p&gt;
  1513. &lt;h2 id="ai-native-vs-ai-augmented-workflows"&gt;AI-Native vs. AI-Augmented Workflows&lt;/h2&gt;
  1514. &lt;h3 id="the-augmented-workflow-reactive"&gt;The Augmented Workflow (Reactive)&lt;/h3&gt;
  1515. &lt;p&gt;You write code, and the AI suggests the next 10 lines. This is great for
  1516. boilerplate, but it can lead to &amp;ldquo;autopilot coding&amp;rdquo; where you accept suggestions
  1517. without fully understanding them.&lt;/p&gt;
  1518. &lt;h3 id="the-ai-native-workflow-proactive"&gt;The AI-Native Workflow (Proactive)&lt;/h3&gt;
  1519. &lt;p&gt;You describe the feature or the bug to the AI. The AI scans your files, proposes
  1520. a multi-file change, and you &lt;strong&gt;review&lt;/strong&gt; and &lt;strong&gt;test&lt;/strong&gt; the output. This shifts
  1521. your role from &amp;ldquo;Typewriter&amp;rdquo; to &amp;ldquo;Editor.&amp;rdquo;&lt;/p&gt;
  1522. &lt;h3 id="example-refactoring-technical-debt"&gt;Example: Refactoring Technical Debt&lt;/h3&gt;
  1523. &lt;p&gt;AI is surprisingly good at &amp;ldquo;un-spaghettifying&amp;rdquo; code. &lt;em&gt;Prompt:&lt;/em&gt; &amp;ldquo;Analyze this
  1524. 500-line function. Identify three ways to break it into smaller, testable
  1525. modules following the &lt;strong&gt;Single Responsibility Principle&lt;/strong&gt;. Provide the
  1526. refactored code and unit tests for each new module.&amp;rdquo;&lt;/p&gt;
  1527. &lt;h2 id="the-junior-developer-trap"&gt;The &amp;ldquo;Junior Developer&amp;rdquo; Trap&lt;/h2&gt;
  1528. &lt;p&gt;There is a significant danger for developers starting their careers today:
  1529. over-reliance. If you use AI to solve every problem before you understand the
  1530. underlying concepts, you&amp;rsquo;re building your career on a foundation of sand.&lt;/p&gt;
  1531. &lt;p&gt;AI often hallucinates or provides outdated solutions. For instance, in my
  1532. &amp;ldquo;Accessibility Is Still Broken&amp;rdquo; post, I discuss how automated tools (including
  1533. AI) often fail to understand the nuance of focus management and screen reader
  1534. context.&lt;/p&gt;
  1535. &lt;h2 id="security-privacy-and-intellectual-property"&gt;Security, Privacy, and Intellectual Property&lt;/h2&gt;
  1536. &lt;p&gt;Before you paste your company&amp;rsquo;s API secrets into a web chat, remember:&lt;/p&gt;
  1537. &lt;ul&gt;
  1538. &lt;li&gt;&lt;strong&gt;Data Leakage&lt;/strong&gt;: Most consumer-grade AI tools use your inputs to train future
  1539. models unless you opt-out or use Enterprise versions.&lt;/li&gt;
  1540. &lt;li&gt;&lt;strong&gt;Vulnerabilities&lt;/strong&gt;: AI can (and does) suggest code with known security flaws.
  1541. Always run a &lt;strong&gt;SAST (Static Application Security Testing)&lt;/strong&gt; tool like &lt;strong&gt;Snyk&lt;/strong&gt;
  1542. or &lt;strong&gt;SonarQube&lt;/strong&gt; on AI-generated code.&lt;/li&gt;
  1543. &lt;li&gt;&lt;strong&gt;Licensing&lt;/strong&gt;: The legal landscape around AI-generated code is still evolving.
  1544. Ensure your company&amp;rsquo;s policy allows for AI usage and understand that you are
  1545. ultimately responsible for the code you commit.&lt;/li&gt;
  1546. &lt;/ul&gt;
  1547. &lt;h2 id="realistic-productivity-gains"&gt;Realistic Productivity Gains&lt;/h2&gt;
  1548. &lt;p&gt;Don&amp;rsquo;t believe the &amp;ldquo;10x developer&amp;rdquo; marketing. Here’s what you can actually
  1549. expect:&lt;/p&gt;
  1550. &lt;ul&gt;
  1551. &lt;li&gt;&lt;strong&gt;Boilerplate&lt;/strong&gt;: 80% time reduction (&lt;strong&gt;CRUD&lt;/strong&gt;, &lt;strong&gt;DTOs&lt;/strong&gt;, Unit tests).&lt;/li&gt;
  1552. &lt;li&gt;&lt;strong&gt;Learning New Tech&lt;/strong&gt;: 50% faster (explaining syntax, generating hello-world
  1553. examples).&lt;/li&gt;
  1554. &lt;li&gt;&lt;strong&gt;Debugging&lt;/strong&gt;: 30% faster (summarizing logs, identifying common errors).&lt;/li&gt;
  1555. &lt;li&gt;&lt;strong&gt;Architecture&lt;/strong&gt;: 10% gain (mostly as a sounding board).&lt;/li&gt;
  1556. &lt;/ul&gt;
  1557. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1558. &lt;p&gt;AI for developers isn&amp;rsquo;t about replacing the act of thinking; it&amp;rsquo;s about removing
  1559. the friction of execution. The goal is to spend less time fighting with syntax
  1560. and more time solving business problems.&lt;/p&gt;
  1561. &lt;p&gt;Start by picking an AI-native editor like &lt;strong&gt;Cursor&lt;/strong&gt;, learn the art of the
  1562. multi-file prompt, and always — &lt;strong&gt;always&lt;/strong&gt; — remain the final authority on the
  1563. code you ship. The best developers in 2026 aren&amp;rsquo;t the ones who type the fastest;
  1564. they&amp;rsquo;re the ones who can most effectively orchestrate the AI tools at their
  1565. disposal.&lt;/p&gt;
  1566. </content:encoded>
  1567. <dc:creator>Val Paliy</dc:creator>
  1568. </item>
  1569. </channel>
  1570. </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