<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jhonathan Reis</title>
    <description>The latest articles on DEV Community by Jhonathan Reis (@jonathanreis).</description>
    <link>https://dev.to/jonathanreis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1988820%2F8ec292b6-6a6d-4100-a1be-b69ff202236d.jpg</url>
      <title>DEV Community: Jhonathan Reis</title>
      <link>https://dev.to/jonathanreis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jonathanreis"/>
    <language>en</language>
    <item>
      <title>What's the most annoying 'small' interactive feature you've had to add to a server-rendered page?</title>
      <dc:creator>Jhonathan Reis</dc:creator>
      <pubDate>Wed, 28 Oct 2026 15:32:20 +0000</pubDate>
      <link>https://dev.to/jonathanreis/whats-the-most-annoying-small-interactive-feature-youve-had-to-add-to-a-server-rendered-page-4lh5</link>
      <guid>https://dev.to/jonathanreis/whats-the-most-annoying-small-interactive-feature-youve-had-to-add-to-a-server-rendered-page-4lh5</guid>
      <description>&lt;p&gt;Every server-rendered app eventually gets a ticket like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Small UI tweak.&lt;/strong&gt; When the user checks "Same as billing address", hide the shipping fields. Should be quick!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The page is HTML from the server. It works. It has worked since before some of your coworkers were born. And now it needs to do &lt;em&gt;one small thing&lt;/em&gt; in the browser.&lt;/p&gt;

&lt;p&gt;Then you discover that "one small thing" also needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remember its state when validation fails and the server re-renders the form,&lt;/li&gt;
&lt;li&gt;not break the old jQuery plugin on the same page,&lt;/li&gt;
&lt;li&gt;still work when the user presses Back,&lt;/li&gt;
&lt;li&gt;be accessible,&lt;/li&gt;
&lt;li&gt;and somehow not need a build step, because this part of the app has never had one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I'm curious: &lt;strong&gt;what's the most annoying "small" interactive feature you've had to add to a server-rendered page?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My nominees
&lt;/h2&gt;

&lt;p&gt;To get things started, here are a few I think deserve an award:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 The "Same as billing address" checkbox.&lt;/strong&gt; Hide fields, copy values, un-copy values when they uncheck it, and remember all of it after a failed submit. Small, they said.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 The character counter.&lt;/strong&gt; "142 / 280". Easy, until emoji count as two characters, the server counts differently than the browser, and someone pastes a whole novel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 Dependent dropdowns.&lt;/strong&gt; Pick a country, then the region list changes. Pick a region, then the city list changes. Now edit an existing record and make all three load correctly in the right order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 "Select all" on a paginated table.&lt;/strong&gt; Does "all" mean this page or every page? Nobody knows, including the person who wrote the ticket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 The live search filter.&lt;/strong&gt; Type, the list narrows. Then: debounce it, highlight matches, show "no results", and keep the filter in the URL so people can share it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 "Are you sure you want to leave? You have unsaved changes."&lt;/strong&gt; The one feature everyone wants until it shows up after they've just saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  My own entry
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Tell me yours
&lt;/h2&gt;

&lt;p&gt;I'd love to hear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What was the feature?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What made it harder than it looked?&lt;/strong&gt; The state? The old code around it? The browser's Back button?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What did you end up using?&lt;/strong&gt; Vanilla JS, jQuery, a small library, a framework, or "a 400-line file named &lt;code&gt;utils2.js&lt;/code&gt; that nobody touches"?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bonus points for the worst ticket title you've ever received.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>My learning project became a JavaScript framework: Brio.js v5</title>
      <dc:creator>Jhonathan Reis</dc:creator>
      <pubDate>Wed, 28 Oct 2026 15:24:08 +0000</pubDate>
      <link>https://dev.to/briojs/my-learning-project-became-a-javascript-framework-briojs-v5-3l6e</link>
      <guid>https://dev.to/briojs/my-learning-project-became-a-javascript-framework-briojs-v5-3l6e</guid>
      <description>&lt;p&gt;On February 12, 2024, I committed a file with the message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A not so good scope architecture&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Five days later, the next commit said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;New scoping system&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the most honest summary of how Brio.js was built. I wrote something, I learned why it was wrong, and I wrote it again. I did that a lot, for fun and to learn how the frameworks I used every day actually work.&lt;/p&gt;

&lt;p&gt;At some point the "learning project" quietly started running in one small production project of mine. Then it got tests. Then docs. Then a playground, a starter CLI, and a website with a small creature on it (we'll get to the creature).&lt;/p&gt;

&lt;p&gt;This week I released &lt;strong&gt;Brio.js v5&lt;/strong&gt; and made the whole thing public. This post is the "hello, here's what I've been doing in my free time" post.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Brio is
&lt;/h2&gt;

&lt;p&gt;Brio adds reactivity to HTML with &lt;code&gt;b-*&lt;/code&gt; attributes. It works on the real DOM, in place. No virtual DOM, no JSX, no required compiler, and no runtime dependencies.&lt;/p&gt;

&lt;p&gt;Here's the smallest useful Brio app. You can save it as a file and open it from any static server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"counter"&lt;/span&gt; &lt;span class="na"&gt;b-cloak&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;b-on-click=&lt;/span&gt;&lt;span class="s"&gt;"$data.count++"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Count: &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;b-text=&lt;/span&gt;&lt;span class="s"&gt;"$data.count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/@jnreis/briojs@5.1.1/dist/brio.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;brio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Add &lt;code&gt;&amp;lt;style&amp;gt;[b-cloak] { display: none; }&amp;lt;/style&amp;gt;&lt;/code&gt; so the button doesn't flash before Brio starts.)&lt;/p&gt;

&lt;p&gt;That's it: one script tag, one &lt;code&gt;mount&lt;/code&gt;, and a button that counts. If you want a build setup instead, &lt;code&gt;npm create brio@latest&lt;/code&gt; gives you a starter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the creature
&lt;/h2&gt;

&lt;p&gt;Every framework website needs a demo. Most use a todo list. I made a small creature with feelings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz5denamlbij4uihftdst.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz5denamlbij4uihftdst.webp" alt="A creature changes from happy blue Blip to sleepy purple Bean to mischievous pink Mochi as its controls change." width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You pick a mood, a color, a size, and a name, and the creature updates as you go. There's also a 🎲 &lt;strong&gt;Surprise me&lt;/strong&gt; button, because it's fun.&lt;/p&gt;

&lt;p&gt;Here's a trimmed version of the real markup from the homepage. The horns only exist while it's being mischievous:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"img"&lt;/span&gt; &lt;span class="na"&gt;b-bind-aria-label=&lt;/span&gt;&lt;span class="s"&gt;"$data.greeting"&lt;/span&gt;
  &lt;span class="na"&gt;b-bind-class=&lt;/span&gt;&lt;span class="s"&gt;"['creature', 'is-' + $data.mood]"&lt;/span&gt;
  &lt;span class="na"&gt;b-bind-style=&lt;/span&gt;&lt;span class="s"&gt;"{ '--body': $data.color, '--size': $data.size / 100 }"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"creature-zzz"&lt;/span&gt; &lt;span class="na"&gt;b-if=&lt;/span&gt;&lt;span class="s"&gt;"$data.mood === 'sleepy'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;z z z&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"creature-horns"&lt;/span&gt; &lt;span class="na"&gt;b-if=&lt;/span&gt;&lt;span class="s"&gt;"$data.mood === 'mischievous'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"creature-eyes"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"radio"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"mood"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"sleepy"&lt;/span&gt; &lt;span class="na"&gt;b-model=&lt;/span&gt;&lt;span class="s"&gt;"$data.mood"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; 😴 Sleepy&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"range"&lt;/span&gt; &lt;span class="na"&gt;min=&lt;/span&gt;&lt;span class="s"&gt;"70"&lt;/span&gt; &lt;span class="na"&gt;max=&lt;/span&gt;&lt;span class="s"&gt;"130"&lt;/span&gt; &lt;span class="na"&gt;b-model.number=&lt;/span&gt;&lt;span class="s"&gt;"$data.size"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the greeting is just a getter on the state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This creature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mood&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sleepy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; needs a nap.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mood&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mischievous&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is up to something.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is having a great day.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The best part: the &lt;a href="https://briojs.com/play/" rel="noopener noreferrer"&gt;playground&lt;/a&gt; opens with this exact creature. You can edit its HTML, CSS, and JavaScript and see the changes right away. Give it a fourth mood. Give it a hat. I won't stop you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things I'm excited about
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Every value says where it came from
&lt;/h3&gt;

&lt;p&gt;In Brio templates you write &lt;code&gt;$data.count&lt;/code&gt;, &lt;code&gt;$props.label&lt;/code&gt;, or &lt;code&gt;$for.item&lt;/code&gt;. Not &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;label&lt;/code&gt;, or &lt;code&gt;item&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Yes, it's a little more typing. I went back and forth on this for a long time. It became a deliberate breaking change in 4.0, because once lists and components were nested inside each other, "where does &lt;code&gt;item&lt;/code&gt; come from?" stopped being a fun puzzle. Now you can read any expression and know which drawer to open. (There's a whole post coming on this decision.)&lt;/p&gt;

&lt;h3&gt;
  
  
  2. It only owns what you mount
&lt;/h3&gt;

&lt;p&gt;You can mount Brio around one form in a Rails view, one menu in a WordPress theme, or one calculator in an old PHP page. It doesn't care what's around it, and it won't touch anything outside the element you gave it. When the widget is removed, it cleans up after itself.&lt;/p&gt;

&lt;p&gt;That's the use case Brio was born from, and the one I care about most: adding interactivity to pages that already exist, without asking the rest of the page to change.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. It grows with you
&lt;/h3&gt;

&lt;p&gt;It starts with a single counter, but it doesn't stop there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Five starters&lt;/strong&gt; from &lt;code&gt;npm create brio&lt;/code&gt;: widget, multi-page, SPA, Astro islands, and plugin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional add-ons&lt;/strong&gt; for routing, HTTP, persistence, extra inputs, and observers. You load only what you use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A public plugin API&lt;/strong&gt; for your own directives and helpers. I moved some of Brio's own features out of the core into add-ons built on that same API, partly to prove it works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parts:&lt;/strong&gt; copy-paste dialog, disclosure, menu, and tabs components you own and can change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ten example apps&lt;/strong&gt;, from a counter to a TodoMVC, a 1,000-row table, a Kanban board, and a collaborative editor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration guides&lt;/strong&gt; for Rails, Laravel, Django, WordPress, and plain HTML with Express.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are 36 directives in total, and 1,258 tests that are much stricter with me than I am with myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's not good at (yet)
&lt;/h2&gt;

&lt;p&gt;I'd rather you hear this from me than find out an hour into trying it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strict CSP needs a separate build.&lt;/strong&gt; The standard build uses &lt;code&gt;new Function&lt;/code&gt;, which a policy that forbids &lt;code&gt;unsafe-eval&lt;/code&gt; blocks. Since 5.1 there's a CSP build (&lt;code&gt;@jnreis/briojs/csp&lt;/code&gt;) that runs without &lt;code&gt;eval&lt;/code&gt;. It hydrates only components defined in JavaScript, so plain page markup stays inert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-side rendering.&lt;/strong&gt; Brio enhances HTML your server (or Astro) already rendered. It doesn't render on the server itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old browsers.&lt;/strong&gt; It targets modern evergreen browsers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's young, and it's one person.&lt;/strong&gt; I'm the only maintainer. The ecosystem is the docs, the examples, and whatever you and I build next. If you need a big community and long-term guarantees today, that's a fair reason to wait.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why share it now?
&lt;/h2&gt;

&lt;p&gt;Because I've reached the point where I can't see its flaws anymore. I know where everything is, so everything feels obvious. That's exactly when you need people who don't know where everything is.&lt;/p&gt;

&lt;p&gt;So here's my ask, and it's a small one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://briojs.com/play/" rel="noopener noreferrer"&gt;playground&lt;/a&gt;, break the creature, and tell me what confused you.&lt;/li&gt;
&lt;li&gt;Answer this in the comments: &lt;strong&gt;if you had to add interactivity to one part of a page you already have, what would it be?&lt;/strong&gt; A filter? A form that shows and hides fields? Something weirder?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every answer helps me decide what to write about and build next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://briojs.com/" rel="noopener noreferrer"&gt;briojs.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://briojs.com/play/" rel="noopener noreferrer"&gt;briojs.com/play&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/jnreis/briojs" rel="noopener noreferrer"&gt;github.com/jnreis/briojs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discussions: &lt;a href="https://github.com/jnreis/briojs/discussions/5" rel="noopener noreferrer"&gt;Say hi or ask anything&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading. Bean says hi. Bean is also asleep.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Unlock Your Developer Potential: How to Apply Atomic Habits to Your Software Development Journey</title>
      <dc:creator>Jhonathan Reis</dc:creator>
      <pubDate>Fri, 06 Sep 2024 15:47:03 +0000</pubDate>
      <link>https://dev.to/jonathanreis/unlocking-developer-potential-applying-atomic-habits-to-software-development-17g2</link>
      <guid>https://dev.to/jonathanreis/unlocking-developer-potential-applying-atomic-habits-to-software-development-17g2</guid>
      <description>&lt;p&gt;As software developers, we're constantly navigating a landscape of evolving technologies, complex problems, and tight deadlines. In this high-pressure environment, it's easy to lose sight of our long-term growth. Recently, I discovered a powerful framework for personal development in James Clear's book, "Atomic Habits." While not specifically aimed at developers, its principles offer a transformative approach to enhancing our skills, productivity, and overall effectiveness as software professionals.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore how to apply these concepts to our daily work, turning small, consistent actions into significant improvements in our coding practices and career trajectories. Whether you're a seasoned developer or just starting your journey, these strategies can help you unlock your full potential and navigate the ever-changing world of software development with confidence and purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Power of Incremental Improvements
&lt;/h3&gt;

&lt;p&gt;Clear's central thesis is that tiny, consistent changes can lead to remarkable results over time. This concept aligns perfectly with the iterative nature of software development. Here's how we can apply it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Daily Code Refactoring&lt;/strong&gt;: Dedicate 15 minutes each day to improving a small section of your codebase. This could involve optimizing an algorithm, breaking down a complex function, or improving variable names for clarity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuous Learning&lt;/strong&gt;: Commit to learning one new feature, method, or best practice in your primary programming language or framework each week. Over a year, that's 52 new tools in your developer toolkit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation Habit&lt;/strong&gt;: End each coding session by writing or updating documentation for the code you've just written. This not only helps your future self but also improves team collaboration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Version Control Mastery&lt;/strong&gt;: Practice using advanced Git features daily, such as interactive rebasing or creating focused, atomic commits.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By consistently applying these small improvements, you'll see a compound effect on your code quality and professional growth over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Focus on Systems, Not Just Goals
&lt;/h3&gt;

&lt;p&gt;While setting goals is important, Clear argues that the real power lies in creating systems that lead to consistent progress. In software development, this translates to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Robust Code Review Process&lt;/strong&gt;: Implement a structured code review system where team members regularly review each other's code. This could involve pair programming sessions, asynchronous reviews, or dedicated code review meetings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comprehensive Coding Standards&lt;/strong&gt;: Develop and regularly update a set of coding standards that cover not just syntax preferences, but also architectural principles, performance considerations, and security best practices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Quality Checks&lt;/strong&gt;: Set up a suite of automated tools that run on every commit or pull request. This could include linters, static code analyzers, test coverage reports, and performance benchmarks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuous Integration/Continuous Deployment (CI/CD)&lt;/strong&gt;: Implement a robust CI/CD pipeline that automates testing, integration, and deployment processes, ensuring that every change is thoroughly vetted before reaching production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regular Retrospectives&lt;/strong&gt;: Schedule periodic team retrospectives to reflect on processes, identify areas for improvement, and celebrate successes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By focusing on these systems, you create an environment that naturally fosters high-quality code and continuous improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design Your Development Environment
&lt;/h3&gt;

&lt;p&gt;Clear emphasizes the significant impact our environment has on our habits. For developers, optimizing our workspace can lead to dramatic improvements in focus, productivity, and job satisfaction:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customized IDE Setup&lt;/strong&gt;: Invest time in configuring your integrated development environment. This includes setting up syntax highlighting, code completion, and shortcuts that match your workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ergonomic Workspace&lt;/strong&gt;: Create a comfortable physical environment with proper lighting, an ergonomic chair, and potentially a standing desk option to promote better health and focus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distraction Management&lt;/strong&gt;: Use tools like website blockers during focused coding sessions, and consider noise-cancelling headphones if you work in a noisy environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Knowledge Management System&lt;/strong&gt;: Implement a personal system for organizing code snippets, useful articles, and learning resources. Tools like Notion, Evernote, or even a well-organized GitHub repository can serve this purpose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Productivity Toolkit&lt;/strong&gt;: Curate a set of tools that enhance your workflow. This might include time management apps, project management software, or communication tools that integrate well with your development process.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By thoughtfully designing your environment, you create a space that naturally encourages productive coding habits and minimizes barriers to deep work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Habit Stacking for Success
&lt;/h3&gt;

&lt;p&gt;Habit stacking is a powerful technique where you attach a new habit to an existing one. Here's how developers can leverage this concept:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Review After Stand-up&lt;/strong&gt;: Make it a habit to review a colleague's pull request immediately after your daily stand-up meeting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learning with Lunch&lt;/strong&gt;: Use your lunch break to watch a coding tutorial or read a technical article while eating.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refactoring Before Committing&lt;/strong&gt;: Before committing any new code, take a few minutes to refactor and improve the clarity of what you've just written.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing After Feature Completion&lt;/strong&gt;: Whenever you complete a new feature, immediately write or update the corresponding unit tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation with Deployment&lt;/strong&gt;: After deploying a new feature or fix, update the project documentation to reflect the changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By linking new, beneficial habits to existing parts of your routine, you can more easily integrate continuous improvement into your daily workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Embrace Immediate Feedback
&lt;/h3&gt;

&lt;p&gt;Clear emphasizes the importance of immediate feedback for habit formation. In software development, we can apply this principle through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time Linting&lt;/strong&gt;: Configure your IDE to provide instant feedback on code quality, style violations, and potential bugs as you type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuous Integration Feedback&lt;/strong&gt;: Set up your CI pipeline to provide quick feedback on every commit, including test results, code coverage, and performance metrics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Peer Programming Sessions&lt;/strong&gt;: Engage in regular pair programming to get immediate feedback on your code and problem-solving approaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Testing&lt;/strong&gt;: Implement features that allow for quick user feedback, such as A/B testing or beta user groups, to gauge the real-world impact of your code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance Monitoring&lt;/strong&gt;: Use application performance monitoring (APM) tools to get immediate insights into how your code changes affect system performance in production.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By creating these feedback loops, you accelerate your learning process and can quickly adjust your coding practices for better outcomes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cultivating a Developer Identity
&lt;/h3&gt;

&lt;p&gt;One of Clear's most powerful concepts is the idea of identity-based habits. As developers, we can leverage this by focusing on who we want to become, rather than just what we want to achieve. This shift in mindset can lead to more sustainable and meaningful growth.&lt;/p&gt;

&lt;p&gt;Consider these identity statements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I am a developer who prioritizes code readability and maintainability."&lt;/li&gt;
&lt;li&gt;"I am a continuous learner, always exploring new technologies and best practices."&lt;/li&gt;
&lt;li&gt;"I am a collaborative team member who values clear communication and knowledge sharing."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By internalizing these identities, we naturally align our actions with our aspirations. For instance, if you see yourself as someone who prioritizes code readability, you're more likely to invest time in refactoring and documenting your code, even when faced with tight deadlines.&lt;/p&gt;

&lt;p&gt;This approach also helps in overcoming imposter syndrome, a common challenge in our field. By focusing on your identity as a capable and growing developer, you can build confidence and resilience in your professional journey.&lt;/p&gt;

&lt;p&gt;Remember, becoming the developer you aspire to be is a gradual process. Embrace small, consistent actions that reinforce your chosen identity, and watch as they compound into significant personal and professional growth over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion: Your Journey to Developer Excellence
&lt;/h3&gt;

&lt;p&gt;As we've explored, the principles from "Atomic Habits" offer a powerful framework for continuous improvement in our software development practices. By focusing on incremental changes, building robust systems, optimizing our environment, stacking habits, embracing feedback, and cultivating a strong developer identity, we can transform our coding skills and career trajectory.&lt;/p&gt;

&lt;p&gt;Remember, the key is consistency. It's not about making drastic changes overnight, but rather about implementing small, sustainable improvements that compound over time. Start by choosing one or two areas from this article to focus on, and gradually build your own system of atomic habits for software development.&lt;/p&gt;

&lt;p&gt;As you embark on this journey, be patient with yourself and celebrate the small wins along the way. Every refactored function, every new concept learned, and every improved process is a step towards becoming the developer you aspire to be.&lt;/p&gt;

&lt;p&gt;I encourage you to share your experiences and insights as you apply these principles. What atomic habits have you found most impactful in your development work? How has focusing on small, consistent improvements changed your approach to coding? Let's continue this conversation and support each other in our pursuit of developer excellence.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>ci</category>
      <category>productivity</category>
      <category>atomichabits</category>
    </item>
  </channel>
</rss>
