<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexandra</title>
    <description>The latest articles on DEV Community by Alexandra (@ale3oula).</description>
    <link>https://dev.to/ale3oula</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png</url>
      <title>DEV Community: Alexandra</title>
      <link>https://dev.to/ale3oula</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ale3oula"/>
    <language>en</language>
    <item>
      <title>Understanding JavaScript Execution Context: The Foundation of Interactivity</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Mon, 27 Jul 2026 10:47:33 +0000</pubDate>
      <link>https://dev.to/ale3oula/understanding-javascript-execution-context-the-foundation-of-interactivity-2dah</link>
      <guid>https://dev.to/ale3oula/understanding-javascript-execution-context-the-foundation-of-interactivity-2dah</guid>
      <description>&lt;p&gt;The most difficult thing in JavaScript is understanding how things are collaborating in order to provide interactivity. &lt;/p&gt;

&lt;p&gt;The execution context is equivalent to a workspace. Whenever JS runs some code, it creates a workspace to contain everything it needs to do it successfully. That workspace has the variables, the functions, the &lt;code&gt;this&lt;/code&gt; and information on where to continue working.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating contexts
&lt;/h3&gt;

&lt;p&gt;There are two ways to create this workspace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When a program starts (Global execution context)&lt;/li&gt;
&lt;li&gt;Every time a function is called (Function execution context)
&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;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alex&lt;/span&gt;&lt;span class="dl"&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;greet&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;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&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;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when this program starts JS creates the global context with the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;greet&lt;/code&gt;.Then the &lt;code&gt;greet&lt;/code&gt; function is called, which creates a new execution context that includes the variable &lt;code&gt;message&lt;/code&gt;. When the function &lt;code&gt;greet()&lt;/code&gt; finishes its execution, this context is removed. When the program finishes the global context is also removed. A fair question here is: "removed from where"? The answer is: from the infamous &lt;code&gt;call stack&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The call stack
&lt;/h3&gt;

&lt;p&gt;These execution workspaces are stored in a stack. If you don't know what a stack is: it is a data structure with some specific properties. New elements are added at the top of the stack, elements are removed also from the top of the stack. The most famous comparison is to think of a stack as a stack of plate. You wouldn't remove a plate from the bottom of the stack. This property is called LIFO: Last in First out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐
│   greet()   │  ← Top (will be removed first)
├─────────────┤
│   Global    │  ← Bottom (removed last)
└─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;greet()&lt;/code&gt; finishes, it's "pop'ed" from the stack and only the global context remains (until the end of this program)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;second&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;second&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;third&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;third&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 plaintext"&gt;&lt;code&gt;Before any call:        During execution:       After all finish:
┌──────────────┐        ┌──────────────┐       ┌──────────────┐
│   Global     │        │   third()    │       │   Global     │
└──────────────┘        ├──────────────┤       └──────────────┘
                        │  second()    │
                        ├──────────────┤
                        │   first()    │
                        ├──────────────┤
                        │   Global     │
                        └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As every functions finishes their executions, it's get popped from the stack. First the &lt;code&gt;third&lt;/code&gt; finishes and it is removed, then the second, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  The two phases of the context
&lt;/h3&gt;

&lt;p&gt;Every execution context has two phases. The 1st phase is the &lt;code&gt;Creation&lt;/code&gt;: JS scans the code and prepares the memory, it identifies variables and functions. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables declared with &lt;code&gt;var&lt;/code&gt; are initialised with undefined.&lt;/li&gt;
&lt;li&gt;Functions defined with the &lt;code&gt;function&lt;/code&gt; keyword are saved as a whole. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; variables are registered in an other place called Temporal Dead Zone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next phase is the &lt;code&gt;execution&lt;/code&gt;: JS runs the code line-by-line. It assign values to variables and executes statements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why hoisting happens?
&lt;/h2&gt;

&lt;p&gt;There is a word that scares every web developer: &lt;strong&gt;hoisting&lt;/strong&gt;. This happens due to the creation phase. As JS scans the code it already knows about variables and functions before execution even begins. That process is called hoisting.&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;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Prints undefined, because JS initialized the a with undefined in the creation phase&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Function declarations are fully hoisted, so you can call them even before they are written.&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="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// This works! Prints "Hello"&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&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;Note: function expressions are NOT hoisted. Function expressions are functions that are stored in a variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; against hoisting
&lt;/h2&gt;

&lt;p&gt;In ES6 the keywords &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; were introduced. When you run the same code as before but using &lt;code&gt;let&lt;/code&gt; this time..you get a reference error. what is happening?&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;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// throws ReferenceError&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Javascript still knows that &lt;code&gt;a&lt;/code&gt; exists, but the difference is that now is not saved in the context. Instead, it's stored in an another place called &lt;strong&gt;Temporal dead zone (TDZ)&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding TDZ
&lt;/h3&gt;

&lt;p&gt;The TDZ is a region in a block where a variable exists but cannot accessed (yet). TDZ starts from the beginning of the block until the variable is declared and initialized.&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="k"&gt;if &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="c1"&gt;// TDZ for 'a' starts here&lt;/span&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;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError - 'a' is in TDZ, not accessible&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// TDZ ends here, 'a' is now initialized and accessible&lt;/span&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;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 5 - now it works&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Scope Chain: Looking Beyond the Current Context
&lt;/h3&gt;

&lt;p&gt;When you reference a variable inside a function, JS doesnt only look in the current execution context. If the variable is not found in the current, it start looking on the parent, and then it's parent until it reaches the global context. This is called scope chain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm a global var&lt;/span&gt;&lt;span class="dl"&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;outer&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;outerVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm in outer scope&lt;/span&gt;&lt;span class="dl"&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;inner&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;innerVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I'm in inner scope&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&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;innerVar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ Found in inner's context&lt;/span&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;outerVar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ Found in outer's context (via scope chain)&lt;/span&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="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// ✅ Found in global context (via scope chain)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  summary
&lt;/h3&gt;

&lt;p&gt;✅ JS creates an execution context before running code&lt;br&gt;
✅ Every function call creates an execution context&lt;br&gt;
✅ These contexts are managed using the call stack&lt;br&gt;
✅ Each execution context has a creation and an execution phase. &lt;br&gt;
✅ Hoisting happens in the creation phase due to the scan of the code. &lt;br&gt;
✅ &lt;code&gt;const&lt;/code&gt; and &lt;code&gt;let&lt;/code&gt; solved the initialization issues in JS by storing variables in TDZ&lt;br&gt;
✅ The scope chain allows functions to access variables from their parent contexts (lexical scoping)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What Are Embeddings?: How AI Knows a Cat and a Kitten Are Related ⭐</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:02:11 +0000</pubDate>
      <link>https://dev.to/ale3oula/what-are-embeddings-how-ai-knows-a-cat-and-a-kitten-are-related-232c</link>
      <guid>https://dev.to/ale3oula/what-are-embeddings-how-ai-knows-a-cat-and-a-kitten-are-related-232c</guid>
      <description>&lt;p&gt;This is a very simplified version of what an embedding is and is meant for beginners. Felt that I had to put a disclaimer here for the ai bros. &lt;/p&gt;

&lt;h2&gt;
  
  
  The question &lt;code&gt;embeddings&lt;/code&gt; answer
&lt;/h2&gt;

&lt;p&gt;How does a computer "know" that a cat and a kitten are related, that a dog is closer to a cat than to a car, and that a car is closer to a truck than to either a cat or a dog?? Computers don't understand meaning, they only understand numbers. So the trick is turning the meaning of text into numbers that math can work with.&lt;/p&gt;

&lt;p&gt;An embedding is simply a long list of numbers that represents the meaning of a piece of text. Modern embeddings often contain hundreds or even thousands of numbers, but you don't need to understand each number individually. Pieces of text with similar meaning end up close together in this mathematical space.&lt;/p&gt;

&lt;h2&gt;
  
  
  A map of meaning
&lt;/h2&gt;

&lt;p&gt;Imagine every word or phrase being placed on a giant map. Similar meanings end up close together, while unrelated end up far away. A model places words near each other based on how they are used in huge amounts of text, so "cat" and "kitten" end up near each other, "dog" and "puppy" are also close together and nearby to cats too, and something unrelated like a "car" sits in a completely different region.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkpcmh59d01sppdv0fa8p.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkpcmh59d01sppdv0fa8p.png" alt="words in the 2d space" width="799" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In reality, embeddings live in far more bigger structure than a map, meaning in multiple dimensions, usually hundreds or thousands, which is impossible to actually draw (or even understand with my small 3d brain). But the two-dimensional version captures the core idea: distance yields relationships. &lt;/p&gt;

&lt;h2&gt;
  
  
  Where the numbers actually come from
&lt;/h2&gt;

&lt;p&gt;An embedding isn't assigned by a person deciding "cat should be at this coordinate". During the training phase a model gradually learns how to convert text into embeddings based on the contexts it sees across enormous amounts of data. Words used in similar contexts end up near each other, because that's all the model ever sees: patterns in language.&lt;/p&gt;

&lt;p&gt;This is also why embeddings capture relationships that go beyond simple synonyms. Classic examples show that the relationship between "king" and "queen" is mathematically similar to the relationship between "man" and "woman".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for search and recommendations
&lt;/h2&gt;

&lt;p&gt;Traditional keyword search matches exact words. Searching for an "affordable laptop" in a keyword-based system might miss a product like a "budget-friendly notebook" because the words don't literally match, even we (the humans) know that the meaning is identical.&lt;/p&gt;

&lt;p&gt;Embedding-based search fixes this problem. Instead of matching words, it converts your search query into a point in the giant map and finds the nearest neighbors/points. This is why modern search and recommendation systems can surface something relevant even when you didn't use the "right" word.&lt;/p&gt;

&lt;h2&gt;
  
  
  Words aren't the only thing that can be embedded
&lt;/h2&gt;

&lt;p&gt;Despite using words like "cat" as examples, embeddings aren't limited to single words. Entire sentences, paragraphs, documents, images, and even audio can all be represented as embeddings. The idea stays exactly the same: similar meaning ends up close together in the giant map.&lt;/p&gt;

&lt;p&gt;In previous articles we talk about RAG and how this has a retrieval step. A simplified description of the retrieval step by adding the embeddings to the calculation will be: Your question is converted into an embedding, the documents have been embedded already, and the system simply retrieves the ones that are closest in that embedding map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this shows up if you're building products
&lt;/h2&gt;

&lt;p&gt;If you're building search, recommendations, finding duplicate content, or anything that needs to group or match content by meaning rather than exact text, embeddings are usually the tool for it, not string matching anymore.&lt;/p&gt;

&lt;p&gt;A few practical things worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documents are usually embedded once and stored. When a user searches, only the new query needs to be embedded, making retrieval much faster.&lt;/li&gt;
&lt;li&gt;Similarity isn't the same as correctness. Two pieces of text can be very similar while still answering the wrong question. That's why many systems rank, filter, or validate results after the similarity search.&lt;/li&gt;
&lt;li&gt;The embedding model matters. Different embedding models place things differently, and a model tuned for one domain may not embed specialised or technical content as usefully as one tuned for that domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;If you'd like to dive deeper into embeddings and how they're used in modern AI systems, these are excellent starting points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anthropic – Embeddings Documentation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://platform.claude.com/docs/en/build-with-claude/embeddings" rel="noopener noreferrer"&gt;https://platform.claude.com/docs/en/build-with-claude/embeddings&lt;/a&gt;&lt;br&gt;&lt;br&gt;
A practical guide explaining what embeddings are, how they work, and how they're used for semantic search, recommendations, and retrieval. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenAI – Embeddings Guide &amp;amp; FAQ&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://help.openai.com/en/articles/6824809-embeddings-faq" rel="noopener noreferrer"&gt;https://help.openai.com/en/articles/6824809-embeddings-faq&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Covers OpenAI's embedding models, common questions, distance metrics, and best practices. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Word2Vec: Efficient Estimation of Word Representations in Vector Space (2013)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://arxiv.org/abs/1301.3781" rel="noopener noreferrer"&gt;https://arxiv.org/abs/1301.3781&lt;/a&gt;&lt;br&gt;&lt;br&gt;
The classic paper by Tomas Mikolov and colleagues that popularised learned word embeddings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pinecone – Dense Vector Embeddings Explained&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.pinecone.io/learn/series/nlp/dense-vector-embeddings-nlp/" rel="noopener noreferrer"&gt;https://www.pinecone.io/learn/series/nlp/dense-vector-embeddings-nlp/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
A visual, beginner-friendly explanation of dense vectors, embeddings, and semantic search, with examples beyond Word2Vec. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jay Alammar – The Illustrated Word2vec&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://jalammar.github.io/illustrated-word2vec/" rel="noopener noreferrer"&gt;https://jalammar.github.io/illustrated-word2vec/&lt;/a&gt;&lt;br&gt;
A visual, intuitive explainer on word embeddings, in the same style as his famous "Illustrated Transformer."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Embeddings &amp;amp; Vector Search in 2026: The Engineer's Complete Guide&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://jobsbyculture.com/blog/embeddings-vector-search-guide-2026" rel="noopener noreferrer"&gt;https://jobsbyculture.com/blog/embeddings-vector-search-guide-2026&lt;/a&gt;&lt;br&gt;
Covers embedding models, ANN algorithms (HNSW, IVF), and building production RAG pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How to Generate Better Embeddings for Vector Search&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://pr-peri.github.io/llm/2026/02/12/generate-embeddings-vector-search.html" rel="noopener noreferrer"&gt;https://pr-peri.github.io/llm/2026/02/12/generate-embeddings-vector-search.html&lt;/a&gt;&lt;br&gt;
Practical guide to improving retrieval quality via chunking, cleaning, metadata, hybrid search, and proper evaluation (Recall@K, MRR).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Embedding Models 2026: Tested on 50K Documents&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://pecollective.com/tools/best-embedding-models/" rel="noopener noreferrer"&gt;https://pecollective.com/tools/best-embedding-models/&lt;/a&gt;&lt;br&gt;
Compares OpenAI, Cohere, Voyage AI, and Jina embedding models on real retrieval benchmarks, not just MTEB scores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>eli5</category>
      <category>ai</category>
      <category>beginners</category>
      <category>basic</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Fri, 24 Jul 2026 15:04:00 +0000</pubDate>
      <link>https://dev.to/ale3oula/-53a4</link>
      <guid>https://dev.to/ale3oula/-53a4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj" class="crayons-story__hidden-navigation-link"&gt;Tokens aren't words: what actually happens when you send a prompt&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ale3oula" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png" alt="ale3oula profile" class="crayons-avatar__image" width="100" height="100"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ale3oula" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alexandra
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alexandra
                
              
              &lt;div id="story-author-preview-content-4180584" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ale3oula" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png" class="crayons-avatar__image" alt="" width="100" height="100"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alexandra&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 19&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj" id="article-link-4180584"&gt;
          Tokens aren't words: what actually happens when you send a prompt
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/eli5"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;eli5&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Stop Hiring a Rocket Scientist to Check If a Box Is Empty</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Thu, 23 Jul 2026 17:26:44 +0000</pubDate>
      <link>https://dev.to/ale3oula/stop-hiring-a-rocket-scientist-to-check-if-a-box-is-empty-1i4c</link>
      <guid>https://dev.to/ale3oula/stop-hiring-a-rocket-scientist-to-check-if-a-box-is-empty-1i4c</guid>
      <description>&lt;p&gt;One thing I've been thinking about lately is what trade-offs companies are willing to make in order to market their products as "AI-powered."&lt;/p&gt;

&lt;h2&gt;
  
  
  A tale as old as 2023
&lt;/h2&gt;

&lt;p&gt;A team needs to validate an email address. Someone asks, "What if we used AI?" Five minutes later there's a model call, an API key, a loading spinner, a monthly bill &amp;amp; somehow Kubernetes got involved. Congratulations, you've successfully turned O(1) into "please wait while we contact the cloud."&lt;/p&gt;

&lt;p&gt;This is not an argument against AI. Large language models are highly effective for many categories of problems. The issue is not the technology itself, but its application to tasks that never needed it in the first place, because it's new and shiny and everyone is doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual differences
&lt;/h2&gt;

&lt;p&gt;Here's an unglamorous truth: an if statement &amp;amp; an LLM call are not doing the same job. They're built for different kinds of problems, and their differences are greater than people give it credit for.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ful19umv0lr4hqkrh3lj0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ful19umv0lr4hqkrh3lj0.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An if statement runs in a millisecond, costs nothing per call, and gives you the exact same answer every single time for the same input (deterministic). An LLM call, takes real time, costs real money, and can give you a slightly different answer to the exact same question depending on the day, the model version, or the wind direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  if-statement or AI?
&lt;/h2&gt;

&lt;p&gt;Reach for an if statement (or a regex, or .. or ..) when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The rule is simple and well-defined. "Is this a valid email format?" "Is the cart total over $50?" "Is the field empty?"&lt;/li&gt;
&lt;li&gt;You need the same input to produce the same output. Billing logic, permission checks, form validation. No your users don't want their invoice total to vary by mood.&lt;/li&gt;
&lt;li&gt;Performance is important and there is no ambiguity requiring interpretation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reach for AI when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The task requires judgement. Summarise an article, classifying open-ended free text into fuzzy categories.&lt;/li&gt;
&lt;li&gt;The input space is too large or unpredictable. You can't write an if statement for "understand what this customer is actually frustrated about" from a paragraph of free text.&lt;/li&gt;
&lt;li&gt;Some variability in output is fine, or even desirable. A creative writing assistant that gives the exact same suggestion every time isn't actually that useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More examples than you asked for, because this pattern is everywhere
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Password strength meter.&lt;/strong&gt; "At least 8 characters, one number, one symbol" is a rule. Come on. We've been solving this since MySpace was a thing. No model needed, no matter how tempting "AI-powered password feedback" sounds on a feature list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flagging a support ticket as urgent.&lt;/strong&gt; If "urgent" just means "contains the word 'urgent' or 'broken'," that's a keyword check. If "urgent" means understanding the tone, the context, and the severity from a paragraph of a frustrated customer wrote at 2am, that's no longer a keyword problem. That's a language understanding problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discount code validation.&lt;/strong&gt; "Is this code in our database and not expired?" is a lookup, full stop. Please don't ask a model to check a database for you; that's what the database is for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sorting a list by price.&lt;/strong&gt; Please don't spend $0.002 to rediscover ascending order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summarizing 200 pages of meeting notes into three takeaways.&lt;/strong&gt; A hard to write a rule for. This is a real, appropriate use of a model's judgement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writing a product description from a spec sheet.&lt;/strong&gt; Turning structured facts into natural, readable list is a language task. This is AI doing what it's actually good at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of choosing the wrong tool
&lt;/h2&gt;

&lt;p&gt;This isn't just a complaint about over-engineering. Reaching for AI on an if-statement problem has real costs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Latency you didn't need to add. A local computation becomes a network request with inference time.&lt;/li&gt;
&lt;li&gt;Money you didn't need to spend. Each inference incurs a monetary cost that accumulates with usage. We've somehow managed to invent a subscription for if.&lt;/li&gt;
&lt;li&gt;Unpredictability you didn't ask for. If your business logic can quietly behave differently for the exact same input, you've turned a deterministic system into a probabilistic one. Now you get to debug "why did this work yesterday and not today" for a rule that used to just... work.&lt;/li&gt;
&lt;li&gt;A dependency you didn't need. Functionality becomes dependent on the availability, performance, and pricing of third-party AI services.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Reflect on our choices
&lt;/h2&gt;

&lt;p&gt;Before reaching for AI, ask: could I write this rule down in a sentence, and would that sentence still be true tomorrow? If yes, you probably want an if statement, not a model call. If the honest answer is "well, it depends, there's a lot of nuance, it's hard to actually pin down," that's usually the signal that you've found a problem AI is actually good at.&lt;/p&gt;

&lt;p&gt;AI earning its place in a product should feel like reaching for a tool that's uniquely suited to a hard problem, not like a reflex applied to everything because it's the exciting new thing to reach for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sometimes the most sophisticated piece of technology in the room is the engineer who knew not to call the model.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google's guidance on when to use ML — from Google's own People + AI Guidebook, on evaluating whether a problem needs machine learning: &lt;a href="https://developers.google.com/machine-learning/guides/rules-of-ml" rel="noopener noreferrer"&gt;https://developers.google.com/machine-learning/guides/rules-of-ml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Martin Fowler on YAGNI ("You Aren't Gonna Need It") — &lt;a href="https://lawsofsoftwareengineering.com/laws/yagni/" rel="noopener noreferrer"&gt;https://lawsofsoftwareengineering.com/laws/yagni/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic's guide to when (and when not) to use agents/LLMs — practical framing for deciding where a model call is actually justified: &lt;a href="https://www.google.com/search?client=firefox-b-d&amp;amp;q=Anthropic%27s+guide+to+when+%28and+when+not%29+to+use+agents" rel="noopener noreferrer"&gt;https://www.google.com/search?client=firefox-b-d&amp;amp;q=Anthropic%27s+guide+to+when+%28and+when+not%29+to+use+agents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What is a context window, actually?</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Wed, 22 Jul 2026 09:30:02 +0000</pubDate>
      <link>https://dev.to/ale3oula/what-is-a-context-window-actually-13l6</link>
      <guid>https://dev.to/ale3oula/what-is-a-context-window-actually-13l6</guid>
      <description>&lt;p&gt;AI is moving fast, and it feels like there's a new concept to learn every week. In an effort to actually understand this whole new world instead of just skimming past it, I've been writing ELI5 articles breaking down concepts that show up constantly in AI conversations but rarely get explained simply. This time, a term that gets thrown around a lot without much explanation: the context window.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI 101 Recap
&lt;/h2&gt;

&lt;p&gt;The context window is the total number of input and output tokens an LLM can consider while generating a response. Your prompt, the conversation history, and even the model's response all share that same "budget" of tokens. As a conversation with an LLM grows longer, more tokens live in this window.&lt;/p&gt;

&lt;p&gt;So far so good. Every AI model has a limit on how many tokens it can hold in its "working memory" at once. So the interesting part with the context window is what happens when you reach these limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are there limits?
&lt;/h2&gt;

&lt;p&gt;There are several reasons models have context window limits. Processing more tokens requires more memory and computation, making every request slower and more expensive. On top of that, today's models struggle to use very long contexts effectively. They naturally pay more attention to the beginning and end of a conversation than the middle ("lost in the middle" problem).&lt;/p&gt;

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

&lt;p&gt;An AI model has no persistent memory between conversations. Within a long conversation, it only sees whatever still fits inside its context window. Think of it as a sliding window: as new messages come in, older ones eventually slide out and are no longer visible to the model.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5pak57bxfc6re6o911ue.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5pak57bxfc6re6o911ue.png" alt=" " width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is why a long conversation can feel like the model has "forgotten" something you told it early on. It doesn't actually forget, it just no longer has access to that part of the conversation, unless the product you're using has built something extra on top to handle it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How RAG helps
&lt;/h2&gt;

&lt;p&gt;RAG (retrieval-augmented generation) sounds technical, but the idea is simple: look it up before you answer, instead of guessing from memory.&lt;/p&gt;

&lt;p&gt;Think of the model as a smart intern who read a huge pile of general knowledge, but has never seen your company's internal docs. If you ask that intern a question about your product, you wouldn't expect them to know the answer off the top of their head.&lt;/p&gt;

&lt;p&gt;The flow looks more or less like 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp9odwbhq1gtx7bo8q7lq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp9odwbhq1gtx7bo8q7lq.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's RAG. Before generating a response, the system retrieves the most relevant pieces of information and adds only those to the prompt. Instead of searching through thousands of documents itself, the model receives just the information it needs.&lt;/p&gt;

&lt;p&gt;This fixes two problems at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It solves the "too much to fit" problem.&lt;/strong&gt; You don't need to cram an entire wiki into the context window — just the relevant slice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It solves the "the model doesn't know that" problem.&lt;/strong&gt; Training data has a cutoff and doesn't include your private docs. Retrieval hands the model current, specific facts instead of asking it to make something up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's not magic, though. If the search step grabs the wrong page the model's answer will be wrong too. A RAG system is only as good as its retrieval step, not just the model doing the writing at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why longer context isn't automatically better
&lt;/h2&gt;

&lt;p&gt;Newer models advertise huge context windows, sometimes hundreds of thousands of tokens. It's tempting to think the fix for all of this is simple: just make the window bigger, and pile everything in.&lt;/p&gt;

&lt;p&gt;Turns out that doesn't hold up as well as it sounds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It costs more and takes longer. Every extra token in the prompt means more processing on every single request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Models don't "read" a huge context evenly. They tend to pay attention to the start and the end of a long conversation, and quietly lose track of things in the middle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More text means more noise. A huge pile of context gives the model more chances to get distracted by something irrelevant, outdated, or conflicting. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A bigger context window isn't automatically better. It gives the model more information to work with, but also more opportunities to be distracted. That's why RAG matters: retrieving a small set of relevant information is usually more effective than hoping the model can make sense of everything at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Context windows&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.claude.com" rel="noopener noreferrer"&gt;Anthropic's context window documentation&lt;/a&gt; — official, model-specific limits and behavior&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2307.03172" rel="noopener noreferrer"&gt;"Lost in the Middle: How Language Models Use Long Contexts"&lt;/a&gt; (Liu et al., 2023) — the research paper behind the finding that models underuse the middle of long contexts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://platform.openai.com/docs/models" rel="noopener noreferrer"&gt;OpenAI's models documentation&lt;/a&gt; — useful for comparing how another provider frames the same constraint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2005.11401" rel="noopener noreferrer"&gt;"Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks"&lt;/a&gt; (Lewis et al., 2020) — the original RAG paper from Meta AI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.pinecone.io/learn/retrieval-augmented-generation/" rel="noopener noreferrer"&gt;Pinecone's guide to RAG&lt;/a&gt; — practical, vendor-neutral explanation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://python.langchain.com" rel="noopener noreferrer"&gt;LangChain RAG documentation&lt;/a&gt; — hands-on look at how RAG pipelines are built&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/what-is/retrieval-augmented-generation/" rel="noopener noreferrer"&gt;AWS: "What is RAG?"&lt;/a&gt; — plain-language explainer&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ibm.com/topics/retrieval-augmented-generation" rel="noopener noreferrer"&gt;IBM: "What is retrieval-augmented generation?"&lt;/a&gt; — another accessible, non-technical framing&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>eli5</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Does the web feel slower these days?</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Mon, 20 Jul 2026 08:17:49 +0000</pubDate>
      <link>https://dev.to/ale3oula/does-the-web-feel-slower-these-days-9pi</link>
      <guid>https://dev.to/ale3oula/does-the-web-feel-slower-these-days-9pi</guid>
      <description>&lt;p&gt;Many apps I've been using lately seem to have the same issue. HBO Max buffers all the time; Instagram stops mid-scroll. At the same time, internet providers promise the fastest internet we could ever have. How is this contradiction happening? How can the internet be in it's fastest and slowest era?&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just a feeling, but it's also not new
&lt;/h2&gt;

&lt;p&gt;Web pages have been getting heavier for a long time, well before AI features were a factor. Most pages these days are bloated with JS, media and chatbots. Cloudflare's own performance research points out that web pages have grown 6 to 9 percent every year for roughly a decade. Separately, HTTP Archive data puts the median desktop page at around 2.3 megabytes today. So the starting point here is: the web has been trending heavier for years and the real question is whether AI is making an existing trend worse, and in what specific ways.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frudsj56ky2qvc5x6g0ri.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frudsj56ky2qvc5x6g0ri.png" alt=" " width="799" height="496"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqa5l6eto597rxvwulk5y.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqa5l6eto597rxvwulk5y.png" alt=" " width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI features actually add to the weight
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chat widgets add real weight, and it varies a lot by vendor.&lt;/strong&gt; Independent benchmarking has found that a lightweight AI chat widget can add as little as 79KB of JavaScript, while a heavier one can add over 500KB and nearly a second of script execution 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqbv363l0eu9lua1xy5rj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqbv363l0eu9lua1xy5rj.png" alt=" " width="799" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This weight typically loads whether or not the visitor ever opens the widget. If a chat bubble sitting in the corner of a page is still costing something on every single page load, for every visitor, most of whom will never click it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search results now often think before they answer.&lt;/strong&gt; AI-generated answers and summaries now appear in a large share of search results, with estimates putting AI-generated answers in roughly half of Google queries in early 2026. Search used to be near-instant: type, get a results page. Now, a visible "generating" moment has been inserted into an interaction that used to feel immediate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent and crawler traffic is adding load most people never see.&lt;/strong&gt; Beyond what a human visitor experiences directly, the sheer volume of automated AI agents and crawlers hitting websites has grown sharply. Cloudflare has reported that agentic traffic made up close to 10 percent of its network requests as of March 2026, up 60 percent year over year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant interactions are quietly becoming round trips.&lt;/strong&gt; Actions that used to be handled instantly, client-side, are increasingly being routed through an AI call instead: smarter autocomplete, AI-assisted form suggestions, AI-powered search-as-you-type. Even when the AI call is fast, it's still a network round trip standing where synchronous logic used to be. Multiply that across a page with several "smart" features, and small delays start adding up into something a user can actually feel, even if no single delay is dramatic on its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some of this is self-inflicted, not inherent.&lt;/strong&gt; Not every AI-related delay comes from the AI itself. Some products deliberately throttle how fast a response streams in, purely for the visual effect of "watching it type," even when the full answer was actually ready almost immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it compounds instead of replacing anything
&lt;/h2&gt;

&lt;p&gt;The important part is that none of this is replacing the older sources of page bloat, the images, the trackers, the ad scripts, the frameworks. It's stacking on top of a foundation that was already getting heavier every year. A page that was already carrying a few megabytes of scripts and media now often also carries a chat widget, an AI search layer, and a handful of AI-backed interactions that used to be instant and local.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you're building these features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lazy-load anything AI-related that isn't part of the core experience.&lt;/strong&gt; A chat widget that loads asynchronously after the page renders shouldn't block anything a visitor actually came for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't let "smart" replace "fast" for things that were already fast.&lt;/strong&gt; If a client-side interaction worked well without a network round trip, adding an AI call to it should have a clear payoff, not just because it's possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be honest about whether streaming delay is earning its keep.&lt;/strong&gt; If a response is ready, showing it is usually better than manufacturing a typing animation purely for effect. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure the actual Core Web Vitals impact of any AI feature before shipping it&lt;/strong&gt;, the same way you'd measure any other third-party script. "It's AI" isn't an exemption from the same performance discipline everything else on the page has to meet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web probably isn't slower because AI is inherently heavy. It's slower because we're stacking new "thinking" steps and new scripts on top of a foundation that was already trending heavier every year, often without asking whether each addition is actually earning the delay it introduces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.cloudflare.com/shared-dictionaries/" rel="noopener noreferrer"&gt;Shared Dictionaries: compression that keeps up with the agentic web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare on web bloat and shared dictionaries&lt;/strong&gt; — data on the decade-long trend of growing page weight and rising agentic traffic: &lt;a href="https://www.startuphub.ai/ai-news/technology/2026/cloudflare-shrinks-web-bloat-with-shared-dictionaries" rel="noopener noreferrer"&gt;startuphub.ai/ai-news/technology/2026/cloudflare-shrinks-web-bloat-with-shared-dictionaries&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.captaindns.com/en/blog/median-web-page-weight-2025" rel="noopener noreferrer"&gt;Median web page weight in 2025: 15 years of web bloat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DebugBear's chat widget performance benchmark&lt;/strong&gt; — a comparison of real-world JavaScript weight across popular chat widget vendors: &lt;a href="https://www.debugbear.com/blog/chat-widget-site-performance" rel="noopener noreferrer"&gt;debugbear.com/blog/chat-widget-site-performance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Archive - Page weight&lt;/strong&gt; — &lt;a href="https://almanac.httparchive.org/en/2025/page-weight" rel="noopener noreferrer"&gt;httparchive.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;web.dev on Core Web Vitals&lt;/strong&gt; — Google's official guidance on measuring and improving real-world page performance: &lt;a href="https://web.dev/vitals" rel="noopener noreferrer"&gt;web.dev/vitals&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Tokens aren't words: what actually happens when you send a prompt</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Sun, 19 Jul 2026 15:56:08 +0000</pubDate>
      <link>https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj</link>
      <guid>https://dev.to/ale3oula/tokens-arent-words-what-actually-happens-when-you-send-a-prompt-4baj</guid>
      <description>&lt;p&gt;AI is moving fast, and it feels like there's a new concept to learn every week. In an effort to actually understand this whole new world instead of just skimming past it, I started writing these ELI5 articles breaking down the concepts that show up constantly in AI conversations but rarely get explained simply. First up: tokens, and what's actually happening when you send a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokens, tokens everywhere
&lt;/h2&gt;

&lt;p&gt;Every time you type into ChatGPT, Claude, or Copilot, your text doesn't go into the model as words. It gets chopped up first, into pieces called &lt;strong&gt;tokens&lt;/strong&gt;. Sometimes this is a whole word, sometimes half a word, sometimes just a punctuation mark. The model never sees your sentence. It sees a sequence of numbers standing in for those pieces.&lt;/p&gt;

&lt;p&gt;This is one of those things that's easy to skip over as a detail, but once you understand it, a bunch of AI behavior suddenly makes sense: why long prompts cost more, why some words seem to trip models up, why "count the letters in this word" is weirdly hard for an LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step one: splitting the text
&lt;/h2&gt;

&lt;p&gt;Take the word &lt;strong&gt;"accessibility."&lt;/strong&gt; A tokenizer doesn't treat it as one unit/word. It's common enough to be one token, but a lot of real-world text splits into recognizable chunks. Common short words like "the" or "cat" are usually a single token. Longer, less frequent, or more technical words often get broken into two or more pieces.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvrdow4z9ed2verwffxlv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvrdow4z9ed2verwffxlv.png" alt="How tokanization works" width="800" height="412"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fboolfcgtpby1xci4p453.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fboolfcgtpby1xci4p453.png" alt=" " width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step two: turning pieces into numbers
&lt;/h2&gt;

&lt;p&gt;Each token maps to a number, based on a fixed vocabulary the model was trained with. So "access" might become 5426, and "ibility" might become 9821. The model doesn't process letters or meaning directly. It processes a list of numbers and &lt;em&gt;predicts what number is statistically likely to come next&lt;/em&gt;, then translates that number back into text for you to read.&lt;/p&gt;

&lt;p&gt;This is why an LLM can struggle with something like reversing a word or counting how many "r"s are in "strawberry". That's because it's not looking at s-t-r-a-w-b-e-r-r-y character by character. It's looking at a couple of opaque token chunks and has no direct access to the letters inside them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fun facts of tokanization
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Whitespace and punctuation count as tokens too.&lt;/strong&gt; A sentence full of short words and spaces can end up costing more tokens than a shorter sentence built from fewer, longer words. Token count isn't the same as word count or character count.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Non-English text often tokenizes worse.&lt;/strong&gt; Most models are trained primarily on English text, so the same sentence in another language can break into noticeably more tokens to represent the same meaning. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Token limits define the "context window."&lt;/strong&gt; This is the part that matters most if you're building products on top of these models, not just using them. Every model has a maximum number of tokens it can hold in memory at once — your prompt, the conversation history, and the response all share that budget. If you go over this limit the context will get condensed: older messages get dropped, input gets truncated, or you hit an error.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ogviby0tdiuc270ekto.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ogviby0tdiuc270ekto.png" alt=" " width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters if you're a frontend engineer
&lt;/h2&gt;

&lt;p&gt;Tokenization isn't just a backend or ML-team concern anymore. Most products nowaday build something that streams AI output, that means you're designing around token budgets whether you realize it or not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming UX: responses arrive token by token, not word by word, which is why text sometimes appears to render in odd fragments before normalizes.&lt;/li&gt;
&lt;li&gt;Truncation handling: what does your UI do when a conversation hits the context limit?&lt;/li&gt;
&lt;li&gt;Cost and latency: token count drives both API cost and response time, so a feature that quietly sends more context than it needs is a real product cost, not just a technical detail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding tokens won't make you a machine learning engineer. But it will make you a better engineer of the products sitting on top of these models, which, increasingly, is most of us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Tokenizer&lt;/strong&gt; — paste any text and see it split into tokens live: platform.openai.com/tokenizer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic's token-counting docs&lt;/strong&gt; — how context windows and token limits work across Claude models: docs.claude.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tiktoken&lt;/strong&gt; — the open-source library OpenAI uses for tokenization, if you want to count tokens programmatically: github.com/openai/tiktoken&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hugging Face Tokenizers&lt;/strong&gt; — for exploring tokenization across different open models, not just one vendor: huggingface.co/docs/tokenizers&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>eli5</category>
      <category>ai</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Mon, 13 Jul 2026 21:11:30 +0000</pubDate>
      <link>https://dev.to/ale3oula/-15in</link>
      <guid>https://dev.to/ale3oula/-15in</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n" class="crayons-story__hidden-navigation-link"&gt;Passion Lens: Discover the Passion Hidden in Your Photographs&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;DEV Weekend Challenge: Passion Edition Submission&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ale3oula" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png" alt="ale3oula profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ale3oula" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alexandra
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alexandra
                
              
              &lt;div id="story-author-preview-content-4121667" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ale3oula" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alexandra&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n" id="article-link-4121667"&gt;
          Passion Lens: Discover the Passion Hidden in Your Photographs
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/weekendchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;weekendchallenge&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;12&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              4&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Passion Lens: Discover the Passion Hidden in Your Photographs</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Sat, 11 Jul 2026 21:08:36 +0000</pubDate>
      <link>https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n</link>
      <guid>https://dev.to/ale3oula/passion-lens-discover-the-passion-hidden-in-your-photographs-4i7n</guid>
      <description>&lt;h1&gt;
  
  
  Passion Lens: Discover the Passion Hidden in Your Photographs
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;When the challenge has a theme about our passions, mine was clear. I love photography. I picked up a camera more than 10 years ago, and I guess I've done my part to reinforce the stereotype that every frontend developer is secretly a photographer. To me,  photography is a story, a feeling, a moment, a landscape. That's why i love landscapes and street photography. &lt;/p&gt;

&lt;p&gt;The project's idea is simple: what the pictures you take say about you? What if you have a personal photography expert that let you capture the essence and learn something new about yourself?&lt;/p&gt;

&lt;p&gt;You just upload a photo, share where it was taken and why it matters to you, and choose your storytelling voice: documentary, cinematic, poetic, or travel journal.&lt;/p&gt;

&lt;p&gt;Passion Lens uses Google Gemini to analyze the visible composition alongside the photographer’s own context. It creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A title and three moods&lt;/li&gt;
&lt;li&gt;A personal memory&lt;/li&gt;
&lt;li&gt;Visual observations grounded in the photograph&lt;/li&gt;
&lt;li&gt;Composition notes&lt;/li&gt;
&lt;li&gt;A reflection on what the photograph may reveal about the photographer’s passions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The experience is designed to feel reflective rather than transactional. &lt;/p&gt;

&lt;p&gt;Once the memory is ready, the user can listen to it through ElevenLabs narration or download the complete memory as a PDF.&lt;/p&gt;

&lt;p&gt;Passion Lens begins with a photograph, but its real subject is the person behind the camera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://passion-lens.netlify.app/" rel="noopener noreferrer"&gt;Try Passion Lens&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdt3j515fy5cdr8sdh2q1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdt3j515fy5cdr8sdh2q1.png" alt="Create your storytelling about your photos" width="799" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a photograph.&lt;/li&gt;
&lt;li&gt;Add a location and a few personal words.&lt;/li&gt;
&lt;li&gt;Select a storytelling style.&lt;/li&gt;
&lt;li&gt;Generate the memory.&lt;/li&gt;
&lt;li&gt;Explore Gemini’s story, moods, visual observations, and passion reflection.&lt;/li&gt;
&lt;li&gt;Listen to the narrated memory.&lt;/li&gt;
&lt;li&gt;Download the finished memory as a PDF.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;💻 &lt;a href="https://github.com/aLe3ouLa/passion-lens" rel="noopener noreferrer"&gt;View the source code on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Passion Lens uses React, TypeScript, Vite, and Framer Motion on the frontend, with an Express server handling the AI integrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Gemini
&lt;/h3&gt;

&lt;p&gt;The uploaded photograph and the photographer’s written context are sent as a multimodal request to Gemini.&lt;/p&gt;

&lt;p&gt;Gemini returns a structured JSON response containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;moods&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;visualDetails&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;story&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;photographerInsight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;passionProfile&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using a response schema made the output predictable enough to drive the designed memory interface directly.&lt;/p&gt;

&lt;p&gt;The prompt explicitly tells Gemini not to invent events, identities, relationships, professions, destinations, or emotions that cannot be observed. If a person appears in the photograph, the model describes only visible details. I tried many prompts, but it still vastly makes up things sometimes. :/&lt;/p&gt;

&lt;h3&gt;
  
  
  ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs turns the generated story into spoken narration.&lt;/p&gt;

&lt;p&gt;The photograph slowly brightens and moves while narration is playing, making the memory feel alive without distracting from the story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Experience
&lt;/h3&gt;

&lt;p&gt;The final card asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does this photograph reveal about you?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where Passion Lens moves beyond “AI writes a story about my photo.” It begins helping the photographer understand why certain moments attract their attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  PDF Export
&lt;/h3&gt;

&lt;p&gt;The browser generates a downloadable PDF with jsPDF.&lt;/p&gt;

&lt;p&gt;It includes the photograph, title, location, moods, story, Composition Notes, and passion profile. This gives the user something lasting to keep or share after the experience ends.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;React Router&lt;/li&gt;
&lt;li&gt;Framer Motion&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;Google Gemini API&lt;/li&gt;
&lt;li&gt;ElevenLabs API&lt;/li&gt;
&lt;li&gt;jsPDF&lt;/li&gt;
&lt;li&gt;Multer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges and Lessons
&lt;/h2&gt;

&lt;p&gt;A memory should feel personal and evocative, but an image model should not quietly invent facts about someone’s life. Separating user-provided emotional context from model-observed visual details helped preserve that boundary.&lt;/p&gt;

&lt;p&gt;Structured Gemini output was another important decision. Instead of parsing free-form prose, the application receives a defined object that can be safely mapped into different parts of the interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Best Use of Google AI
&lt;/h3&gt;

&lt;p&gt;Gemini is the central intelligence behind Passion Lens. It combines multimodal image understanding with the photographer’s context to produce grounded visual observations, a personal narrative, Composition Notes, and a carefully framed passion profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs transforms each generated story into an intimate narrated memory. Voice makes the result feel less like generated text and more like revisiting a moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;The current MVP analyzes one photograph at a time.&lt;/p&gt;

&lt;p&gt;The next step is persistence: allowing users to build a private collection of memories. Passion Lens could then identify recurring subjects, environments, colors, emotions, and composition choices across the collection.&lt;/p&gt;

&lt;p&gt;That is the larger promise of the project:&lt;/p&gt;

&lt;p&gt;Your photographs do not only show where you have been. Together, they may reveal what you keep searching for.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>Being an engineer in the AI era</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Tue, 07 Jul 2026 20:10:15 +0000</pubDate>
      <link>https://dev.to/ale3oula/being-an-engineer-in-the-ai-era-277p</link>
      <guid>https://dev.to/ale3oula/being-an-engineer-in-the-ai-era-277p</guid>
      <description>&lt;p&gt;I hesitated to write this.&lt;/p&gt;

&lt;p&gt;Not because I don’t have an opinion about AI in software engineering, but because it sometimes feels increasingly difficult to have nuanced conversations about it.&lt;/p&gt;

&lt;p&gt;I worked in an environment where being “AI native” was part of the identity. And when a technology becomes part of a company’s identity, questioning it can feel almost uncomfortable. The conversation quickly moves from &lt;em&gt;“where does this create value?”&lt;/em&gt; to &lt;em&gt;“how do we put AI everywhere?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But I think we need more honest conversations.&lt;/p&gt;

&lt;p&gt;AI is powerful. There is no doubt about that.&lt;/p&gt;

&lt;p&gt;It helps me write code faster. It helps me explore unfamiliar areas of a codebase. It can remove repetitive work and accelerate experimentation.&lt;/p&gt;

&lt;p&gt;But there is something important we should not forget:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed is not the same as progress.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Not everything needs AI
&lt;/h2&gt;

&lt;p&gt;The truth is, not every problem needs artificial intelligence.&lt;/p&gt;

&lt;p&gt;Not every business needs AI. Not every product needs AI features. Not every interaction needs to be optimized or automated.&lt;/p&gt;

&lt;p&gt;Especially in industries built around people.&lt;/p&gt;

&lt;p&gt;Hospitality, for example, is fundamentally about human connection. The experience someone remembers is often not the automated process behind the scenes, it is the person who cared, noticed, helped, and went the extra mile.&lt;/p&gt;

&lt;p&gt;There is a Greek word I love: &lt;strong&gt;meraki&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It means putting a part of yourself into what you do. Doing something with love, creativity, and care.&lt;/p&gt;

&lt;p&gt;And I think this concept is becoming increasingly important in software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The craft behind the code
&lt;/h2&gt;

&lt;p&gt;When you genuinely care about your work, you don’t just want to eliminate every inconvenient part of it.&lt;/p&gt;

&lt;p&gt;The difficult parts are where you grow.&lt;/p&gt;

&lt;p&gt;Reading confusing code. Debugging strange production issues. Getting feedback from teammates. Having discussions about architecture. Making mistakes and learning from them.&lt;/p&gt;

&lt;p&gt;These experiences build engineering intuition.&lt;/p&gt;

&lt;p&gt;Software engineering has changed dramatically in the last few years. AI-assisted development is becoming part of our daily workflow, and I believe there is a lot of value in it.&lt;/p&gt;

&lt;p&gt;But the reason AI makes me better today is because I learned the fundamentals before it existed.&lt;/p&gt;

&lt;p&gt;I learned how systems behave.&lt;br&gt;
I learned how to debug without an answer being generated for me.&lt;br&gt;
I learned how to question solutions instead of blindly accepting them.&lt;br&gt;
I learned through feedback, collaboration, and years of solving problems.&lt;/p&gt;

&lt;p&gt;AI amplifies existing knowledge. It does not magically create engineering judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when we outsource thinking?
&lt;/h2&gt;

&lt;p&gt;One of the things I worry about is not AI itself.&lt;/p&gt;

&lt;p&gt;It is the temptation to outsource the parts of engineering that make us engineers.&lt;/p&gt;

&lt;p&gt;Architecture exploration.&lt;br&gt;
Technical discussions.&lt;br&gt;
Understanding trade-offs.&lt;br&gt;
Questioning assumptions.&lt;br&gt;
Designing solutions together.&lt;/p&gt;

&lt;p&gt;A company is not just a machine that transforms requirements into code.&lt;/p&gt;

&lt;p&gt;A company is a collection of people with different experiences, perspectives, and expertise. The best solutions usually appear through conversations, disagreements, and collaboration.&lt;/p&gt;

&lt;p&gt;If we delegate all exploration and architecture decisions to agents, what happens to the collective intelligence of the team?&lt;/p&gt;

&lt;p&gt;What happens to the engineers who no longer build intuition because they never had to struggle?&lt;/p&gt;

&lt;p&gt;What happens to the products created by people who never deeply understood the problems they were solving?&lt;/p&gt;

&lt;p&gt;We might become very efficient at producing software nobody feels connected to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building software with meaning
&lt;/h2&gt;

&lt;p&gt;I miss the feeling of building something meaningful.&lt;/p&gt;

&lt;p&gt;I miss challenging architecture decisions. I miss deep technical discussions. I miss the excitement of solving hard problems with people who care.&lt;/p&gt;

&lt;p&gt;Because the best software is not created by the fastest person typing the most code.&lt;/p&gt;

&lt;p&gt;It is created by people who understand the problem, care about the users, and bring their experience into every decision.&lt;/p&gt;

&lt;p&gt;I love building useful products.&lt;br&gt;
I love seeing customers happy because something we created solved a real problem.&lt;br&gt;
I love software engineering because it is a craft.&lt;/p&gt;

&lt;p&gt;AI can help us create faster. It can help us explore more. It can remove friction.&lt;/p&gt;

&lt;p&gt;But we should be careful not to remove the very things that make building software meaningful.&lt;/p&gt;

&lt;p&gt;The future of engineering should not be humans versus AI.&lt;/p&gt;

&lt;p&gt;It should be humans using AI while protecting curiosity, craftsmanship, and ownership.&lt;/p&gt;

&lt;p&gt;Because without those things, we are not building software. We are just generating output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue
&lt;/h2&gt;

&lt;p&gt;Thank you for reading my messy thoughts, since today i got laid off because my company wants to be AI native, it felt appropriate to share my fears for the future to a bunch of strangers.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>HTML &lt;abbr&gt; Tag 📝</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Thu, 25 Dec 2025 17:48:48 +0000</pubDate>
      <link>https://dev.to/ale3oula/html-tag-57l4</link>
      <guid>https://dev.to/ale3oula/html-tag-57l4</guid>
      <description>&lt;p&gt;Ever wanted to be super semantic and helpful to your users and machines? The HTML &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; tag is your secret weapon for abbreviations! It's tiny, but mighty for accessibility and clarity. Let's dive in!&lt;/p&gt;

&lt;h4&gt;
  
  
  What it Does 🧙‍♀️
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; tag marks up an abbreviation or acronym. Its superpower? When you add a &lt;code&gt;title&lt;/code&gt; attribute, it creates a magical tooltip on hover, revealing the full term!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;abbr&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Today I Learned"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;TIL&lt;span class="nt"&gt;&amp;lt;/abbr&amp;gt;&lt;/span&gt; something awesome!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Styling Shenanigans 🎨
&lt;/h4&gt;

&lt;p&gt;Browsers can be a bit... inconsistent with &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt;'s default look (looking at you, Safari!). Good news: it's super easy to style!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;abbr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;underline&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt; &lt;span class="nb"&gt;dotted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Custom underline! */&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* A friendly cursor to indicate more info! */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  The Great &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; vs &lt;code&gt;&amp;lt;acronym&amp;gt;&lt;/code&gt; War ⚔️ (A Brief History Lesson)
&lt;/h4&gt;

&lt;p&gt;Back in the day (the late '90s!), there was a fierce battle between Netscape's &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; and Microsoft's &lt;code&gt;&amp;lt;acronym&amp;gt;&lt;/code&gt;. Developers were caught in the crossfire! But fear not, HTML5 brought peace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;&amp;lt;acronym&amp;gt;&lt;/code&gt; is DEPRECATED!&lt;/strong&gt; 👋&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; WINS!&lt;/strong&gt; 🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, always use &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; – it covers both abbreviations &lt;em&gt;and&lt;/em&gt; acronyms! Easy peasy.&lt;/p&gt;

&lt;h4&gt;
  
  
  Getting Extra Semantic: &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; with &lt;code&gt;&amp;lt;dfn&amp;gt;&lt;/code&gt; 📚
&lt;/h4&gt;

&lt;p&gt;When you're &lt;em&gt;defining&lt;/em&gt; a term that's also an abbreviation, you can nest &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; inside &lt;code&gt;&amp;lt;dfn&amp;gt;&lt;/code&gt; (the definition element) for super-semantic goodness!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dfn&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;abbr&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Hypertext Markup Language"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;HTML&lt;span class="nt"&gt;&amp;lt;/abbr&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dfn&amp;gt;&lt;/span&gt;
  is the standard markup language for documents designed to be displayed in a web browser.
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Why Semantic HTML is Your Best Friend 🤝
&lt;/h4&gt;

&lt;p&gt;Using tags like &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; isn't just for looking pretty! It's about conveying meaning to &lt;em&gt;machines&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Accessibility:&lt;/strong&gt; Screen readers use semantic tags to properly interpret and communicate content to visually impaired users.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;SEO:&lt;/strong&gt; Search engine bots understand your content better, which can help with ranking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's our job as developers to make the web inclusive for &lt;em&gt;everyone&lt;/em&gt;! 💛&lt;/p&gt;




&lt;h4&gt;
  
  
  Mobile Mystery: Where Did My Tooltip Go? 🕵️‍♀️
&lt;/h4&gt;

&lt;p&gt;Uh oh! That lovely hover tooltip from &lt;code&gt;title&lt;/code&gt; doesn't work on mobile devices (no hover state!). But don't despair, clever solutions abound!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution 1: Display Full Term (on Small Screens)&lt;/strong&gt;&lt;br&gt;
For smaller screens, why not just show the full term?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;991px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;abbr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;' ('&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;')'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Appends the full title in parentheses */&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;Solution 2: Tap-to-Reveal (with &lt;code&gt;tabindex="0"&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;
Make the &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; focusable and reveal the full term on tap/focus!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;abbr&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Search Engine Optimization"&lt;/span&gt; &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;SEO&lt;span class="nt"&gt;&amp;lt;/abbr&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 css"&gt;&lt;code&gt;&lt;span class="nt"&gt;abbr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nd"&gt;:focus::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* Also works for :hover on desktop */&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;' ('&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s2"&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;h4&gt;
  
  
  Mobile-friendly patterns
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Show full text on small screens&lt;/li&gt;
&lt;li&gt;Or reveal on focus (use sparingly)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✨ TL;DR: Embrace &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt;! ✨
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Use  for abbreviations &amp;amp; acronyms
&lt;/li&gt;
&lt;li&gt;  Always include title&lt;/li&gt;
&lt;li&gt;  Don’t rely on hover alone&lt;/li&gt;
&lt;li&gt;  Semantic HTML = better web 🌍&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>beginners</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Alexandra</dc:creator>
      <pubDate>Thu, 19 Jun 2025 11:28:18 +0000</pubDate>
      <link>https://dev.to/ale3oula/-2pj8</link>
      <guid>https://dev.to/ale3oula/-2pj8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ale3oula/reactreactnode-vs-jsxelement-vs-reactreactelement-whats-the-damn-difference-2j0" class="crayons-story__hidden-navigation-link"&gt;🧠 React.ReactNode vs JSX.Element vs React.ReactElement – What's the Damn Difference?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ale3oula" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png" alt="ale3oula profile" class="crayons-avatar__image" width="100" height="100"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ale3oula" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alexandra
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alexandra
                
              
              &lt;div id="story-author-preview-content-2605510" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ale3oula" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155897%2Fbd0b9c2b-1685-487f-9de3-5096a19ae2eb.png" class="crayons-avatar__image" alt="" width="100" height="100"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alexandra&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ale3oula/reactreactnode-vs-jsxelement-vs-reactreactelement-whats-the-damn-difference-2j0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 19 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ale3oula/reactreactnode-vs-jsxelement-vs-reactreactelement-whats-the-damn-difference-2j0" id="article-link-2605510"&gt;
          🧠 React.ReactNode vs JSX.Element vs React.ReactElement – What's the Damn Difference?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ale3oula/reactreactnode-vs-jsxelement-vs-reactreactelement-whats-the-damn-difference-2j0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ale3oula/reactreactnode-vs-jsxelement-vs-reactreactelement-whats-the-damn-difference-2j0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
