<?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>Forem: Manuel Artero Anguita 🟨</title>
    <description>The latest articles on Forem by Manuel Artero Anguita 🟨 (@manuartero).</description>
    <link>https://forem.com/manuartero</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F796842%2Fe80f5240-e254-4324-87db-af07526d6428.jpeg</url>
      <title>Forem: Manuel Artero Anguita 🟨</title>
      <link>https://forem.com/manuartero</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/manuartero"/>
    <language>en</language>
    <item>
      <title>You're not falling behind - «Tend and Befriend» Theory</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Fri, 20 Feb 2026 15:06:35 +0000</pubDate>
      <link>https://forem.com/manuartero/youre-not-falling-behind-theory-3mnc</link>
      <guid>https://forem.com/manuartero/youre-not-falling-behind-theory-3mnc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Breathe.&lt;/p&gt;

&lt;p&gt;Just breathe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, my bookmarks in the AI folder keep growing. Actually, the first ones can be removed? not because I've read them, but cause they're already deprecated.&lt;/p&gt;

&lt;p&gt;From the "two weeks ago" ancient past.&lt;/p&gt;




&lt;p&gt;I'm a developer.&lt;/p&gt;

&lt;p&gt;Nowadays I'm attending meetings with a clear message:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We KNOW we're falling behind. You guys shouldn't be typing code by hand anymore. Product teams shouldn't be working use cases the way they used to. QA should be automating... something. no wait! Everything!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We do know we need to change something. We're still deciding what... and how.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And that is ok.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm not in denial of the change. Let's do it.&lt;/p&gt;

&lt;p&gt;Just, remember: there's big money in making you feel this way. You, your boss, their boss, the CTO, and the CEO. And they're human. (Yes, CEOs are humans too.) They are not immune to the &lt;em&gt;psychic attack&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There's big money in play, and big money is rolling a serious amount of psy damage (and not over one individual dev, this is an area attack).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmei1et552xvuhd7p3kqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmei1et552xvuhd7p3kqj.png" alt="10d10 Psychic Damage — hits all party members" width="800" height="797"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They're human and they KNOW they need to move fast. The opportunity window!!! If the org doesn't catch the wave, someone else will!!!! Someone else gets that 10x productivity boost!!!!!!!&lt;/p&gt;

&lt;p&gt;...And those?&lt;/p&gt;

&lt;p&gt;Yep. They are feeling the same. You get it.&lt;/p&gt;

&lt;p&gt;The thing is... &lt;strong&gt;nobody knows shit&lt;/strong&gt;. That guy on Tech Twitter claiming they're already ahead? Well... I honestly don't know. Maybe? But I've been in tech enough to know that the loudest voice in the room is rarely the one who figured it out. &lt;/p&gt;

&lt;p&gt;And most of them, they're running alone. Let's see how far that takes them.&lt;/p&gt;




&lt;p&gt;The &lt;strong&gt;pressure&lt;/strong&gt; is real. I'm not going to pretend it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  what does pressure do to us, &lt;strong&gt;humans&lt;/strong&gt;?
&lt;/h2&gt;

&lt;p&gt;Let's go anthropologist here for a second, shall we?&lt;/p&gt;

&lt;p&gt;There's a term interesting for this: &lt;strong&gt;&lt;a href="https://taylorlab.psych.ucla.edu/wp-content/uploads/sites/5/2014/11/2011_Tend-and-Befriend-Theory.pdf" rel="noopener noreferrer"&gt;tend and befriend&lt;/a&gt;&lt;/strong&gt;. &lt;a href="https://en.wikipedia.org/wiki/Shelley_E._Taylor#Tend_and_befriend_model" rel="noopener noreferrer"&gt;Shelley Taylor&lt;/a&gt;, researcher, coined it in the 00's. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44h5kidax8vve58jr1lu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44h5kidax8vve58jr1lu.png" alt="Shelley Taylor" width="800" height="1120"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Shelley Taylor, distinguished research professor of psychology in the UCLA College.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Her team found that under stress, our bodies don't just go fight-or-flight. We release &lt;em&gt;oxytocin&lt;/em&gt; (an hormone) that literally pushes us to seek the group, to protect, to bond. &lt;/p&gt;

&lt;p&gt;To be specific, her research actually found that this response is stronger in women (while men might default more to fight-or-flight) alone.&lt;/p&gt;

&lt;p&gt;This post is not a feel-good quote. It's about biochemistry.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The body, under pressure, is screaming at you: &lt;em&gt;don't run alone.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This hormone isn't restricted to women, so:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group up. Protect the one next to you. Share what you know. This isnt idealism, that's how we made this far as humans.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Greek hoplites. Roman Legions. &lt;a href="https://en.wikipedia.org/wiki/Tercio" rel="noopener noreferrer"&gt;Spanish Tercio&lt;/a&gt;. they didn't win battles by being the fastest runners. They won by lifting their shield to cover the soldier next to them.&lt;/p&gt;

&lt;p&gt;You protect me, I protect you. We move together, or we don't move at all.&lt;/p&gt;

&lt;p&gt;Right now, the AI hype machine is rewarding lone wolves. The hot takes. The &lt;em&gt;"I replaced my whole team"&lt;/em&gt; crowd. &lt;/p&gt;

&lt;p&gt;Well, I'm not entering your game. Im not going to make it with a better prompt. &lt;strong&gt;My bet is on the Phalanx&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yafugvhu9sa5yk10mqh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yafugvhu9sa5yk10mqh.png" alt="Hoplite rising his shield" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before you doom-scroll another "&lt;em&gt;you're falling behind&lt;/em&gt;",&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Breathe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're not falling behind. You're human. And humans don't survive by running alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAISE YOUR SHIELD SOLDIER&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We'll figure this out. As a pack.&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
thanks for reading.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>career</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>"loading..." vs. "thinking..."</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Fri, 20 Feb 2026 08:34:50 +0000</pubDate>
      <link>https://forem.com/manuartero/loading-vs-thinking-56i0</link>
      <guid>https://forem.com/manuartero/loading-vs-thinking-56i0</guid>
      <description>&lt;p&gt;&lt;strong&gt;loading..."&lt;/strong&gt; -&amp;gt; Boring, Classic server, Outdated.  &lt;/p&gt;

&lt;p&gt;vs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"thinking..."&lt;/strong&gt; -&amp;gt; AI-Powered, 12 agents, 40M investment, Orchestrated System with Collaborative Agents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip6uptyj5zu2m8nuyj21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fip6uptyj5zu2m8nuyj21.png" alt="bored guys meme" width="500" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Let's talk about grief.</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Mon, 16 Feb 2026 09:24:33 +0000</pubDate>
      <link>https://forem.com/manuartero/lets-talk-about-grief-325h</link>
      <guid>https://forem.com/manuartero/lets-talk-about-grief-325h</guid>
      <description>&lt;p&gt;&lt;em&gt;Let's talk about grief.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Grieving isn't restricted to a relative passing away. We also mourn the death of ideas, expectations, ideals and dreams. We grieve for the future. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;The death of what we were expecting.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm no stranger to this. I've been mourning for years a particular future that is not to come. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslatvzli8rmv8rqnmuth.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslatvzli8rmv8rqnmuth.jpg" alt="Im kind of an expert myself meme" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No need to enter into details, but I've gone through every single step for years and I've learnt a little bit about &lt;em&gt;loss&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;We, programmers, software engineers, coders (whichever name you like) are entering (or perhaps have been for a while?) a grieving process.&lt;/p&gt;

&lt;p&gt;Some might have lost an &lt;em&gt;identity mark&lt;/em&gt;, others may be afraid of the future to come, and others might be crying for a golden, glorious &lt;em&gt;"used to be"&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;I think there won't be two people sharing the exact dead ideal, but we all share the same context.&lt;/p&gt;

&lt;p&gt;There are steps. If you want, it's like a state machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S0 → S1 → S2 → S3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And.... again to S0 (yep, it's a cycle... well, it would be better to say a &lt;em&gt;spiral&lt;/em&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S0 → S1 → S2 → S3 → S4 → S0 → S1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But here's the thing: every time you close a loop, there is a minor change, a progress.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;S0 → S1 → S2 → S3 → S0' → S1' → S2' → S3' → S0''...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The end of this spiral is a final state. It's called &lt;code&gt;Acceptance&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Depending on how deep your loss sits in your heart, it's possible to "touch" that final state, &lt;code&gt;Acceptance&lt;/code&gt;, and then fall back to another state of the spiral.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;this is normal, and it's part of the healing process.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;GrievingSteps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;Denial&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// S0&lt;/span&gt;
  &lt;span class="nc"&gt;Anger&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// S1&lt;/span&gt;
  &lt;span class="nc"&gt;Bargaining&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// S2 &lt;/span&gt;
  &lt;span class="nc"&gt;Depression&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// S3&lt;/span&gt;
  &lt;span class="nc"&gt;Acceptance&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// S4&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Denial:&lt;/strong&gt; AI could never replace me. Im special, I'm the smartes guy in the room there will be always room for the human spark, i will be needed. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anger:&lt;/strong&gt; I reject AI. I reject anything created , the human touch is needed. Everything will collapse if they keep replacing human work with AI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bargaining:&lt;/strong&gt; I need to adapt, i won't type code but im vital for reviewing the diffs, if ever, my work and my mind is more needed than anytime. Im needed&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Depression:&lt;/strong&gt; whatever, the world is to end. If AI take every single work outthere anything is meaningless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance:&lt;/strong&gt; I have no analogy here. I haven't reached this state yet. I've been cycling myself through &lt;code&gt;S0 → S3&lt;/code&gt; for a while now. &lt;/p&gt;




&lt;h2&gt;
  
  
  The spiral gets smaller
&lt;/h2&gt;

&lt;p&gt;The first loop hits hard. Denial might last weeks. Anger. Depression was... well, depression. But the second time around? I recognized the states. I could almost see the transitions happening in real time. &lt;em&gt;"Oh, I'm in S1 again. Cool. I know where this goes."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It still hurts.&lt;/p&gt;

&lt;p&gt;But there's a difference between walking a path for the first time and walking it again knowing where the edges are. The duration of each state gets smaller.&lt;/p&gt;

&lt;p&gt;You don't stop cycling; you just cycle faster, and with less damage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;loop_duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;loop_duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the quiet progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now
&lt;/h2&gt;

&lt;p&gt;So, if you're somewhere in the spiral right now: &lt;em&gt;welcome&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;You're not broken. You're processing. &lt;/p&gt;

&lt;p&gt;And if you're able to see which state you're in, you're already ahead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftg5em6aokqnsxwyighqe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftg5em6aokqnsxwyighqe.jpg" alt="stoic small human" width="784" height="1168"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I haven't reached &lt;code&gt;Acceptance&lt;/code&gt; yet. &lt;br&gt;
I'm somewhere between S2' and S3'? on my third loop?&lt;/p&gt;

&lt;p&gt;So here's my promise: when I get there: when I finally touch &lt;code&gt;S4&lt;/code&gt; and it sticks... I'll write about it. &lt;/p&gt;




&lt;p&gt;thanks for reading. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>career</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>You're Falling Behind</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Mon, 02 Feb 2026 11:26:31 +0000</pubDate>
      <link>https://forem.com/manuartero/youre-falling-behind-38dm</link>
      <guid>https://forem.com/manuartero/youre-falling-behind-38dm</guid>
      <description>&lt;ul&gt;
&lt;li&gt;"&lt;em&gt;You're falling behind&lt;/em&gt;"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;* Looks up the latest trend&lt;/p&gt;

&lt;p&gt;* Does &lt;code&gt;ln -s ~/.foo-model/skills/file.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapyq4e1oxrn2u0f9nvxh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapyq4e1oxrn2u0f9nvxh.jpg" alt="sydney sweeney meme" width="500" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>watercooler</category>
      <category>jokes</category>
    </item>
    <item>
      <title>About Wizards &amp; Warlocks, Programmers &amp; Vibe Coders</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Wed, 28 Jan 2026 10:39:32 +0000</pubDate>
      <link>https://forem.com/manuartero/about-wizards-warlocks-programmers-vibe-coders-4p6n</link>
      <guid>https://forem.com/manuartero/about-wizards-warlocks-programmers-vibe-coders-4p6n</guid>
      <description>&lt;p&gt;We used to be similar to wizards.&lt;/p&gt;

&lt;p&gt;Wizards have no intrinsic power by themselves: they must earn it. &lt;/p&gt;

&lt;p&gt;We studied. For years. There was effort in the transaction, and as a reward you got a valuable skill. And because of this, you were able to find a lord to work for. You got to the lord's court to work as a wizard full time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3d2oyio14y7qpa4hdpfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3d2oyio14y7qpa4hdpfe.png" alt="Wizard from Dnd 2024 Wizards of the Coast" width="603" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to the wizard academy, I started at Lvl. 1. Knowing 3x cantrips and having 2x level 1 spell slots.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6k21sc3sh3tsvjc3sg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6k21sc3sh3tsvjc3sg6.png" alt="Wizard feat Lvl. 1" width="800" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I got a job at the fortress of a powerful lord. They paid for my wizard services and gave me daily tasks to solve.&lt;/p&gt;

&lt;p&gt;When stuck, I would turn to the other wizards employed in the castle, the books I used at the academy, or the well-known oracle of knowledge called "&lt;em&gt;the Overflowing Stack&lt;/em&gt;": a shrine of the Fae where answers were found (but it was extremely difficult for them to accept a new question).&lt;/p&gt;

&lt;p&gt;This is how things used to be.&lt;/p&gt;




&lt;p&gt;Then the Warlocks appeared. &lt;/p&gt;

&lt;p&gt;The new order of the "Vibe Coders". &lt;br&gt;
And their power was astonishing. All the lords of the land were impressed by their gifts.&lt;/p&gt;

&lt;p&gt;In Dungeons &amp;amp; Dragons, mechanically speaking, one of the main differences between wizards and warlocks is how their spells level. Wizards have this "mana" resource (called spell slots) and they need to manage it carefully; let's say a wizard has mana to cast the "&lt;em&gt;good refactor&lt;/em&gt;" transmutation spell at max level once, then they won't be able to cast this spell at the same power for a (long) time.&lt;/p&gt;

&lt;p&gt;Warlocks have all their "mana" (spell slots) at max level. All the time. Meaning: they only cast spells at max level. And they need almost no rest! they're ready to cast "&lt;em&gt;astonishing new project&lt;/em&gt;" illusion spell riiiight away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7pquzhrk76mo5odwx0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7pquzhrk76mo5odwx0u.png" alt="Programmed illusion spell" width="533" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's why the lords are looking to these brand new spell casters with wide-opened eyes.&lt;/p&gt;

&lt;p&gt;So they started asking all their employed wizards: &lt;em&gt;"Hey, this guy over there is able to cast 'full REST API' at max level with no effort"&lt;/em&gt; ... &lt;em&gt;"Go multi-class to Warlock, you puny wizard."&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What is the trick here?&lt;/p&gt;

&lt;p&gt;Wizards studied magic, they &lt;strong&gt;earned&lt;/strong&gt; it.&lt;/p&gt;

&lt;p&gt;Warlocks &lt;strong&gt;borrow&lt;/strong&gt; their magic. They don't wield it, they borrowed it from an external, powerful entity: The Patron.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They made a pact with their Patron&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once a pact is made, a &lt;del&gt;Warlock’s&lt;/del&gt; VibeCoder thirst for &lt;del&gt;power&lt;/del&gt; tokens can’t be slaked with mere study. &lt;br&gt;
Most &lt;del&gt;Warlock’s&lt;/del&gt; VibeCoders spend their days pursuing greater &lt;del&gt;power&lt;/del&gt; tools and &lt;del&gt;deeper knowledge&lt;/del&gt; new models &lt;br&gt;
– Dungeons&amp;amp;Dragons Player Handbook (2024)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Player Handbook continues:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On level 3, You gain a &lt;del&gt;Warlock&lt;/del&gt; VibeCoder subclass of your choice: &lt;br&gt;
the &lt;del&gt;Archfey Patron&lt;/del&gt; &lt;strong&gt;OpenAI Patron&lt;/strong&gt;, &lt;br&gt;
the &lt;del&gt;Fiend Patron&lt;/del&gt; &lt;strong&gt;Anthropic Patron&lt;/strong&gt; &lt;br&gt;
and &lt;del&gt;Great Old One Patron&lt;/del&gt; &lt;strong&gt;Perplexity Patron&lt;/strong&gt; are the most notable subclasses.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx3uwt938i8kkx24j52j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx3uwt938i8kkx24j52j.png" alt="subclass election" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Their Patron grants them otherworldly powers.
&lt;/h3&gt;

&lt;p&gt;And sometimes we forget who's the Subject and what's the verb in this sentence.&lt;/p&gt;

&lt;p&gt;Let's do second grade syntax here, shall we?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gwz4zsm3ifz5duvlplt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gwz4zsm3ifz5duvlplt.png" alt="visual syntax analysis" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;em&gt;their Patron&lt;/em&gt; → who performs the action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verb&lt;/strong&gt;: &lt;em&gt;grants&lt;/em&gt; → to grant: to give something to someone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complements&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;them&lt;/em&gt; → Indirect Object (the person who receives something)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;otherworldly powers&lt;/em&gt; → Direct Object (the thing that is given)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;I, myself, have multiclassed to Lvl. 1 Warlock. (I guess.... Level 3 Wizard + Level 1 Warlock?). &lt;br&gt;
Not because I wanted to? but rather because I want to remain employable by a lord.&lt;/p&gt;

&lt;p&gt;The pact is tempting: forget all my Wizard levels and just use the Patron's source of power. It's soooo easy.&lt;/p&gt;

&lt;p&gt;Still...&lt;/p&gt;

&lt;p&gt;The thing about borrowed power, it's still &lt;strong&gt;borrowed&lt;/strong&gt;. Patrons can change the terms of the pact. Anytime. &lt;/p&gt;

&lt;p&gt;The Patron &lt;em&gt;giveth&lt;/em&gt;, and the Patron can &lt;em&gt;taketh away&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;And when that day comes, I mean...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't give up those wizard levels just yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
Thanks for reading&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>vibecoding</category>
      <category>career</category>
    </item>
    <item>
      <title>Docker Zootopia Networking</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Fri, 17 Oct 2025 12:46:49 +0000</pubDate>
      <link>https://forem.com/manuartero/docker-zootopia-networking-4h1l</link>
      <guid>https://forem.com/manuartero/docker-zootopia-networking-4h1l</guid>
      <description>&lt;p&gt;I want to talk a little bit about Docker Compose, networking, and services calling each other. This is a super regular scenario that ‘ve already talked/posted/written, but I keep these post mostly for myself? if that makes sense.&lt;/p&gt;

&lt;p&gt;So, from the beginning;&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;docker-compose&lt;/code&gt; file, there is &lt;code&gt;service-a&lt;/code&gt; (the main service) and &lt;code&gt;service-b&lt;/code&gt;. I need &lt;code&gt;service-a&lt;/code&gt; to ping to &lt;code&gt;service-b&lt;/code&gt;. &lt;br&gt;
And &lt;code&gt;service-a&lt;/code&gt; has an environment variable to define the URL for &lt;code&gt;service-b&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr5vtr0ukcxoc8e3jzty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr5vtr0ukcxoc8e3jzty.png" alt="docker-network-1" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The happy case works right out of the box; &lt;code&gt;service-a&lt;/code&gt; can reach &lt;code&gt;http://service-b:1080&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;why? cause there is a &lt;strong&gt;default Docker network&lt;/strong&gt; configuration (I pretend that this is already written in my compose file)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which means: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each service you define in the compose joins the network tagged &lt;code&gt;default&lt;/code&gt; (its named like &lt;code&gt;{folder-name}_default&lt;/code&gt; ).&lt;/li&gt;
&lt;li&gt;Each service is automatically assigned automatically an IP address (like &lt;code&gt;172.x.x.x&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;key thing: &lt;code&gt;service-a&lt;/code&gt; can reach &lt;code&gt;service-b&lt;/code&gt; by name cause this network already has a DNS resolution built-in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(I made up these IPs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DNS resolution example inside the Docker network&lt;/span&gt;
service-a -&amp;gt; 172.18.0.1:8080
service-b -&amp;gt; 172.18.0.2:1080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick note!&lt;/p&gt;

&lt;p&gt;Inside the Docker network they can call each other using these names… but from your machine you can’t use these names. &lt;/p&gt;

&lt;p&gt;It’s like in Zootopia.&lt;/p&gt;

&lt;p&gt;In Zootopia, a bunny can call another bunny "cute," but when &lt;em&gt;other animals&lt;/em&gt; do it, it's a little… well, you know what I mean.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0cbsuqrflqdpl31lzwhv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0cbsuqrflqdpl31lzwhv.png" alt="judy from zootopia" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the same, you computer can’t use the name alias referring to service-a, it needs to use localhost and the forwarded port, that’s why we do this forwarding port thing like &lt;code&gt;4080:1080&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwti35aq0ybb6epdflcv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwti35aq0ybb6epdflcv.png" alt="docker-network-2" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Anyway, this isn’t what I want to focus &lt;strong&gt;👯&lt;/strong&gt;,&lt;/p&gt;

&lt;p&gt;because my particular use case has an additional &lt;strong&gt;key requirement:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;service-a&lt;/code&gt; can not use &lt;code&gt;http://service-b:1080&lt;/code&gt; (there was an explicit code guard, an &lt;code&gt;if&lt;/code&gt;) and NEEDED a address like &lt;code&gt;http://domain.something:port&lt;/code&gt;, instead of &lt;code&gt;http://service-b:1080&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: due to this particular requirement (it was hardcoded in the code itself), I had to understand Docker networking a bit better; this post is about summarizing this mini-journey.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, yay, easy right? if the requirement is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- http://service-b:1080
&lt;/span&gt;&lt;span class="gi"&gt;+ http://service-b.local:1080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;just create an alias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;service-b:
&lt;/span&gt;  image: ...
  networks:
    default:
      ports:
        - 4080:1080
&lt;span class="gi"&gt;+     aliases:
+       - service-b.local
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So instead of&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- http://service-b:1080
&lt;/span&gt;&lt;span class="gi"&gt;+ http://service-b.local:1080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7mdwu7r0w98c5qkx60x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7mdwu7r0w98c5qkx60x.jpg" alt="nick from zootopia" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Except this needs an extra step.&lt;/p&gt;




&lt;p&gt;Remember that &lt;strong&gt;DNS mapping&lt;/strong&gt; we have by default? we neet to create a subnet and assign the IPs to each service manually….&lt;/p&gt;

&lt;p&gt;&lt;em&gt;…maybe there’s a more ‘DevOps-ish’ way to do this? but I find statically assigning the IPs pretty straightforward, im opened to alternatives:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;services:
&lt;/span&gt;  service-a:
    image: ...
&lt;span class="gi"&gt;+   networks:
+     default:
+       ipv4_address: 172.21.0.10
&lt;/span&gt;    environment:
      SERVICE_B_URL: http://service-b:1080
&lt;span class="err"&gt;
&lt;/span&gt;  service-b:
    image: ...
    networks:
      default:
&lt;span class="gi"&gt;+       ipv4_address: 172.21.0.20
&lt;/span&gt;        aliases:
          - service-b.local
    ports:
      - 4080:1080
&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+ networks:
+   default:
+     ipam:
+       driver: default
+       config:
+         - subnet: 172.21.0.0/24
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IPAM&lt;/strong&gt; means “&lt;em&gt;Ey Docker, Im to assign manually the IPs&lt;/em&gt;”; The subnet part: &lt;code&gt;172.21.0.0/24&lt;/code&gt; is creating a range of IPs between: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;172.21.0.1&lt;/code&gt; , &lt;code&gt;172.21.0.2&lt;/code&gt; , &lt;code&gt;172.21.0.3&lt;/code&gt; … &lt;code&gt;172.21.0.254&lt;/code&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And I assign each service… honestly, somewhat random (&lt;code&gt;.0.10&lt;/code&gt;, &lt;code&gt;0.20&lt;/code&gt;).&lt;/p&gt;




&lt;p&gt;Just one thing left, the DNS; we need to tell &lt;code&gt;service-a&lt;/code&gt; to map the name and the IP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;  service-a:
    image: ...
    networks:
      default:
        ipv4_address: 172.21.0.10
&lt;span class="gi"&gt;+   extra_hosts:
+     - "service-b.local:172.21.0.20"
&lt;/span&gt;    environment:
      SERVICE_B_URL: http://service-b:1080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it. Happy ending. &lt;code&gt;service-a&lt;/code&gt; can now reach &lt;code&gt;service-b&lt;/code&gt; using the name &lt;code&gt;service-b.local&lt;/code&gt;, and everything works inside the Docker network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou32d2twlcfrkepizxnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou32d2twlcfrkepizxnu.png" alt="docker-network-3" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>networking</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>The Project Ended. What to Keep.</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Tue, 05 Aug 2025 17:33:40 +0000</pubDate>
      <link>https://forem.com/manuartero/the-project-ended-what-to-keep-16kk</link>
      <guid>https://forem.com/manuartero/the-project-ended-what-to-keep-16kk</guid>
      <description>&lt;p&gt;The project I've worked on for the last 3.5 years has shut down permanently. For good.&lt;/p&gt;

&lt;p&gt;These things happen when building software. I guess it's human to feel... &lt;em&gt;failure&lt;/em&gt;?&lt;br&gt;
Even if it's unrelated to our tech work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Projects die&lt;/strong&gt;. This is a reality &lt;/p&gt;

&lt;p&gt;We, tech workers, must gather the experience and move on.&lt;/p&gt;

&lt;p&gt;So I started on this project in December 2021. The project was live for 6? 7 years when I came on board. I work at MegaCoorp™, pretty sure I've mentioned this in another post.&lt;/p&gt;

&lt;p&gt;At this scale, a '&lt;em&gt;project&lt;/em&gt;' doesn't just mean devs. it's Product designers + designers + product management + marketing + legal + operations + customer service + dev + QA + infra team.&lt;/p&gt;

&lt;p&gt;MegaCoorp™ is relocating all these people. I've already been allocated to another project (more on this in another post soon!)&lt;/p&gt;

&lt;p&gt;---🪾---&lt;/p&gt;

&lt;p&gt;I'm going off on a tangent. What I wanted to tell you today is,&lt;/p&gt;

&lt;h3&gt;
  
  
  what I think you should carry with you when you close the chapter on the last N years of your life ✨💕✨✨
&lt;/h3&gt;




&lt;p&gt;&lt;strong&gt;Let it go&lt;/strong&gt;. 🎶❄️🎵&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88atjxs49xhlka5lyyo9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88atjxs49xhlka5lyyo9.jpg" alt="Elsa in Tech. Generated by Grok3" width="720" height="960"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Elsa working in Tech, generated by Grok3&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NO, seriously.&lt;/p&gt;

&lt;p&gt;Let it go.&lt;/p&gt;

&lt;p&gt;Let the frustration, the rage, the bitter-ness fade&lt;/p&gt;

&lt;p&gt;Those last N years did happen; but the project, your &lt;strong&gt;work&lt;/strong&gt;, is gone.&lt;/p&gt;

&lt;p&gt;There are just &lt;strong&gt;two things you should keep&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;what you learned technically, so you'll apply those to your next step AND &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the human connections you've made. Even if you're not going to interact with those people in the short term, I've learned that the tech world is really, like REALLY small.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You will–&lt;br&gt;
listen–&lt;br&gt;
you &lt;strong&gt;WILL&lt;/strong&gt; meet some of those people again in your career. I bet you.&lt;/p&gt;

&lt;p&gt;So, keep the tech learning, keep the human connections you've made. And let the rest go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb51a1gg3gchgyhyt41n2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb51a1gg3gchgyhyt41n2.png" alt="core of the text as a snap" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-- &lt;br&gt;
thanks for reading.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Reach Out to the Da Vincis of Our Time</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Tue, 29 Jul 2025 10:45:21 +0000</pubDate>
      <link>https://forem.com/manuartero/reach-out-to-the-da-vincis-of-our-time-1716</link>
      <guid>https://forem.com/manuartero/reach-out-to-the-da-vincis-of-our-time-1716</guid>
      <description>&lt;p&gt;A reflection.&lt;/p&gt;

&lt;p&gt;In the 15th century, if you wanted to learn from the best, you had to embark on a journey (picture the galleons and nao of that era) and try to reach the last known location of someone considered as &lt;em&gt;master of their craft&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If&lt;/em&gt; you were lucky enough to find them, you could offer yourself as an apprentice and, with even more luck, learn directly from them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5757o31cjpk5xg8oedg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5757o31cjpk5xg8oedg3.png" alt="generated image: 15th century man watching a galleon" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Programming comes with an incredible advantage:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the great masters of our profession are alive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not only that, you can access them.&lt;br&gt;
Most of them have blogs, or are active on social media.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can read what they’re working on&lt;/strong&gt;.&lt;br&gt;
You can even write to them. Just like that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rcfujrhpwx91g1f4e22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rcfujrhpwx91g1f4e22.png" alt="generated image: a tech speaker in a conference" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take advantage of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Personal Top
&lt;/h2&gt;

&lt;p&gt;Professionals who are also great teachers (no particular order):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.joshwcomeau.com/" rel="noopener noreferrer"&gt;Josh Comeau&lt;/a&gt;: Front end. CSS, Animations, React.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://wesbos.com/" rel="noopener noreferrer"&gt;Wes Bos&lt;/a&gt;: Css, Animations, JS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mattpocock.com/" rel="noopener noreferrer"&gt;Matt Pocock&lt;/a&gt;: Typescript. AI Agents.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://danabra.mov/" rel="noopener noreferrer"&gt;Dan Abramov&lt;/a&gt;: React, RSC.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=-JquDYeZJ_I" rel="noopener noreferrer"&gt;Nadia Makarevich&lt;/a&gt;: React, Performance&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TkDodo" rel="noopener noreferrer"&gt;Dominik Dorfmeister&lt;/a&gt;: React, Performance.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/ryanflorence" rel="noopener noreferrer"&gt;Ryan Florence&lt;/a&gt;: React, Remix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe Someone finds this useful. &lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
thanks for reading.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why I’ll Never Trust Carets Again</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Mon, 30 Jun 2025 14:17:37 +0000</pubDate>
      <link>https://forem.com/manuartero/why-ill-never-trust-carets-again-1dno</link>
      <guid>https://forem.com/manuartero/why-ill-never-trust-carets-again-1dno</guid>
      <description>&lt;p&gt;There once was a good ol’ boy.&lt;br&gt;
Grew up fixing things with instinct and duct tape,&lt;br&gt;
built his apps the same way:&lt;br&gt;
solid, fast, and no time to waste.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(this poem was created by ChatGPT im not hiding it)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F353bbpcv9utwh4s00ir9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F353bbpcv9utwh4s00ir9.png" alt="good ol boy" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One day, though, he had to delete his &lt;code&gt;package-lock.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Maybe it got messed up. Maybe Git went weird. Maybe he just wanted a clean install. So he did what any of us would do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;package-lock.json &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that’s when the snake bit the horse.&lt;/p&gt;

&lt;p&gt;Because somewhere in his package.json, hiding in plain sight like a viper 🐍 in the grass, were these little traps: &lt;code&gt;^1.2.3&lt;/code&gt;, &lt;code&gt;^6.0.1&lt;/code&gt;...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x0jbgbs1ywg088insa3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x0jbgbs1ywg088insa3.png" alt="snake-bit" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They looked harmless; just caret (&lt;code&gt;^&lt;/code&gt;) versions. But those carets were telling npm:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Yeah, sure, install the latest minor version. What could go wrong?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the internet, as always, did moved on.&lt;/p&gt;

&lt;p&gt;A dependency of a dependency had released a &lt;em&gt;"compatible"&lt;/em&gt; update.&lt;/p&gt;

&lt;p&gt;Except it wasn’t.&lt;/p&gt;

&lt;p&gt;A function behaved differently. The app crashed. Logs were useless. He didn’t even touch his code, and still… it broke.&lt;/p&gt;

&lt;p&gt;All because of a version upgrade he didn’t control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause &lt;code&gt;^6.0.1&lt;/code&gt; isn't safe, &lt;code&gt;6.0.1&lt;/code&gt; is what you do want.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36zxmchfxdofjtn2vzzz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36zxmchfxdofjtn2vzzz.png" alt="sacrifice" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See ya, old buddy.&lt;/p&gt;




&lt;p&gt;The cases i can think of where &lt;code&gt;^&lt;/code&gt; are going to bite you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI suddenly start failing: everything works locally. But a new version of a sub-dependency makes your tests fail. You waste hours debugging, thinking you broke something.&lt;/li&gt;
&lt;li&gt;Two devs. Same codebase. Different &lt;code&gt;node_modules&lt;/code&gt; because of &lt;code&gt;^&lt;/code&gt; pulling different versions. One dev gets a bug. The other can’t reproduce it. &lt;/li&gt;
&lt;li&gt;Breaking changes hidden in &lt;em&gt;minor&lt;/em&gt; updates. If hte &lt;code&gt;npm&lt;/code&gt; pacakge don’t follow &lt;code&gt;semver&lt;/code&gt;. They might introduce breaking changes in a &lt;code&gt;1.4.0&lt;/code&gt; that’s technically "safe" for &lt;code&gt;^1.2.3&lt;/code&gt; (but it isn't).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;How to &lt;del&gt;protect your buddy&lt;/del&gt; solve this:&lt;/p&gt;

&lt;p&gt;check this script: &lt;a href="https://gist.github.com/manuartero/8286c392d7360b121688bcd4389c4d87" rel="noopener noreferrer"&gt;exact-versions.cjs on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn8xrotk0h9gjco75cgxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn8xrotk0h9gjco75cgxn.png" alt="exact-version.cjs" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it will replace all those nasty &lt;code&gt;^&lt;/code&gt; with the actual version you've installed. Read the &lt;code&gt;lock.json&lt;/code&gt; and replace the &lt;code&gt;^&lt;/code&gt; with the correct version.&lt;/p&gt;

&lt;p&gt;For instance this could be the output (changes to your &lt;code&gt;package.json&lt;/code&gt;): &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felgoxxt9w90w3w8k2sxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Felgoxxt9w90w3w8k2sxp.png" alt="example diff" width="306" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gr2w0ghbn30ikwy5ks1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gr2w0ghbn30ikwy5ks1.png" alt="walking-by" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ride safe buddy&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-- thanks for reading.&lt;/p&gt;

</description>
      <category>node</category>
      <category>typescript</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The JS Bundle Wars [1/n]</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Tue, 24 Jun 2025 16:26:48 +0000</pubDate>
      <link>https://forem.com/manuartero/the-js-bundle-wars-1776</link>
      <guid>https://forem.com/manuartero/the-js-bundle-wars-1776</guid>
      <description>&lt;p&gt;If you're in the JS ecosystem, at some point you'll face this duo: &lt;code&gt;esm&lt;/code&gt; &amp;amp; &lt;code&gt;cjs&lt;/code&gt;... &lt;br&gt;
&lt;em&gt;are &lt;code&gt;umd&lt;/code&gt; &amp;amp; &lt;code&gt;amd&lt;/code&gt;still a thing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;and you'll be like «what is exactly &lt;code&gt;es&lt;/code&gt; referencing here?» «do i need &lt;code&gt;es2020&lt;/code&gt; or &lt;code&gt;esnext&lt;/code&gt;?»&lt;/p&gt;

&lt;p&gt;and if you have an internal library —especially if it’s frontend related–someone on the team will eventually ask:&lt;br&gt;
«Wait, how are the assets/CSS being bundled exactly?»&lt;/p&gt;

&lt;p&gt;that's &lt;strong&gt;The JS Bundle Wars.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a war. &lt;br&gt;
isn't pretty. &lt;br&gt;
isn't easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BUT it's interesting as f*&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;this topic could lead to a complete book (Have I mentioned I dream about writing a dev book and selling it on Amazon?)&lt;/p&gt;

&lt;p&gt;Today, I’m just kicking things off...as every complex topic should, with a simple &lt;em&gt;hello world&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’m not even using React yet, let’s start with a plain Vanilla JS hello world page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsegkvzzrmvahb8c4a5hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsegkvzzrmvahb8c4a5hs.png" alt="Hello World screenshot" width="348" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the repo im playing with: &lt;a href="https://github.com/manuartero/js-bundle-war" rel="noopener noreferrer"&gt;js-bundle-war&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;the code is super simple.&lt;br&gt;
We just need an &lt;code&gt;import&lt;/code&gt;, an &lt;code&gt;index.html&lt;/code&gt; and the &lt;code&gt;&amp;lt;script type="module"&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febnhpoc7xczwzr7yvn8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febnhpoc7xczwzr7yvn8r.png" alt="index.html" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;is importing a &lt;strong&gt;ES module&lt;/strong&gt;: &lt;strong&gt;main.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3u5dxtbidm65n3vwbna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3u5dxtbidm65n3vwbna.png" alt="main.js" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which in turn imports other &lt;strong&gt;ES modules&lt;/strong&gt;: &lt;strong&gt;app.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fop3eb9hiiza5lg0zkeuf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fop3eb9hiiza5lg0zkeuf.png" alt="app.js" width="800" height="913"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;so far, so good.&lt;/p&gt;

&lt;p&gt;I'm using Vite as bundler. I don't want to get back to webpack. &lt;/p&gt;

&lt;p&gt;so , if we create a package.json and define &lt;em&gt;how to build&lt;/em&gt; this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6.3.5"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite build "&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;leaving the default &lt;code&gt;vite.config&lt;/code&gt; (no config file at all), its' going to bundle this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq42t1y9jeba9n6u6cbtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq42t1y9jeba9n6u6cbtd.png" alt="default bundle" width="336" height="169"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dist
├── assets
│   ├── index-16Psp_lK.js
│   └── index-CrYBktwj.css
├── index.html
└── vite.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which is the real thing. I mean, &lt;strong&gt;this is the actual code read/rendered by the browser&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;let's open the bundled js shall we?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4da3tgfb5v1vzzlvbzb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4da3tgfb5v1vzzlvbzb7.png" alt="build-vite" width="800" height="1294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I highlight: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An initial IIFE to polyfill &lt;code&gt;modulepreload&lt;/code&gt;: this is a Vite-specific detail. Vite uses &lt;code&gt;modulepreload&lt;/code&gt; links in the HTML to prefetch JS modules for better performance.&lt;br&gt;
BUT some browsers might not support &lt;code&gt;modulepreload&lt;/code&gt;, so Vite includes a polyfill to make sure the assets are still fetched properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SOME&lt;/strong&gt; SVGs are inlined in the build, while others are referenced as external modules.&lt;br&gt;
(The screenshot was tweaked in this part — let’s take a clearer one to explain it better.)&lt;br&gt;
The key difference is where we did place the asset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if it’s under /public, it’s served as-is;&lt;/li&gt;
&lt;li&gt;if it’s inside src/, it gets bundled as part of the code.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjx9z598k370qn5bfnxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjx9z598k370qn5bfnxw.png" alt="focus-on-the-svg" width="749" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Our components, minified.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And finally, the last lines: our &lt;code&gt;main.js&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;So, we're building modern &lt;strong&gt;ES modules&lt;/strong&gt;, the bundling process takes our clean, modular code (what we wrote) and outputs the real &lt;code&gt;.js&lt;/code&gt; file... which isn't meant to be read by humans but is executed by browsers.&lt;/p&gt;

&lt;p&gt;This bundling process handles dependencies, minification, and assets.&lt;/p&gt;

&lt;p&gt;...but&lt;/p&gt;

&lt;p&gt;why are we even doing this? I mean, ok this is how we bundle , this is the output that is consumed by the browser... &lt;strong&gt;why?&lt;/strong&gt; 🤔&lt;/p&gt;




&lt;p&gt;That’s it for today — but this is just the intro, see you in the next article of the series.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Library vs. Framework</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Sun, 15 Jun 2025 10:19:57 +0000</pubDate>
      <link>https://forem.com/manuartero/library-vs-framework-1671</link>
      <guid>https://forem.com/manuartero/library-vs-framework-1671</guid>
      <description>&lt;p&gt;I really thought this was solid established, but the other day there was a bit of a discussion at work about &lt;code&gt;React&lt;/code&gt;, and I was shocked. &lt;/p&gt;

&lt;p&gt;This isn’t subjective. The difference is rock-solid 🤘🗿&lt;/p&gt;

&lt;p&gt;&lt;del&gt;Library: a collection of functions...&lt;/del&gt; ok, no. &lt;br&gt;
I &lt;em&gt;loathe&lt;/em&gt; book definitions. &lt;/p&gt;

&lt;p&gt;Nobody, ever, has truly learned something from reading a book-definition. (besides, defining something has this vibe: 🤓)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s go real with this one&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;The key is &lt;strong&gt;who is executing the code&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your code is executing the thing; you're using a &lt;strong&gt;library&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If your code is &lt;em&gt;being called&lt;/em&gt; by something else... something that expects it to be in a specific place, with a specific convention, then you’re using a &lt;strong&gt;framework&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Frameworks use your code as &lt;strong&gt;input&lt;/strong&gt;. It’s code that is picked up and executed by the framework, following conventions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A function implementing some &lt;code&gt;@Runnable&lt;/code&gt; interface.&lt;/li&gt;
&lt;li&gt;A file named &lt;code&gt;${}-controller&lt;/code&gt; that is expected to contain specific exports.&lt;/li&gt;
&lt;li&gt;A component function in a file whose path determines the route.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;You &lt;strong&gt;feed the framework&lt;/strong&gt; with your code. The framework executes.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  React is a library
&lt;/h3&gt;

&lt;p&gt;You’re in charge. You call it from your &lt;code&gt;index&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom/client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App.jsx&lt;/span&gt;&lt;span class="dl"&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;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt; &lt;span class="c1"&gt;// go react go!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You decide when and how to render. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You’re executing React.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Next.js is a framework
&lt;/h3&gt;

&lt;p&gt;Cause, now, context does matter. &lt;/p&gt;

&lt;p&gt;The following file &lt;strong&gt;is located at&lt;/strong&gt; &lt;code&gt;/app/page.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/page.tsx&lt;/span&gt;
&lt;span class="k"&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="nf"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello from Next.js&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cause the location itself has meaning. It tells Next.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ey, this function returns the component for the &lt;code&gt;/&lt;/code&gt; route."&lt;/li&gt;
&lt;li&gt;Next will &lt;strong&gt;compile&lt;/strong&gt; the files in &lt;code&gt;/app/&lt;/code&gt;, generate the routing, and execute that function at runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is code in shadows, it does something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// at some point behind the scenes...&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;FunctionWrittenByDev&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app/page.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderToHTML&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FunctionWrittenByDev&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&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;&lt;strong&gt;You export a function. The framework runs it.&lt;/strong&gt;. That’s the key.&lt;/p&gt;




&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>My Local Works™: A Docker Tale (+ Handy Script)</title>
      <dc:creator>Manuel Artero Anguita 🟨</dc:creator>
      <pubDate>Fri, 13 Jun 2025 12:34:02 +0000</pubDate>
      <link>https://forem.com/manuartero/my-local-works-a-docker-tale-handy-script-4j3h</link>
      <guid>https://forem.com/manuartero/my-local-works-a-docker-tale-handy-script-4j3h</guid>
      <description>&lt;p&gt;Today I faced one of those "&lt;em&gt;this is Witchcraft&lt;/em&gt;" moments.&lt;/p&gt;

&lt;p&gt;CI was failing for a specific commit. I checked out that exact commit locally… everything clean. Built fine. No errors. &lt;/p&gt;

&lt;p&gt;Witchcraft 🧙! "&lt;em&gt;I'm exactly on the same commit, and in my local machine it does build with no problems&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;This was a JS project. And in JS (TS doesn’t matter here), my first suspect is always dependencies.&lt;br&gt;
So, I removed &lt;code&gt;node_modules&lt;/code&gt; and rebuilt from scratch.&lt;/p&gt;

&lt;p&gt;Witchcraft x2 🧙🧙! &lt;em&gt;still couldn’t reproduce the error&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So I went to the workflow file and started following step by step what CI was doing.&lt;/p&gt;

&lt;p&gt;Witchcraft x3 🧙🧙🧙! &lt;em&gt;it can't b... &lt;strong&gt;oh wait&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Of course the CI runs everything in a clean, pure &lt;code&gt;node:20-alpine&lt;/code&gt; image.&lt;/p&gt;

&lt;p&gt;So I fired up the same container locally to see what was going on.&lt;/p&gt;



&lt;p&gt;Now, this is just he context to what i want to share:&lt;br&gt;
I use this tiny script like...a lot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you use &lt;code&gt;oh-my-zsh&lt;/code&gt;, you can add it to &lt;code&gt;~/.oh-my-zsh/custom/docker-run.zsh&lt;/code&gt; (adapt to your setup):&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;code&gt;docker-run.zsh&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;docker-run&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: docker-run &amp;lt;image&amp;gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;1
    &lt;span class="k"&gt;fi

    &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;container_image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;workdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/app"&lt;/span&gt;

    docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$workdir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$workdir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$container_image&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        /bin/sh
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Super simple. Just go to your project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$»&lt;/span&gt; docker-run node:20-alpine
/app &lt;span class="c"&gt;#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The devil’s in the details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--rm&lt;/code&gt; so the container is gone when you exit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$PWD&lt;/code&gt; mounts the current project inside the container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;it&lt;/code&gt; so you’re dropped into the terminal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sh&lt;/code&gt; cause these minimal images usually don’t have &lt;code&gt;bash&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Back to the mysterious "&lt;em&gt;Witchcraft!🧙 error&lt;/em&gt;" —&amp;gt;&lt;br&gt;
Turned out there was a node version mismatch: &lt;code&gt;v20.18.1&lt;/code&gt; locally vs. &lt;code&gt;v20.19.2&lt;/code&gt; in the container.&lt;/p&gt;

&lt;p&gt;No magic for today.&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
thanks for reading.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>docker</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
