<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Amelia Dutta</title>
    <description>The latest articles on Forem by Amelia Dutta (@amelia2802).</description>
    <link>https://forem.com/amelia2802</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F734803%2Fba9dc4b8-e049-4915-a389-45b16cb35051.jpeg</url>
      <title>Forem: Amelia Dutta</title>
      <link>https://forem.com/amelia2802</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/amelia2802"/>
    <language>en</language>
    <item>
      <title>Revisiting DSA Through Mini Projects #2: HTML Syntax Validator</title>
      <dc:creator>Amelia Dutta</dc:creator>
      <pubDate>Thu, 05 Feb 2026 15:43:26 +0000</pubDate>
      <link>https://forem.com/amelia2802/revisiting-dsa-through-mini-projects-2-html-syntax-validator-1c35</link>
      <guid>https://forem.com/amelia2802/revisiting-dsa-through-mini-projects-2-html-syntax-validator-1c35</guid>
      <description>&lt;p&gt;I am back with another mini project on revisiting DSA and today's topic is Stack! And how I built a simple HTML syntax checker app applying the Stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Stack?
&lt;/h2&gt;

&lt;p&gt;A stack is a collection of objects that are inserted and removed according to the &lt;strong&gt;&lt;em&gt;Last-In,First-Out(LIFO)&lt;/em&gt;&lt;/strong&gt; principle.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;For example:&lt;/strong&gt;&lt;/em&gt; Our Browser's Search history is an example of a stack where each time you visit a new web address, it will be pushed onto the stack of web addresses and by returning you are actually popping back the last searched address to the previously visited site!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second Project of This Series: A HTML Syntax Checker&lt;/strong&gt;&lt;br&gt;
Before diving deeper into the project and the logic, check the app here: &lt;a href="https://amelia2802.github.io/syntax-validator/" rel="noopener noreferrer"&gt;syntax-validator&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's See How It Works
&lt;/h2&gt;

&lt;p&gt;To check if HTML tags are balanced, we can use the &lt;em&gt;LIFO&lt;/em&gt; property of a Stack. The logic is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Scan the Code&lt;/strong&gt;&lt;/em&gt;: We read the HTML string from left to right.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Push Open Tags:&lt;/strong&gt;&lt;/em&gt; Whenever we encounter an opening tag (like &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;) we push it onto our stack. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Pop Closing Tags:&lt;/em&gt;&lt;/strong&gt; When we find a closing tag (like &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;/p&amp;gt;&lt;/code&gt;) we check the top of our stack. 

&lt;ul&gt;
&lt;li&gt;If the stack matches the current closing tag (e.g. top is div and current is /div) we pop it off. This means the tag was correctly closed!&lt;/li&gt;
&lt;li&gt;If the stack is empty or the tags don't match, we know the syntax is invalid.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After reading the whole string if the stack is completely empty it means every opening tag had a matching closing tag and our html code is valid!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I kept the implementation simple using vanilla JavaScript. Here is the snippet where the magic happens:&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;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// If it is an opening tag that means doesn't start with '/'&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
        &lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// If it is a Cclosing tag&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Check if we have anything to close&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid Syntax&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Check if it matches the last opened tag&lt;/span&gt;
        &lt;span class="c1"&gt;// Here tag.slice(1) removes the '/' so we compare "div" with "div"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()){&lt;/span&gt;
            &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid Syntax&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key methods here are &lt;em&gt;stack.push(tag)&lt;/em&gt; to add to our history of open tags and &lt;em&gt;stack.pop()&lt;/em&gt; to match them when we close a tag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitation
&lt;/h2&gt;

&lt;p&gt;As I was revising stack and wanted to make a simple project on that topic so this project has some limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Strict Matching:&lt;/strong&gt;&lt;/em&gt; This code checks for exact string matches. That means &lt;code&gt;&amp;lt;div class="hero-section"&amp;gt;&lt;/code&gt; wouldn't match &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt; because the strings are different! &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Empty Tags:&lt;/em&gt;&lt;/strong&gt; HTML has "empty/void" tags like &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;hr&amp;gt;&lt;/code&gt; that don't need a closing tag. Which is why this code will return this as an Invalid Tag!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project made me realize that finding the right data structure is only half the battle. While the stack was the perfect tool for the core logic, I realized that a real-world solution must handle more complex issues, such as attributes and empty tags.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>datastructures</category>
      <category>html</category>
    </item>
    <item>
      <title>Revisiting DSA Through Mini Projects #1: Optimizing a Phonebook with HashMap</title>
      <dc:creator>Amelia Dutta</dc:creator>
      <pubDate>Mon, 02 Feb 2026 10:24:27 +0000</pubDate>
      <link>https://forem.com/amelia2802/revisiting-dsa-through-mini-projects-1-optimizing-a-phonebook-with-hashmap-370l</link>
      <guid>https://forem.com/amelia2802/revisiting-dsa-through-mini-projects-1-optimizing-a-phonebook-with-hashmap-370l</guid>
      <description>&lt;p&gt;I am starting to revise the DSA topics when an idea popped in; how about starting to create one mini project based on each topic while revisiting them? This way it can give me insights into how data structures and algorithms are applied in the real world and also I can have something to showcase.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Project of This Series: A Phonebook App
&lt;/h2&gt;

&lt;p&gt;Without further ado, here is the first project of my learning series: a Phonebook App. Check the app here: &lt;a href="https://hashphonebook.netlify.app/" rel="noopener noreferrer"&gt;https://hashphonebook.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I made this app some years ago but at that time I used the logic of &lt;em&gt;&lt;a href="https://www.geeksforgeeks.org/dsa/linear-search/" rel="noopener noreferrer"&gt;linear searching&lt;/a&gt;&lt;/em&gt;. Which is good because it was a demo project and there is no need to store thousands of numbers, so the search can check all the possibilities and then return the desired result.&lt;/p&gt;

&lt;p&gt;Initially I stored my contacts in a simple JavaScript Array:&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;let&lt;/span&gt; &lt;span class="nx"&gt;userArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1237893457&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Oscar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4562317895&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;And to find a contact I used &lt;code&gt;.find()&lt;/code&gt; which loops through the array one by one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Time Complexity: O(n) Linear Time&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contact&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Oscar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  But Why Is Linear Search Not Enough?
&lt;/h2&gt;

&lt;p&gt;In the real world, the scenario is different. We need to store many numbers in our contact list. For example: we store 100000 numbers and in an emergency case, taking the worst scenario if our phonebook takes O(100000) time to show the result then it is too much in this fast-paced world.&lt;/p&gt;

&lt;p&gt;This is where performance actually matters not just whether the app works or not!&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimizing the Search Logic
&lt;/h2&gt;

&lt;p&gt;So the solution is using something that can give results in a shorter time. I changed the array to a HashMap and searched through the map using the key (username).&lt;/p&gt;

&lt;p&gt;This way, the lookup time is much faster &lt;strong&gt;&lt;em&gt;(O(1))&lt;/em&gt;&lt;/strong&gt; and more suitable for real-world use cases. Because A Hashmap acts like a real-world dictionary. You don't read every word to find &lt;em&gt;"Strawberry"&lt;/em&gt; you flip straight to &lt;em&gt;S&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;contactMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1237893457&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Oscar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4562317895&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Time Complexity: O(1) Constant Time&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;contactMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It doesn't matter if I have 5 contacts or 5 billion. The lookup speed is constant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code Refactor
&lt;/h2&gt;

&lt;p&gt;Here is the actual code I changed in my project:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Before (Array.push):&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;userArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;contactNumber&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;After (Map Key-Value):&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Storing as a key-value pair and making the search case-insensitive&lt;/span&gt;
&lt;span class="nx"&gt;contactMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;originalName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;contactNumber&lt;/span&gt; 
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This project made me realize that a &lt;em&gt;"working code"&lt;/em&gt; is not always &lt;em&gt;"good code"&lt;/em&gt;. Linear search was enough for a demo but it doesn't scale and real-world applications demand better solutions.&lt;/p&gt;

&lt;p&gt;This is just the first step in my DSA revision journey and I plan to keep building small projects like this!&lt;/p&gt;

</description>
      <category>datastructures</category>
      <category>programming</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Step Into Mystic Falls: A Halloween Story Telling Game</title>
      <dc:creator>Amelia Dutta</dc:creator>
      <pubDate>Mon, 10 Nov 2025 06:06:07 +0000</pubDate>
      <link>https://forem.com/amelia2802/step-into-mystic-falls-a-halloween-story-telling-game-imb</link>
      <guid>https://forem.com/amelia2802/step-into-mystic-falls-a-halloween-story-telling-game-imb</guid>
      <description>&lt;p&gt;&lt;em&gt;&amp;gt; “&lt;strong&gt;There is no such thing as a bad idea. Only poorly executed awesome ones,&lt;/strong&gt;”&lt;/em&gt;&lt;br&gt;
Damon once said and I couldn't stop thinking about that while building this Halloween project.&lt;/p&gt;

&lt;p&gt;When I stumbled upon the &lt;a href="https://dev.to/challenges/frontend-2025-10-15"&gt;Frontend Challenge - Halloween Edition, Perfect Landing&lt;/a&gt;_, I thought why not revisit some old JavaScript fundamentals and create a landing page that truly captures the Halloween spirit?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Founder's Day&lt;/em&gt; and the &lt;em&gt;Lockwood Masquerade Ball&lt;/em&gt; have always been my favorite events from &lt;em&gt;The Vampire Diaries&lt;/em&gt; so while planning this project I thought, "Let's merge them together!"&lt;/p&gt;

&lt;p&gt;That's how The Founder's Ball was born: &lt;em&gt;&lt;strong&gt;an interactive storytelling game that lets users step into a dark ballroom, pick a partner, and uncover their supernatural identity.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experience
&lt;/h2&gt;

&lt;p&gt;The entire app is built with &lt;strong&gt;HTML, CSS, and Vanilla JavaScript (ES6)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Technical Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modular JavaScript&lt;/strong&gt; with ES6 imports/exports for cleaner code organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS Keyframes&lt;/strong&gt; for smooth fade-in transitions between sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt; optimized for mobile, tablet, and desktop (5 breakpoints)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark Gothic UI&lt;/strong&gt; with gradients, animations, and elegant typography&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user journey flows through 6 distinct sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Landing&lt;/strong&gt; → Enter the mysterious ballroom&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Attire Selection&lt;/strong&gt; → Choose your formal wear&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Outfit Choice&lt;/strong&gt; → Pick from 4 elegant designs&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Partner Selection&lt;/strong&gt; → Meet your mysterious companion&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Identity Reveal&lt;/strong&gt; → Discover your supernatural nature&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Your Story&lt;/strong&gt; → Read your personalized tale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My goal was to create a user journey that felt like navigating through a storybook, where each choice transitions seamlessly into the next moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Learnings
&lt;/h2&gt;

&lt;p&gt;This challenge gave me the perfect push to revisit my Vanilla JavaScript foundations and dust off some forgotten concepts.&lt;/p&gt;

&lt;p&gt;Here's what I brushed up on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Array Methods&lt;/strong&gt;: join(), find(), map()&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM Manipulation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ES6+ Features&lt;/strong&gt;: arrow functions, modules, destructuring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://amelia2802.github.io/halloween-masquerade/" rel="noopener noreferrer"&gt;Play The Founder's Ball&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/amelia2802/halloween-masquerade" rel="noopener noreferrer"&gt;View Source Code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F681pzts2p9fx79a0le6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F681pzts2p9fx79a0le6p.png" alt="User Story" width="800" height="421"&gt;&lt;/a&gt;&lt;br&gt;
Halloween doesn't always have to be scary. Sometimes it's about mystery, elegance, and the thrill of becoming something supernatural for a night.&lt;/p&gt;

&lt;p&gt;So… if you've ever wondered what your story will be in Mystic Falls, come find out. &lt;strong&gt;&lt;em&gt;The Founder's Ball awaits you at the Lockwood Mansion from sunset to midnight. 🦇&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All images used in this project are credited to their original owners.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How Being Part of a Community Took Me from Hesitant to 5 PRs Merged</title>
      <dc:creator>Amelia Dutta</dc:creator>
      <pubDate>Sun, 02 Nov 2025 18:26:26 +0000</pubDate>
      <link>https://forem.com/amelia2802/how-being-part-of-a-community-took-me-from-hesitant-to-5-prs-merged-2l0d</link>
      <guid>https://forem.com/amelia2802/how-being-part-of-a-community-took-me-from-hesitant-to-5-prs-merged-2l0d</guid>
      <description>&lt;p&gt;Ding-dong! The ghouls are gone and the season of Christmas begins; the month long Hacktoberfest wraps up, filled with learning, debugging and late night commits! 🎃 &lt;br&gt;
This year, I learned so much more through contributing to Open Source which I never got from just reading tutorials or doing personal projects. and honestly a big chunk of that credit goes to the Torc community.&lt;br&gt;
&lt;em&gt;(Before diving into my journey, check out &lt;a href="https://platform.torc.dev/#/r/ZILxKHb0/cp" rel="noopener noreferrer"&gt;Torc&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the beginning of the month, my feed was full of posts from people on LinkedIn and Twitter buzzing about Hacktoberfest. Everyone seemed so ready and excited. And me? I was like, &lt;em&gt;"Umm, nice... but where do I even start?"&lt;/em&gt; My calendar was already packed with other events so I didn't really have time to plan my contributions. &lt;br&gt;
And that's where the magic of a good tech community kicks in. Around the second week of October, right when Hacktoberfest was in full swing I finally got a break and logged back in. That's when I discovered that Torc discord have a dedicated hacktoberfest channel, shout out to &lt;a href="https://www.linkedin.com/in/thejasontorres/" rel="noopener noreferrer"&gt;Jason Torres&lt;/a&gt; for creating the torctoberfest repo. And I got a place to start! My interest was back, but then came the real question: &lt;em&gt;&lt;strong&gt;what do I contribute to?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Beginning of torcReads
&lt;/h2&gt;

&lt;p&gt;While scrolling through the channels I suddenly remembered, I hadn't even read the book we picked for our book club! That's when the idea hit me. Huge thanks to &lt;a href="https://www.linkedin.com/in/angeloskatrantzis/" rel="noopener noreferrer"&gt;Angelos Katrantzis&lt;/a&gt; for starting the Torc Book Club; otherwise I might never have thought of this project in the first place! &lt;br&gt;
The initial plan was simple: build a website to log the books we read each month in the club. But then my brain went &lt;em&gt;"Wait, why not add more?"&lt;/em&gt; So I started adding features like study guides and monthly voting options. The frontend came out beautifully; Responsive, Clean and Minimalist. And guess what? My first two PRs got merged! Cool, right? 😎 &lt;/p&gt;

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

&lt;p&gt;After hosting it for testing, I realized something... &lt;em&gt;Oops it is storing all the data locally!&lt;/em&gt; Which meant once deployed, everyone would see their own data. Total chaos incoming! &lt;br&gt;
And here's the twist: I never worked with any backend before. So laptop on, a little googling, some brainstorming with Claude and a few Stack Overflow tabs later; BAM! I discovered Supabase! It lets you store data globally and even offers generous free storage. But of course... I had zero experience integrating a database with frontend.&lt;/p&gt;

&lt;p&gt;Still I told myself &lt;em&gt;"we've got a week and a half before 31st October! Why not learn something new?"&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Learnings in the Process
&lt;/h2&gt;

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

&lt;p&gt;While setting up the database with the frontend I learned a few cool things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Row Level Security (RLS)&lt;/strong&gt;&lt;br&gt;
Access control that defines who can read, insert, update, or delete specific rows based on policies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Migration Files&lt;/strong&gt;&lt;br&gt;
Version controlled SQL scripts that track and apply database schema changes over time, allowing teams to sync database structures across environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CRUD Operations (Create, Read, Update, Delete)&lt;/strong&gt;&lt;br&gt;
The four fundamental database operations: Create adds new data, Read retrieves it, Update modifies it, and Delete removes it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uploading files to cloud&lt;/strong&gt;&lt;br&gt;
Cloud file storage service that uploads files to remote servers and returns public URLs, allowing applications to store and retrieve uploaded content without managing server infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organizing files&lt;/strong&gt;&lt;br&gt;
Containers that group and organize related files in cloud storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Public vs Private buckets&lt;/strong&gt;&lt;br&gt;
Access control for file storage; public buckets allow anyone with the URL to download files while private buckets require authentication.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the Torctoberfest Repo here: &lt;a href="https://github.com/jasonetorres/torctoberfest" rel="noopener noreferrer"&gt;https://github.com/jasonetorres/torctoberfest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building torcReads taught me far more than just coding. Before this, I thought backend and database were way out of my league. But once hit a real problem, I had no choice but to figure it out! Kudos to &lt;a href="https://www.linkedin.com/in/pat-clarke-dev/" rel="noopener noreferrer"&gt;Pat Clark&lt;/a&gt; for reviewing and giving thoughtful feedback on each of my pull requests. &lt;/p&gt;

&lt;p&gt;I realized open source isn't about being an expert in everything and you don't need to know all to get started. It's about showing up, trying things and learning in public. Even a small idea can turn into something valuable when you have a great community guiding you! &lt;/p&gt;

&lt;p&gt;Happy Hacking! 🕸️👻&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
