<?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: Youssef Abdulaziz</title>
    <description>The latest articles on Forem by Youssef Abdulaziz (@sem1colons).</description>
    <link>https://forem.com/sem1colons</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%2F823780%2F9217b1b9-637c-4b18-ae7a-254ba0b7f45a.jpeg</url>
      <title>Forem: Youssef Abdulaziz</title>
      <link>https://forem.com/sem1colons</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sem1colons"/>
    <language>en</language>
    <item>
      <title>𝗟𝗼𝗰𝗮𝗹 𝗔𝗜 𝗮𝘁 $𝟬 𝗽𝗲𝗿 𝗧𝗼𝗸𝗲𝗻 — 𝗜 𝗥𝗮𝗻 𝗮 𝟳𝗕 𝗠𝗼𝗱𝗲𝗹 𝗙𝘂𝗹𝗹𝘆 𝗢𝗳𝗳𝗹𝗶𝗻𝗲 𝗮𝗻𝗱 𝗪𝗮𝗶𝘁𝗲𝗱 𝟵𝟬 𝗦𝗲𝗰𝗼𝗻𝗱𝘀 𝗳𝗼𝗿 "𝗪𝗵𝗮𝘁'𝘀 𝘁𝗵𝗲 𝗨𝗦 𝗖𝗮𝗽𝗶𝘁𝗮𝗹?"</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Thu, 30 Apr 2026 09:29:35 +0000</pubDate>
      <link>https://forem.com/sem1colons/--5g01</link>
      <guid>https://forem.com/sem1colons/--5g01</guid>
      <description>&lt;p&gt;&lt;strong&gt;Zero cloud costs. Zero API keys. Zero regrets. Here's how I'm building a fully local AI agent from scratch — and why the bill is the best part.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I asked a 7-billion parameter AI model — running entirely on my laptop — what the capital of the United States is. It took 90 seconds. The API bill was exactly $0.00. I've never been more excited about a wrong answer to a fast question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real cost of "cheap" cloud AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's talk tokens. Every time you hit GPT, Claude, or Gemini in production, the meter is running. For solo devs and small teams building AI-powered tools, that adds up faster than you'd expect — especially in agentic workflows where the model is calling tools, looping, and generating multi-step responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LOCAL VIA AirLLM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$0.00 per 1M tokens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forever, on your hardware&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tradeoff is speed and setup friction. But for development, experimentation, and eventually fine-tuning — local wins on every axis except throughput. And throughput is a problem I'm actively trying to solve.&lt;/p&gt;

&lt;p&gt;What AirLLM actually does:&lt;/p&gt;

&lt;p&gt;AirLLM runs large models on consumer hardware by loading and inferring one layer at a time, offloading the rest to CPU RAM. It's not optimized for production speed yet — it's optimized for accessibility. You don't need a $10,000 server rack. You need a decent laptop and patience.&lt;/p&gt;

&lt;p&gt;MY RIG:&lt;/p&gt;

&lt;p&gt;12 GB VRAM (RTX 5070 Ti)&lt;/p&gt;

&lt;p&gt;32 GB System RAM&lt;/p&gt;

&lt;p&gt;Intel Core Ultra 9 CPU&lt;/p&gt;

&lt;p&gt;Qwen2.5-Instruct-7B params ~90 sec First response time&lt;/p&gt;

&lt;p&gt;$0 Token cost, lifetime&lt;/p&gt;

&lt;p&gt;The roadmap — said publicly so I can't back out:&lt;/p&gt;

&lt;p&gt;𝟭. 𝗕𝘂𝗶𝗹𝗱 𝗮 𝗿𝗲𝗮𝗹 𝗮𝗴𝗲𝗻𝘁 𝘀𝗰𝗮𝗳𝗳𝗼𝗹𝗱 𝗮𝗿𝗼𝘂𝗻𝗱 𝗶𝘁 &lt;/p&gt;

&lt;p&gt;Standard tool set: read_file, write_file, web_search, execute_code, memory. The model is the brain. The tools are the hands. Every token free.&lt;/p&gt;

&lt;p&gt;𝟮. 𝗙𝗶𝗻𝗲-𝘁𝘂𝗻𝗲 𝘁𝗵𝗲 𝗴𝗮𝗿𝗯𝗮𝗴𝗲 𝗼𝘂𝘁 𝟳𝗕 𝗺𝗼𝗱𝗲𝗹𝘀 𝗰𝗮𝗿𝗿𝘆 𝗻𝗼𝗶𝘀𝗲. &lt;/p&gt;

&lt;p&gt;The goal is a task-focused version — less trivia, more "write me a Vue composable." fine-tuning &lt;/p&gt;

&lt;p&gt;𝟯. 𝗕𝗲𝗻𝗰𝗵𝗺𝗮𝗿𝗸 𝘃𝘀. 𝗠𝗲𝘁𝗮-𝗟𝗹𝗮𝗺𝗮-𝟯.𝟭-𝟰𝟬𝟱𝗕-𝗯𝗻𝗯-𝟰𝗯𝗶𝘁 𝗹𝗼𝗰𝗮𝗹𝗹𝘆 &lt;/p&gt;

&lt;p&gt;Yes, 405B parameters on the same laptop via 4-bit quantization. If it runs at all it's a miracle. Documenting every crash and breakthrough either way.&lt;/p&gt;

&lt;p&gt;"The goal isn't to beat Claude. It's to run something good enough for real coding tasks — on a 6–8GB VRAM card — at $0 per token, forever."&lt;/p&gt;

&lt;p&gt;Why 6–8GB VRAM is the target ?&lt;/p&gt;

&lt;p&gt;The audience isn't just me — it's every developer who's been priced out of serious AI tooling or locked out by internet dependency.&lt;/p&gt;

&lt;p&gt;Accessible local AI, not just powerful local AI. That's the mission.&lt;/p&gt;

&lt;p&gt;What's next ?&lt;/p&gt;

&lt;p&gt;Next post: the agent architecture. How I'm wrapping AirLLM in a tool-calling loop, handling context windows with slow inference, and running the first real benchmark against an actual coding task — not "what's the capital of the US."&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>localai</category>
      <category>developer</category>
    </item>
    <item>
      <title>🔥𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮𝗻 𝗻𝟴𝗻 𝗖𝗹𝗼𝗻𝗲 𝗶𝗻 𝗩𝘂𝗲</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sat, 30 Aug 2025 13:22:51 +0000</pubDate>
      <link>https://forem.com/sem1colons/-45nm</link>
      <guid>https://forem.com/sem1colons/-45nm</guid>
      <description>&lt;p&gt;Ever thought about how tools like hashtag#𝗻𝟴𝗻 or hashtag#𝗭𝗮𝗽𝗶𝗲𝗿 build their visual automation editors?&lt;/p&gt;

&lt;p&gt;Turns out, with hashtag#Vue it’s easier than you’d think.&lt;/p&gt;

&lt;p&gt;✨ Features:&lt;br&gt;
 • Custom styled nodes (dark mode, Tailwind)&lt;br&gt;
 • Connectable edges&lt;br&gt;
 • Background grid&lt;/p&gt;

&lt;p&gt;This is just the first step toward building your own workflow editor. Add draggable node creation, triggers, and persistence — and you’re halfway to making your own n8n clone in Vue 🚀&lt;/p&gt;

&lt;p&gt;Here’s a minimal flow editor using 𝘃𝘂𝗲–𝗳𝗹𝗼𝘄 :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;VueFlow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useVueFlow&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@vue-flow/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Background&lt;/span&gt; &lt;span class="p"&gt;}&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;@vue-flow/background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@vue-flow/core/dist/style.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&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="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-3 text-slate-50 bg-[#342c3e] rounded-md shadow-md&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-3 text-slate-50 bg-[#342c3e] rounded-md shadow-md&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Node 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p-3 text-slate-50 bg-[#342c3e] rounded-md shadow-md&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="p"&gt;])&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;edges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;e1-2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;e1-3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;edge with text&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="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-[500px] h-[500px] mx-auto"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-[500px] h-[500px] rounded-2xl overflow-hidden"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="c"&gt;&amp;lt;!-- Flow Canvas --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;VueFlow&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"basic-flow dark"&lt;/span&gt; &lt;span class="na"&gt;:nodes=&lt;/span&gt;&lt;span class="s"&gt;"nodes"&lt;/span&gt; &lt;span class="na"&gt;:edges=&lt;/span&gt;&lt;span class="s"&gt;"edges"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;Background&lt;/span&gt; &lt;span class="na"&gt;pattern-color=&lt;/span&gt;&lt;span class="s"&gt;"#7e7e7e"&lt;/span&gt; &lt;span class="na"&gt;:gap=&lt;/span&gt;&lt;span class="s"&gt;"16"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;/VueFlow&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;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vue</category>
      <category>webdev</category>
      <category>automation</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Learned Fundamentals of Frontend Architecture</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sat, 23 Aug 2025 17:12:04 +0000</pubDate>
      <link>https://forem.com/sem1colons/learned-fundamentals-of-frontend-architecture-22c6</link>
      <guid>https://forem.com/sem1colons/learned-fundamentals-of-frontend-architecture-22c6</guid>
      <description>&lt;p&gt;Just wrapped up the Fundamentals of Frontend Architecture course on frontendatscale.com by Maxi Ferreira —and honestly, it flipped the way I think about building frontends.&lt;/p&gt;

&lt;p&gt;Frontend isn’t just components and APIs—it’s architecture:&lt;br&gt;
 🔹 How do you make a codebase scalable as the team grows?&lt;br&gt;
 🔹 How do you balance DX vs performance?&lt;br&gt;
 🔹 How do you make sure your design decisions last longer than the sprint?&lt;/p&gt;

&lt;p&gt;Some of my favorite insights:&lt;br&gt;
 ✨ Thinking in architectural drivers (what really shapes your system)&lt;br&gt;
 ✨ Using the C4 model to visualize architecture clearly&lt;br&gt;
 ✨ Riskstorming before coding—spotting problems early&lt;br&gt;
 ✨ Documenting with ADRs so decisions don’t get lost in Slack threads&lt;/p&gt;

&lt;p&gt;The best part? It made me look at frontend less like “features shipping” and more like designing systems that can evolve.&lt;br&gt;
If you’re a frontend dev aiming to level up to architect thinking, this is 100% worth it. 🔥&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4td1vuqvbbesj67t9tto.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%2F4td1vuqvbbesj67t9tto.png" alt=" " width="282" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>🧠 How defineModel Works in Vue 3 — A Modern Deep Dive</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Thu, 21 Aug 2025 15:25:33 +0000</pubDate>
      <link>https://forem.com/sem1colons/how-definemodel-works-in-vue-3-a-modern-deep-dive-5h5l</link>
      <guid>https://forem.com/sem1colons/how-definemodel-works-in-vue-3-a-modern-deep-dive-5h5l</guid>
      <description>&lt;p&gt;Vue 3.4 introduced a shiny new compiler macro called &lt;code&gt;defineModel&lt;/code&gt;, and it’s one of those features that makes you wonder: &lt;em&gt;why did we ever write &lt;code&gt;props&lt;/code&gt; + &lt;code&gt;emits&lt;/code&gt; manually?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you’ve ever built components that need &lt;code&gt;v-model&lt;/code&gt;, you know the drill: props for &lt;code&gt;modelValue&lt;/code&gt;, an emit for &lt;code&gt;update:modelValue&lt;/code&gt;, and a bit of boilerplate to wire them together. &lt;code&gt;defineModel&lt;/code&gt; takes all of that and turns it into a single, clean line of code.&lt;/p&gt;

&lt;p&gt;Let’s peel back the curtain and see what’s really happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ The Simple Example
&lt;/h2&gt;

&lt;p&gt;Here’s a minimal parent + child setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App.vue&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&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;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TextInput&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;./TextInput.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TextInput&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"textModel"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Name: &lt;span class="si"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;textModel&lt;/span&gt; &lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&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;&lt;strong&gt;TextInput.vue&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"modelValue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&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;That’s it. No props. No emits. Just &lt;code&gt;defineModel&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ What Vue Compiles It Into
&lt;/h2&gt;

&lt;p&gt;When you hit save, Vue’s compiler does the heavy lifting. &lt;code&gt;defineModel()&lt;/code&gt; gets expanded into a &lt;code&gt;useModel&lt;/code&gt; call plus generated props + emits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TextInput.vue (source)&lt;/strong&gt; | &lt;strong&gt;Compiled (JS)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"modelValue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useModel&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;_useModel&lt;/span&gt; &lt;span class="p"&gt;}&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;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;__sfc__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;__name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TextInput&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelValue&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelModifiers&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="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update:modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__expose&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;__expose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// 👇 defineModel turns into useModel&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_useModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelValue&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$setup&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="nf"&gt;_withDirectives&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;_openBlock&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;_createElementBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onUpdate:modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;_vModelText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Breaking It Down
&lt;/h2&gt;

&lt;p&gt;So what exactly is happening here?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Props &amp;amp; Emits are generated for you:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nx"&gt;modelModifiers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
   &lt;span class="nx"&gt;emits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update:modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;⚡ &lt;code&gt;defineModel&lt;/code&gt; turns into &lt;code&gt;useModel&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modelValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a local ref that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads from &lt;code&gt;props.modelValue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Emits &lt;code&gt;update:modelValue&lt;/code&gt; when assigned to&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Template reactivity stays clean:&lt;/strong&gt;
The &lt;code&gt;v-model="modelValue"&lt;/code&gt; in your template is just sugar. Under the hood, it compiles into:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which calls the setter from &lt;code&gt;useModel&lt;/code&gt; and triggers the parent update.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Why This Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less boilerplate&lt;/strong&gt; → No more writing &lt;code&gt;props&lt;/code&gt; + &lt;code&gt;emits&lt;/code&gt; manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaner mental model&lt;/strong&gt; → Treat your model like a local &lt;code&gt;ref&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type safety&lt;/strong&gt; → Works with TypeScript generics (&lt;code&gt;defineModel&amp;lt;string&amp;gt;()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple models&lt;/strong&gt; → Add more with &lt;code&gt;defineModel('name')&lt;/code&gt;, &lt;code&gt;defineModel('content')&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 The Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of &lt;code&gt;defineModel&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Parent v-model  ⇄  Child’s local ref (via useModel)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The child sees a normal reactive ref (&lt;code&gt;modelValue&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The parent gets updates automatically, without extra emits.&lt;/li&gt;
&lt;li&gt;Both stay in sync.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Vue’s &lt;code&gt;defineModel&lt;/code&gt; is one of those quality-of-life upgrades that make your codebase cleaner and your brain lighter. Instead of wiring up props and emits by hand, you just declare a reactive ref, and Vue does the rest.&lt;/p&gt;

&lt;p&gt;It’s reactivity the way it should feel: &lt;strong&gt;local when you need it, two-way when you want it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 How I Conquer New Tools, Frameworks &amp; Software Like a Pro ⚔️💻</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 06 Jun 2025 20:58:17 +0000</pubDate>
      <link>https://forem.com/sem1colons/how-i-conquer-new-tools-frameworks-software-like-a-pro-3jgd</link>
      <guid>https://forem.com/sem1colons/how-i-conquer-new-tools-frameworks-software-like-a-pro-3jgd</guid>
      <description>&lt;p&gt;As developers, we're constantly bombarded with shiny new frameworks, libraries, tools, and trends. One week it's all about Vue, the next it's Astro, and before you know it, everyone's raving about tRPC or Bun.&lt;/p&gt;

&lt;p&gt;📦 Staying up-to-date can feel like chasing a speeding train... but over time, I've developed a battle-tested strategy to &lt;strong&gt;learn new tech efficiently&lt;/strong&gt; without burning out. Whether it's a hot new JS framework or a powerful dev tool, this is how I level up quickly and &lt;em&gt;actually enjoy&lt;/em&gt; the ride.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 1. Skim the Docs — Understand the "Why"
&lt;/h2&gt;

&lt;p&gt;Before I touch a line of code, I scan the official documentation. I don’t go too deep yet. I'm looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem does this solve? 🤔&lt;/li&gt;
&lt;li&gt;How is it different from what I already know?&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Example: With Vue, I immediately saw how it tackled reactivity and templating in a super clean, elegant way. I was hooked 💚&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Docs are great for getting the &lt;strong&gt;philosophy&lt;/strong&gt; and &lt;strong&gt;mental model&lt;/strong&gt; of the tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 2. Try the Interactive Tutorial (If Available)
&lt;/h2&gt;

&lt;p&gt;If there’s an interactive playground or guided tutorial (looking at you Vue, Angular, Svelte 🫶), I’m in. These are gold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No setup, no stress&lt;/li&gt;
&lt;li&gt;Learn by doing 🛠️&lt;/li&gt;
&lt;li&gt;Immediate feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step gives me that quick “aha!” moment 💡 that motivates me to keep going.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎬 3. Watch a Crash Course (Shoutout Traversy Media! 🙌)
&lt;/h2&gt;

&lt;p&gt;Next, I jump into YouTube. And when I say YouTube, I &lt;em&gt;really&lt;/em&gt; mean &lt;a href="https://www.youtube.com/@TraversyMedia" rel="noopener noreferrer"&gt;Traversy Media&lt;/a&gt;. Brad's crash courses are 🔥&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"React Crash Course 2024 - Traversy Media"&lt;br&gt;
"Tailwind CSS in 30 Minutes - Traversy Media"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They’re fast-paced, practical, and cover the essentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project structure 🏗️&lt;/li&gt;
&lt;li&gt;Syntax and conventions&lt;/li&gt;
&lt;li&gt;Real-world examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watching a good crash course feels like upgrading my brain in 45 minutes ⏱️💡&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 4. Build a Tiny Project (or Two)
&lt;/h2&gt;

&lt;p&gt;Time to get my hands dirty.&lt;/p&gt;

&lt;p&gt;I build something small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A weather app ☀️❄️&lt;/li&gt;
&lt;li&gt;A notes app 📝&lt;/li&gt;
&lt;li&gt;A to-do list ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn’t have to be perfect—it just needs to &lt;em&gt;exist&lt;/em&gt;. This is where the real learning kicks in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I run into bugs 🐞&lt;/li&gt;
&lt;li&gt;I read docs deeper 📘&lt;/li&gt;
&lt;li&gt;I get comfortable with the tooling 🛠️&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 5. Go Deep — Full Course, Full Docs, All-In Mode
&lt;/h2&gt;

&lt;p&gt;Now I’m ready to commit.&lt;/p&gt;

&lt;p&gt;This is where I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take a &lt;strong&gt;30h+ Udemy course&lt;/strong&gt; 🧠🎓&lt;/li&gt;
&lt;li&gt;Read the &lt;em&gt;entire&lt;/em&gt; documentation, start to finish 📘✅&lt;/li&gt;
&lt;li&gt;Read articles, Medium posts, and Dev.to tips 📝&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step transforms me from a hobbyist into someone who could use the tool in production with confidence 💪&lt;/p&gt;




&lt;h2&gt;
  
  
  👥 Bonus: Join the Community
&lt;/h2&gt;

&lt;p&gt;Don't sleep on community learning!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Join Discord servers 🗨️&lt;/li&gt;
&lt;li&gt;Follow Reddit threads 🧵&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s so much value in seeing how others use the same tool, solve weird bugs, or share tips from the trenches 🚧&lt;/p&gt;




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

&lt;p&gt;There’s no one-size-fits-all approach to learning something new in tech—but this method has saved me &lt;strong&gt;time&lt;/strong&gt;, &lt;strong&gt;stress&lt;/strong&gt;, and a ton of rabbit holes 🐇🕳️&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🧭 Skim the docs&lt;/li&gt;
&lt;li&gt;⚡ Do interactive tutorials&lt;/li&gt;
&lt;li&gt;🎬 Watch a crash course (Traversy FTW!)&lt;/li&gt;
&lt;li&gt;🛠️ Build small projects&lt;/li&gt;
&lt;li&gt;📚 Go deep with courses &amp;amp; docs&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Learning something new should feel exciting—not exhausting. So keep shipping, stay curious, and don’t forget to have fun along the way! 🧠✨&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy learning!&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>learning</category>
      <category>frontend</category>
      <category>backend</category>
    </item>
    <item>
      <title>Building Headless Components in Vue — The Right Way</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 30 May 2025 17:04:20 +0000</pubDate>
      <link>https://forem.com/sem1colons/building-headless-components-in-vue-the-right-way-ib1</link>
      <guid>https://forem.com/sem1colons/building-headless-components-in-vue-the-right-way-ib1</guid>
      <description>&lt;p&gt;Reusable UI components often break once you change the design. Solution? Go headless.&lt;/p&gt;

&lt;p&gt;A headless component:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"Exposes data &amp;amp; logic (but no styling)"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Lets you plug in any markup/UX you want"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Keeps behavior testable and DRY"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: a headless dropdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useDropdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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;toggle&lt;/span&gt; &lt;span class="o"&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="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&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="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Toggle&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"isOpen"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;slot&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&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;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"📦 Easy to theme"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"✅ Easier snapshot testing"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"🧠 Decouples logic from layout"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what libraries like Radix and Headless UI follow. You can build your own system for any internal tools.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The “Good Enough” Refactor Rule for Fast Teams</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 30 May 2025 15:46:57 +0000</pubDate>
      <link>https://forem.com/sem1colons/the-good-enough-refactor-rule-for-fast-teams-3mpg</link>
      <guid>https://forem.com/sem1colons/the-good-enough-refactor-rule-for-fast-teams-3mpg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I used to chase perfection — refactor deeply, clean every file, remove every legacy prop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But on fast-moving teams, that’s a luxury.&lt;/p&gt;

&lt;p&gt;Now I follow a rule I call: “Clean What You Touch.”&lt;/p&gt;

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

&lt;p&gt;Only refactor the parts you already changed in a PR&lt;/p&gt;

&lt;p&gt;Leave clear TODOs in comments, not Jira&lt;/p&gt;

&lt;p&gt;Propose full refactors during quiet sprints, not delivery weeks&lt;/p&gt;

&lt;p&gt;This keeps tech debt manageable without slowing features.&lt;/p&gt;

&lt;p&gt;It also shows your team you can balance speed and craftsmanship — a signal of seniority that doesn’t need a title.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>refactoring</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>The Silent Frontend Bottleneck: Communication Between Modules</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 30 May 2025 15:38:05 +0000</pubDate>
      <link>https://forem.com/sem1colons/the-silent-frontend-bottleneck-communication-between-modules-4i2j</link>
      <guid>https://forem.com/sem1colons/the-silent-frontend-bottleneck-communication-between-modules-4i2j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Everyone talks about optimizing load time, but here’s an underrated bottleneck: module communication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vue’s Composition API gives you tools like provide/inject, stores, and custom composables… but when should you use which?&lt;/p&gt;

&lt;p&gt;My go-to rules:&lt;/p&gt;

&lt;p&gt;If two sibling components talk → shared composable or scoped store&lt;/p&gt;

&lt;p&gt;If parent provides data → props or provide/inject&lt;/p&gt;

&lt;p&gt;If data needs to survive route changes → Pinia/global store&lt;/p&gt;

&lt;p&gt;What kills DX is mixing strategies. I once saw a component that injected data from one parent, pulled another from global store, and passed props to a nested modal — impossible to test.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27myn66iuttvi8xkb0fe.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%2F27myn66iuttvi8xkb0fe.jpg" alt=" " width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Typescript enums: not magic, just objects⚡🧠</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sun, 01 Dec 2024 05:35:19 +0000</pubDate>
      <link>https://forem.com/sem1colons/typescript-enums-not-magic-just-objects-4nio</link>
      <guid>https://forem.com/sem1colons/typescript-enums-not-magic-just-objects-4nio</guid>
      <description>&lt;p&gt;It was my usual 4am 🕓 psycho-dev 🧠 study session, and the topic at hand was &lt;strong&gt;TypeScript&lt;/strong&gt; ⚡. After watching some (1 to 1M) 📺 5-minute videos on YouTube and interrogating ChatGPT 🤖 for a couple of minutes ⏱️, finally... I understood how TypeScript enums translate to JavaScript! 🎉🚀.&lt;/p&gt;




&lt;p&gt;For those who dont know what enums are:&lt;br&gt;
In TypeScript, enums (short for enumerations) are like a toolbox 🧰 of named constants. They help you group related values and assign them easy-to-remember names, making your code more readable and error-resistant 🚀.&lt;/p&gt;
&lt;h4&gt;
  
  
  🛠️ Types of Enums:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Numeric Enums 🔢 =&amp;gt;
Each member gets a number (0, 1, 2…).
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 1&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt;   &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;String Enums 🔤 =&amp;gt;
Each member has a string value, making debugging easier.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DOWN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LEFT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RIGHT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Heterogeneous(mixed) Enums 🎲 =&amp;gt;
Mix numeric and string values (rarely used but possible). &lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  TS enums to JS objects 🔢⇨📦
&lt;/h3&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%2Fzkocpc09cueiajzoz96t.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%2Fzkocpc09cueiajzoz96t.png" alt="Ts enum to Js object" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's near 5:30am now and I finally get it! I finally understand how this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 0&lt;/span&gt;
  &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 1&lt;/span&gt;
  &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="nx"&gt;Right&lt;/span&gt;   &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;makes this Js code possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Down&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, lets see how tsc (typescript compiler) compiles the enum:&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%2Fh2i7q7dru9jpbaswla3g.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%2Fh2i7q7dru9jpbaswla3g.png" alt="tsc (typescript compiler) compiles the enum" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From what I see, the compiler made an IFFE (famously known as iffy) function which is "Immediately Invoked Function Expression". I..FF..E it's in the name. From its name, the function is immediately executed.&lt;/p&gt;

&lt;p&gt;The compiler also initialized a variable name &lt;strong&gt;Direction&lt;/strong&gt; which is &lt;strong&gt;undefined&lt;/strong&gt; for the moment.&lt;/p&gt;

&lt;p&gt;Now lets look inside. The anonymous function inside the iffy has one paramater which is treated as an object inside the function, the object that resembels the enum.&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%2F6gmg3w90w8xtbywwjn20.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%2F6gmg3w90w8xtbywwjn20.png" alt="Anonymous function" width="279" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That parameter is fed to the function as an argument for the iffy. If its null or undefined (which is our case) it will be assigned an empty object&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%2Fi04m8wycry1ag25l7qcg.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%2Fi04m8wycry1ag25l7qcg.png" alt="iffy argument" width="512" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now to juicy parts....&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Direction[Direction["Up"] = 0] = "Up";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Javascript executes the most inner square brackets to the outer brackets,&lt;br&gt;
so &lt;code&gt;Direction["Up"] = 0&lt;/code&gt; is executed first and an entry "Up" is added to the &lt;strong&gt;Direction&lt;/strong&gt; object&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="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;Up&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the outer brackets also expects a value ( 0 in our case)&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%2Fh2b7oxaee67zev4sishe.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%2Fh2b7oxaee67zev4sishe.png" alt="Bidirectional Mapping" width="417" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the surprise of everyone (even javascript 😒), the assignment operation returns the assigned value&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;546&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// returns 546. Try it in browser console yourself&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so the inner bracket assigns 0 to "Up" and also returns 0 for the outer bracket to create another entry in &lt;strong&gt;Direction&lt;/strong&gt; Object.&lt;/p&gt;

&lt;p&gt;Long story short, this line creates &lt;strong&gt;Bidirectional Mapping&lt;/strong&gt;(only with numeric enums) inside the &lt;strong&gt;Direction&lt;/strong&gt; object.&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%2F51nwipjt9l9mdg00lpgy.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%2F51nwipjt9l9mdg00lpgy.png" alt="Bidirectional Mapping" width="800" height="53"&gt;&lt;/a&gt;&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="c1"&gt;//step 1&lt;/span&gt;
&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/*

Direction ={
Up:0
}

*/&lt;/span&gt;

&lt;span class="c1"&gt;//step 2&lt;/span&gt;
&lt;span class="nx"&gt;Direction&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="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/*

Direction ={
Up:0,
0:"Up",
}

*/&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After line #1 of the function, this is our &lt;strong&gt;Direction&lt;/strong&gt; object&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now u know the drill. After the function completes execution, &lt;strong&gt;Direction&lt;/strong&gt; looks like this&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="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nx"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Down&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Left&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nx"&gt;Right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Right&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's 6:45am , I gotta get to bed. Do NOT wake me up before 9. I absolutely don't wanna hear your comments or questions, but I do expect a follow, a like and a share maybe.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>enums</category>
      <category>webdev</category>
    </item>
    <item>
      <title>VueJs Reactivity... And How does it work</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Sat, 30 Jul 2022 00:53:00 +0000</pubDate>
      <link>https://forem.com/sem1colons/reactive-vue-how-does-it-work-4flb</link>
      <guid>https://forem.com/sem1colons/reactive-vue-how-does-it-work-4flb</guid>
      <description>&lt;p&gt;One of the main features of any modern JavaScript framework is reactivity. in this article you're gonna understand how Vue.Js tackles this by :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Understanding the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue's solution to that problem.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You're coding using vanilla JavaScript and the code calculates the total price of some products and logs it...&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnfm720548kefyvd1b0i.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%2Fqnfm720548kefyvd1b0i.png" alt="Our scenario" width="462" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now our price has gone up to 20 per product, let's log the price again....&lt;br&gt;
to our surprise it's still 10 but why?! that's supposed to be 40, right? &lt;strong&gt;WRONG&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgct9si9z741t004shy0e.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%2Fgct9si9z741t004shy0e.png" alt="nothing is changed" width="500" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a good look at the code again, the calculation only happens once. We never told JavaScript to track any changes nor we told it that the total price calculation is meant to update according to changes, and here's where &lt;strong&gt;The Reactive Vue&lt;/strong&gt; really shines...&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue's solution
&lt;/h2&gt;

&lt;p&gt;The approach is that we want to be able to store the critical value in some sort and be able to track it and trigger the effect when the value changes.&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%2F8pmll3dii7quxysce1bd.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%2F8pmll3dii7quxysce1bd.png" alt="Code to store" width="579" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The calculation is wrapped in a function called "effect" and stored for later use when our value(price) changes. For that to happen, there are 3 main operations(functions) to run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;track() -&amp;gt; to actually save our code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;effect() -&amp;gt; the actual behavior/calculation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;trigger() -&amp;gt; to run the effect/s&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F547nvl4n4yvvqhqjauza.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%2F547nvl4n4yvvqhqjauza.png" alt="main operations" width="648" height="246"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Brainstorming...
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Can there be multiple effects? How does Vue handle that?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when we want to track multiple properties?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What if we track objects...?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'll answer all that in the upcoming post as well as your questions. Feel free to ask me about anything, it's ok we're all learning here.&lt;/p&gt;

&lt;p&gt;Leave a ♥️ for the post if it was useful to reach more devs 🧑‍💻🧑‍💻...&lt;br&gt;
&lt;strong&gt;Follow me for more related content...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;recourses:&lt;br&gt;
&lt;a href="https://www.youtube.com/c/VueMastery" rel="noopener noreferrer"&gt;https://www.youtube.com/c/VueMastery&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Why React but not Vue!!</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 15 Jul 2022 18:04:26 +0000</pubDate>
      <link>https://forem.com/sem1colons/why-react-but-not-vue-4h98</link>
      <guid>https://forem.com/sem1colons/why-react-but-not-vue-4h98</guid>
      <description>&lt;p&gt;I am a Vue developer and recently started to learn React.It's the first time I write code while being angry at it 😂😂, I wonder why would someone choose the scramble(in my opinion) of React over the convenience and organisation of Vue.&lt;/p&gt;

&lt;p&gt;I want to hear your opinion about this if you have experience in React or vue or both of 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%2Fzivslje2aiw125fvf5ex.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%2Fzivslje2aiw125fvf5ex.jpg" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hardstuck Fresh Graduate</title>
      <dc:creator>Youssef Abdulaziz</dc:creator>
      <pubDate>Fri, 27 May 2022 11:16:19 +0000</pubDate>
      <link>https://forem.com/sem1colons/hardstuck-fresh-graduate-5ecp</link>
      <guid>https://forem.com/sem1colons/hardstuck-fresh-graduate-5ecp</guid>
      <description>&lt;p&gt;I'm 1 month away from graduating with a BSc in software engineering. I've always seen myself as a freelance developer but that is kinda hard to start with and even if I wanted to work with a company, their demands will be 1yr experience at minimum.&lt;/p&gt;

&lt;p&gt;Although I don't have that much of professional work experience, I`ve done a few projects that verifies my skills.&lt;/p&gt;

&lt;p&gt;The question is how can I start my freelance career(or corporate career) giving that internship opportunities hardly exist in my country (Egypt) and nearly everyone want seniors with 5+ yrs. It`s really disappointing.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
