<?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: Omaima Ameen</title>
    <description>The latest articles on DEV Community by Omaima Ameen (@heytechomaima).</description>
    <link>https://dev.to/heytechomaima</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%2F3585602%2Fdf95ddca-70c3-4e30-96ba-2c690e870751.png</url>
      <title>DEV Community: Omaima Ameen</title>
      <link>https://dev.to/heytechomaima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heytechomaima"/>
    <language>en</language>
    <item>
      <title>I Built NextProof Because Resume Match Scores Weren't Enough.</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:17:39 +0000</pubDate>
      <link>https://dev.to/heytechomaima/i-built-nextproof-because-resume-match-scores-werent-enough-30g6</link>
      <guid>https://dev.to/heytechomaima/i-built-nextproof-because-resume-match-scores-werent-enough-30g6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Let's be honest. Job descriptions can feel like someone combined five different roles into one and called it an entry-level position. 💀&lt;/p&gt;

&lt;p&gt;Then comes the resume-editing ritual.&lt;/p&gt;

&lt;p&gt;You read the job description, look at your resume, rearrange a few things, add some keywords, and hope the recruiter sees the connection.&lt;/p&gt;

&lt;p&gt;But here's the thing , &lt;strong&gt;matching keywords isn't the same as understanding whether your experience actually demonstrates what a role needs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And sometimes, you might already have the experience. Your resume just isn't making that obvious.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;NextProof.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NextProof&lt;/strong&gt; is an AI-powered resume analysis tool that compares your resume with a job description and helps you understand the relationship between the two.&lt;/p&gt;

&lt;p&gt;Instead of stopping at a generic match score, it breaks the analysis into an overall assessment, strengths, gaps, and actionable next steps.&lt;/p&gt;

&lt;p&gt;The idea is simple: help you understand what your resume demonstrates, where evidence might be missing, and what you can work on next.&lt;/p&gt;

&lt;p&gt;Because there's a difference between not having a skill and not showing evidence of that skill on your resume.&lt;/p&gt;

&lt;p&gt;I wanted to build something that takes that difference seriously.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://nextproof.onrender.com/" rel="noopener noreferrer"&gt;https://nextproof.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upload a PDF or DOCX resume, paste a job description, and run an analysis. You can then explore the assessment, strengths, gaps, and suggested next steps.&lt;/p&gt;

&lt;p&gt;The application is deployed on Render, with server-side API routes handling the analysis and feedback flows.&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%2F0p1cacq3sewct5cj4pap.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%2F0p1cacq3sewct5cj4pap.png" alt=" " width="800" height="352"&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%2Fffsfzkt9w3inf9ykd0pr.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%2Fffsfzkt9w3inf9ykd0pr.png" alt=" " width="799" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Omaima-Ameen/nextproof" rel="noopener noreferrer"&gt;NextProof repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack:&lt;/strong&gt; Next.js · JavaScript · Tailwind CSS · Gemma · Google Gen AI SDK · Supabase · Render&lt;/p&gt;

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

&lt;p&gt;Here's the high-level flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resume (PDF / DOCX) + Job Description
                 |
                 v
        Validate the inputs
                 |
                 v
        Extract resume text
                 |
                 v
        Send context to Gemma
                 |
                 v
       Parse and validate output
                 |
                 v
        Structured analysis
                 |
       +---------+----------+
       |         |          |
       v         v          v
  Assessment  Strengths    Gaps
                            |
                            v
                        Next steps

          Feedback --&amp;gt; Supabase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend is built with Next.js and JavaScript. The analysis API route handles file validation, text extraction, and communication with the model.&lt;/p&gt;

&lt;p&gt;For document processing, I used pdf-parse for PDF resumes and mammoth for DOCX files. Both formats need to be converted into usable text before the analysis can begin.&lt;/p&gt;

&lt;p&gt;The application uses the Google Gen AI SDK to access hosted Gemma inference. The API key stays on the server instead of being exposed in the browser.&lt;/p&gt;

&lt;p&gt;The model's response is parsed and validated before being returned to the frontend. The results interface then presents the analysis through separate sections rather than making users dig through one giant block of generated text.&lt;/p&gt;

&lt;p&gt;I also built a feedback flow backed by Supabase, allowing users to share their thoughts on the usefulness and accuracy of the analysis.&lt;/p&gt;

&lt;p&gt;Finally, I deployed the application as a Next.js web service on Render, so the frontend and server-side API routes can run together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Gemma?
&lt;/h2&gt;

&lt;p&gt;The part I wanted to explore was how an open-weight model could help turn two pieces of text—a resume and a job description—into a structured analysis that someone could actually use.&lt;/p&gt;

&lt;p&gt;A job description contains requirements. A resume contains a candidate's description of their experience. Connecting the two requires more than looking for identical words; it requires interpreting context and producing feedback that makes sense to the user.&lt;/p&gt;

&lt;p&gt;That's the role &lt;strong&gt;Gemma&lt;/strong&gt; plays in NextProof.&lt;/p&gt;

&lt;p&gt;The model receives the extracted resume text and the job description as context and generates the analysis that powers the results experience.&lt;/p&gt;

&lt;p&gt;The surrounding application is responsible for everything that makes this usable as a product: accepting files, validating inputs, extracting text, handling inference failures, validating the returned structure, and presenting the results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma provides the language understanding; the engineering around it turns that capability into a usable workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm particularly interested in open-weight models because they give developers more room to experiment with how AI is integrated into products. You're not limited to thinking about AI as a feature that sits behind a button. You can make decisions about model selection, inference, deployment, and how the rest of your system handles its output.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;NextProof&lt;/strong&gt;, that meant treating the model as one component in a larger application rather than assuming that a successful API call was the entire product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Chose Hosted Inference Instead of Running Gemma Locally
&lt;/h2&gt;

&lt;p&gt;I did consider running a model locally through Ollama.&lt;/p&gt;

&lt;p&gt;But that introduced another setup step and a model download of around 1.5 GB before I could focus on the actual product experience.&lt;/p&gt;

&lt;p&gt;Given the challenge timeline, I had a choice: spend more time setting up local inference, or use hosted Gemma inference and concentrate on getting the complete application working.&lt;/p&gt;

&lt;p&gt;I chose the latter.&lt;/p&gt;

&lt;p&gt;That let me spend my time on the parts that needed to come together for NextProof to be usable: document extraction, input validation, structured results, error handling, and the complete journey from resume upload to feedback.&lt;/p&gt;

&lt;p&gt;There is a trade-off, though.&lt;/p&gt;

&lt;p&gt;NextProof currently depends on a hosted inference service. Gemma isn't running entirely on the user's device, and the analysis requires an internet connection and an available inference endpoint.&lt;/p&gt;

&lt;p&gt;It also means the application must account for provider errors, latency, and the costs or usage limits associated with hosted inference.&lt;/p&gt;

&lt;p&gt;Local inference could offer different advantages, including more control over the inference environment and the possibility of processing text without sending it to an external model service. But it would also introduce model-download, hardware, and setup considerations.&lt;/p&gt;

&lt;p&gt;For this version, I prioritised getting the complete product working over adding another inference mode.&lt;/p&gt;

&lt;p&gt;That was a scope decision, not a claim that hosted inference is always better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Decisions Behind the Build
&lt;/h2&gt;

&lt;p&gt;I deliberately left authentication out of the current version.&lt;/p&gt;

&lt;p&gt;The main question I wanted to explore was whether AI could help developers understand the relationship between their resume and a job description. Sign-up and login flows wouldn't answer that question.&lt;/p&gt;

&lt;p&gt;Authentication would also mean taking on more than a login screen: session management, account handling, and decisions about how user data should be associated with an account.&lt;/p&gt;

&lt;p&gt;For this version, I chose to prioritise the complete resume-analysis journey over building those additional systems before validating the core experience.&lt;/p&gt;

&lt;p&gt;That doesn't mean authentication would never make sense. If NextProof grows to support saved analyses, personal history, or persistent user accounts, those features would need to be designed alongside appropriate data-handling and privacy decisions.&lt;/p&gt;

&lt;p&gt;For now, I wanted the core experience to work before expanding the product around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why define input limits?
&lt;/h2&gt;

&lt;p&gt;A resume analyser accepts files, extracts text, and sends that text through an inference pipeline. Without explicit boundaries, an unusually large document or job description can make requests slower, more expensive, or less reliable.&lt;/p&gt;

&lt;p&gt;So I added limits to make the current implementation more predictable.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uploaded resume&lt;/td&gt;
&lt;td&gt;5 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pasted job description&lt;/td&gt;
&lt;td&gt;30,000 characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extracted resume text&lt;/td&gt;
&lt;td&gt;40,000 characters&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each limit serves a different purpose.&lt;/p&gt;

&lt;p&gt;The file-size limit bounds the uploaded document. The job-description limit constrains the pasted input. The extracted-text limit catches documents whose extracted content is too large for the intended processing scope.&lt;/p&gt;

&lt;p&gt;The application also checks file types and whether useful text was extracted before sending the request for analysis.&lt;/p&gt;

&lt;p&gt;These limits aren't magic numbers that guarantee accuracy, security, or perfect performance. They're explicit engineering guardrails that help control input size and keep the current workflow within a defined scope.&lt;/p&gt;

&lt;p&gt;They can be revisited as I test more resumes, different document formats, and longer job descriptions.&lt;/p&gt;

&lt;p&gt;I wanted NextProof to do more than work for one ideal example. Defining what it accepts, what it rejects, and how it handles failures is part of building the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Could Go Next
&lt;/h2&gt;

&lt;p&gt;There are a few directions I'd like to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better ways to connect each finding to the evidence in a resume and the relevant job requirement.&lt;/li&gt;
&lt;li&gt;Evaluation against a broader set of real-world resumes and job descriptions.&lt;/li&gt;
&lt;li&gt;More user feedback to understand where the analysis is helpful, inaccurate, or confusing.&lt;/li&gt;
&lt;li&gt;Reconsidering authentication and saved analyses if there's a clear reason to introduce persistent user accounts.&lt;/li&gt;
&lt;li&gt;Exploring local inference if it makes sense for privacy, cost, and the experience I want to provide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd rather let actual usage and testing guide these decisions than add features just because they sound impressive on a roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;p&gt;For me, the value of open-weight AI isn't simply that a model can be downloaded or that its weights are available.&lt;/p&gt;

&lt;p&gt;It's the room it creates for developers to experiment, understand the trade-offs, and build products around models they can choose to use and adapt.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;NextProof&lt;/strong&gt;, Gemma is a central part of the analysis pipeline. It gives me a way to explore how open-weight AI can be applied to a practical problem, while the rest of the application handles the engineering required to make that capability usable.&lt;/p&gt;

&lt;p&gt;The hosted setup also makes the current trade-off clear: I get to focus on the product workflow, but I depend on an external inference service. A local implementation could change that balance, but it would bring its own constraints.&lt;/p&gt;

&lt;p&gt;There isn't one approach that's right for every product. What matters is understanding what the choice gives you, what it costs you, and whether it makes sense for the people you're building for.&lt;/p&gt;

&lt;p&gt;That's what I wanted to explore with &lt;strong&gt;NextProof.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Can This Become a Side Hustle?
&lt;/h2&gt;

&lt;p&gt;The problem NextProof addresses is connected to a real, recurring activity: applying for jobs and trying to understand how your experience fits a role.&lt;/p&gt;

&lt;p&gt;A future version could explore a paid tier for more detailed analysis, saved reports, or additional workflows for job seekers. But those are possibilities, not validated business results.&lt;/p&gt;

&lt;p&gt;I haven't established willingness to pay yet, and I don't want to pretend otherwise.&lt;/p&gt;

&lt;p&gt;Before introducing pricing, I'd want to understand whether people find the analysis useful enough to return to it, which recommendations they trust, and what they would actually pay for.&lt;/p&gt;

&lt;p&gt;For now, the live application is a starting point for testing the idea and learning from real users.&lt;/p&gt;

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

&lt;p&gt;I keep coming back to one question: how do we build AI tools that help people make better decisions instead of simply giving them another score to worry about?&lt;/p&gt;

&lt;p&gt;Job searching already involves enough uncertainty. You don't always know whether you're missing a skill, underselling your experience, or failing to make the connection obvious.&lt;/p&gt;

&lt;p&gt;I wanted to build something that helps people examine that uncertainty more carefully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NextProof&lt;/strong&gt; is my attempt at that: &lt;strong&gt;a working product that uses Gemma to help turn resume and job-description text into a more structured, actionable analysis.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's live, it has clear limitations, and there's still a lot I want to learn from people using it.&lt;/p&gt;

&lt;p&gt;sooo yeah, that's &lt;em&gt;NextProof&lt;/em&gt;!!&lt;/p&gt;

&lt;p&gt;if you're curious, give it a try and let me know what you think. I'd genuinely love to hear what works, what doesn't, and what you'd change.&lt;/p&gt;

&lt;p&gt;try it out: &lt;a href="https://nextproof.onrender.com/" rel="noopener noreferrer"&gt;https://nextproof.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;wanna peek at the code? &lt;a href="https://github.com/Omaima-Ameen/nextproof" rel="noopener noreferrer"&gt;GitHub repository link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and if you do try it, pls come back and tell me how it went hehe. thank you for reading this farrr!! ✨&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Last Year I Thought Hacktoberfest Was Stupid. This Year, I Built Look Again💀</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Sun, 11 Oct 2026 16:15:13 +0000</pubDate>
      <link>https://dev.to/heytechomaima/last-year-i-thought-hacktoberfest-was-stupid-this-year-i-built-something-different-19mp</link>
      <guid>https://dev.to/heytechomaima/last-year-i-thought-hacktoberfest-was-stupid-this-year-i-built-something-different-19mp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So last year, an online dev friend introduced me to Hacktoberfest, I checked it out. A month-long event, open-source contributions, pull requests… and my first thought was: &lt;strong&gt;"huh, that's it? This sounds ridiculously easy. What kind of competition is this? 🥱"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I made two PRs, i think🤔, and went back to doing my own thing.&lt;/p&gt;

&lt;p&gt;Fast-forward to 2026.&lt;/p&gt;

&lt;p&gt;This time, I came prepared. I knew how PRs worked, I knew GitHub, and I was convinced I had this whole thing figured out.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DigitalOcean, you dig? 😶😂&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;but Hacktoberfest 2026 came with a different kind of challenge as we all knoww!!&lt;/p&gt;

&lt;p&gt;The Week 1 challenges theme was &lt;strong&gt;Touch Grass&lt;/strong&gt; - building with open-source AI to help people spend less time on screens and more time experiencing the world around them.&lt;/p&gt;

&lt;p&gt;and now I had an actual question to solve: what could I build that would make sense for this theme?&lt;/p&gt;

&lt;p&gt;I didn't want to build just another chatbot or add AI to an application for the sake of it. I wanted to build something that actually fit the challenge, that's how I started exploring an idea: what if AI could give people a reason to put their phones away, look around, and notice things they might otherwise overlook?&lt;/p&gt;

&lt;p&gt;and that idea became &lt;strong&gt;Look Again.&lt;/strong&gt; 🌱&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Look Again is an AI-powered curiosity companion that gives you a question to take away from your screen and into the real world.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea isn't complicated.&lt;/p&gt;

&lt;p&gt;You open the application, choose how you want to observe your surroundings, and receive one AI-generated question, maybe the question encourages you to notice an overlooked detail, observe a change, find a connection, pay attention to people, or approach something familiar with a little more curiosity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then you put your phone away.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You explore the question at your own pace, when you're ready, you return and describe what you noticed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look Again&lt;/strong&gt; helps turn your reflection into a &lt;strong&gt;Field Note&lt;/strong&gt; - a small record of an observation you can revisit later.&lt;/p&gt;

&lt;p&gt;The experience follows five steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose:&lt;/strong&gt; Select an attention mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discover:&lt;/strong&gt; Receive a focused AI-generated question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observe:&lt;/strong&gt; Step away from the screen and explore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflect:&lt;/strong&gt; Describe your experience in your own words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember:&lt;/strong&gt; Save the reflection as a Field Note.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the core idea.&lt;/p&gt;

&lt;p&gt;I'm not trying to make people spend more time inside Look Again. I'm exploring whether a small interaction with software can encourage someone to pay attention to something outside it and I deliberately didn't build the experience around streaks, leaderboards, or endless missions.&lt;/p&gt;

&lt;p&gt;Imagine creating an application to help people spend less time on their phones and then making them addicted to completing its daily challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congratulations, you've invented the problem you were supposed to solve , wth brooo 💀&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Instead, Look Again gives people a starting point and lets them take it from there.&lt;/p&gt;

&lt;p&gt;The application doesn't need to be the most interesting thing in the room.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Project demo:&lt;/strong&gt; &lt;a href="https://look-again-five.vercel.app/" rel="noopener noreferrer"&gt;LOOK-AGAIN&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/Omaima-Ameen/look-again" rel="noopener noreferrer"&gt;REPOSITORY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project brings together a React frontend, an Express backend, AI-powered generation, and journal persistence, the repository is where you can explore the implementation and how the different pieces fit together.&lt;/p&gt;

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

&lt;p&gt;Okay, enough talking about curiosity. Let's get into the engineering. 😂&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look Again&lt;/strong&gt; uses React and Vite on the frontend, Node.js and Express on the backend, SQLite for journal storage, and Google's Gemma model through the Google GenAI SDK.&lt;/p&gt;

&lt;p&gt;Here's the stack:&lt;/p&gt;

&lt;p&gt;React + Vite - Frontend application &lt;br&gt;
Tailwind CSS - Styling &lt;br&gt;
Motion - Interface animations &lt;br&gt;
Lucide React - Icons &lt;br&gt;
Node.js + Express - Backend API &lt;br&gt;
Google GenAI SDK + Gemma - Prompt and Field Note generation &lt;br&gt;
SQLite via &lt;code&gt;sql.js&lt;/code&gt; - Journal storage &lt;br&gt;
Render + Vercel - Backend and frontend deployment &lt;/p&gt;

&lt;h3&gt;
  
  
  The AI layer
&lt;/h3&gt;

&lt;p&gt;I integrated Google's Gemma model through the Google GenAI SDK for two main tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generating attention prompts:&lt;/strong&gt; The model produces a question based on the selected attention mode and relevant context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structuring Field Notes:&lt;/strong&gt; The model helps turn the user's reflection into a more organized note.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is that the AI shouldn't invent the observation, it shouldn't pretend it experienced the user's surroundings or write a fictional reflection on their behalf.&lt;/p&gt;

&lt;p&gt;The user provides the actual experience. The model helps shape the interaction around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI is the guide, not the protagonist.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trade-off is that AI generation depends on network access and the availability of the external service. API credentials, rate limits, and usage costs also need to be considered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;I didn't want to use AI just to put an AI label on a project, i wanted to explore how an open-weight model could support a particular experience: helping someone approach their surroundings with fresh curiosity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma&lt;/strong&gt; gave me a way to experiment with generated prompts and reflections while concentrating on the product itself.&lt;/p&gt;

&lt;p&gt;Open-weight models and open-source tooling give developers more freedom to experiment, learn, and make informed technical decisions.&lt;/p&gt;

&lt;p&gt;There's an important distinction, though: &lt;strong&gt;Look Again uses hosted inference, so the current implementation isn't entirely offline.&lt;/strong&gt; The model integration depends on network access and the external service.&lt;/p&gt;

&lt;p&gt;But that doesn't diminish the value of the experiment. It makes the architectural trade-offs clearer.&lt;/p&gt;

&lt;p&gt;For me, open innovation is about being able to explore what technology makes possible and then decide how to use it meaningfully.&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma - Integrated Google's Gemma model through the Google GenAI SDK to generate attention prompts and help transform users' reflections into meaningful Field Notes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Want to Explore Next
&lt;/h2&gt;

&lt;p&gt;Look Again is an experiment, and there are still things I'd like to improve, i want to explore how Field Notes could connect observations across different moments, making it easier to revisit an experience and discover patterns over time.&lt;/p&gt;

&lt;p&gt;also want to strengthen persistence and deployment reliability.&lt;/p&gt;

&lt;p&gt;Most importantly, I want to find out whether the idea actually works for people.&lt;/p&gt;

&lt;p&gt;Do the prompts lead to observations they wouldn't otherwise have made? Does reflecting on those observations feel meaningful? Can the experience encourage curiosity without becoming another obligation?&lt;/p&gt;

&lt;p&gt;Those questions matter more to me than adding features simply to make the application bigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Last Thing, DigitalOcean...
&lt;/h2&gt;

&lt;p&gt;Last year, I came here thinking, &lt;strong&gt;"PR count? Easy."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This year, I came back wanting to win and ended up building something that made me think differently about the purpose of an application.&lt;/p&gt;

&lt;p&gt;I still want to win, by the way. Let's not get too philosophical here. 😭😂&lt;/p&gt;

&lt;p&gt;But the interesting part of this challenge has been having a reason to build something beyond the usual portfolio checklist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look Again&lt;/strong&gt; explores a simple idea: technology doesn't always need to demand more of our attention. Sometimes, it can give us a reason to direct that attention somewhere else.&lt;/p&gt;

&lt;p&gt;A question. An observation. A Field Note worth remembering.&lt;br&gt;
and then, the &lt;strong&gt;freedom to close the app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Happppy Hacktoberfest!✌&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>lookagain</category>
    </item>
    <item>
      <title>Beyond AI: Rethinking What It Means to Be a Human Developer</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Tue, 29 Sep 2026 05:56:30 +0000</pubDate>
      <link>https://dev.to/heytechomaima/beyond-ai-rethinking-what-it-means-to-be-a-human-developer-45m9</link>
      <guid>https://dev.to/heytechomaima/beyond-ai-rethinking-what-it-means-to-be-a-human-developer-45m9</guid>
      <description>&lt;p&gt;I sometimes think about building a &lt;strong&gt;programming language&lt;/strong&gt; that only humans could understand and work with but then that thought takes me back to the same point: &lt;br&gt;
as we all know, almost everything we do online, and even parts of what we do offline, can become &lt;strong&gt;data used to train AI models&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;So the idea of building something that &lt;strong&gt;only human intelligence could interpret&lt;/strong&gt; or work with starts to feel a little vague.&lt;/p&gt;

&lt;p&gt;Isn't it crazy that we are now questioning whether we can build something purely for &lt;strong&gt;human intelligence to interpret&lt;/strong&gt;, as if our intelligence is no longer the only thing capable of understanding the things we create?&lt;/p&gt;

&lt;p&gt;For some people, this is exciting. &lt;br&gt;
They believe curiosity will lead the way, and everyone will eventually be able to build whatever they want, with the right tools at their fingertips.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;but as a software engineer, i have mixed feelings about that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I don't want everyone to build whatever they want just because the tools have made it possible. &lt;br&gt;
I don't want a complex, deeply technical field like software engineering to become something that anyone can casually master overnight !!&lt;/p&gt;

&lt;p&gt;and no, this isn't about gatekeeping knowledge or wanting people to stay away from technology , it's about the value i associate with the process of becoming an engineer.&lt;/p&gt;

&lt;p&gt;I wish I could have experienced an era of software engineering where building something meaningful required an incredible amount of human intelligence, patience, curiosity, and effort. &lt;/p&gt;

&lt;p&gt;An era where developers spent hours understanding systems, finding mistakes, experimenting with solutions, and learning things that couldn't be understood just by copying a few lines of code.&lt;/p&gt;

&lt;p&gt;I wanted to experience that kind of engineering.&lt;/p&gt;

&lt;p&gt;But let's come back to reality.&lt;/p&gt;

&lt;p&gt;Time is limited. There are too many things to learn, too many tools to explore, and too many ideas waiting to be built.&lt;/p&gt;

&lt;p&gt;We are living in an era where shipping fast, adopting tools before everyone else, building in public, networking relentlessly, and finding opportunities before the market gets crowded are becoming increasingly important.&lt;/p&gt;

&lt;p&gt;maybe if we can put our brain power into a &lt;strong&gt;different layer of technology&lt;/strong&gt;,  to explore unconventional niches, combine ideas from different fields, and build things that aren't just another version of something that already exists.&lt;/p&gt;

&lt;p&gt;but more than that, i wish we could reach a level of technology where human intelligence isn't constantly being measured against what AI can understand, replicate, or produce.&lt;/p&gt;

&lt;p&gt;I wish we could build things that emerge from the parts of being human that &lt;strong&gt;cannot be reduced to patterns in data&lt;/strong&gt; - our consciousness, our lived experiences, our ability to feel, to question our own existence, and to develop an understanding of the world through experiences that are uniquely ours. &lt;/p&gt;

&lt;p&gt;Imagine building a technology that goes beyond simply processing information - something whose meaning is deeply rooted in the human experience behind it, something that cannot be fully understood just by observing the data it produces.&lt;/p&gt;

&lt;p&gt;I know this might sound vague, maybe even impossible to define precisely. But I think these are questions we need to start asking.&lt;/p&gt;

&lt;p&gt;Somewhere along the way, we've started treating what AI is capable of as the boundary of what we should build next, as if the limits of AI should also define the limits of human imagination.&lt;/p&gt;

&lt;p&gt;and I &lt;strong&gt;don't consider they should&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I don't want the future of technology to be determined entirely by how much AI can learn, how much it can replicate, or how much of human intelligence it can imitate.&lt;/p&gt;

&lt;p&gt;I want us to have control over what we allow AI to become, what we allow it to access, and what parts of human life we choose to keep beyond its reach.&lt;/p&gt;

&lt;p&gt;Not every human capability needs to become a machine capability. Not every experience needs to be translated into data. And not every idea needs to be made accessible to an intelligence that can process it without having lived it.&lt;/p&gt;

&lt;p&gt;maybe the next big leap in software engineering won't be about making AI understand more of us.&lt;/p&gt;

&lt;p&gt;maybe it will be about creating technologies that protect the things that make us human, while pushing the boundaries of what human beings themselves can create.&lt;br&gt;
and that is the kind of future I want to explore.&lt;/p&gt;

&lt;p&gt;A future where we aren't simply building technology that gets closer to replicating us, but technology that allows us to go beyond what we currently understand about ourselves.&lt;/p&gt;

&lt;p&gt;because I don't want to spend the next few decades asking how much of our intelligence AI can take over. I want to ask how far human intelligence can go when we stop treating AI as the ultimate boundary of our imagination.&lt;/p&gt;

&lt;p&gt;P.S. I've been thinking about these questions, and I want to know what other developers think, too.&lt;/p&gt;

&lt;p&gt;If you could build a technology that protects something fundamentally human, what would you build?&lt;/p&gt;

&lt;p&gt;I'm collecting ideas from developers who are willing to think beyond what AI can already do. Maybe one of these ideas will become something we build together.&lt;/p&gt;

&lt;p&gt;-&amp;gt; Share your idea in The Human-Only Frontier: &lt;a&gt;Google Form&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drop your thoughts in the comments. I'd genuinely love to hear your ideas ✨&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Went Down the React Hydration Rabbit Hole</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Wed, 16 Sep 2026 03:48:36 +0000</pubDate>
      <link>https://dev.to/heytechomaima/i-went-down-the-react-hydration-rabbit-hole-3292</link>
      <guid>https://dev.to/heytechomaima/i-went-down-the-react-hydration-rabbit-hole-3292</guid>
      <description>&lt;p&gt;Okay, I went down the React hydration rabbit hole and, I think the way we usually talk about hydration makes it sound much simpler than what is actually happening.&lt;/p&gt;

&lt;p&gt;For manyy many many many manyyy years, whenever performance came up, the conversation was mostly about the network. Compress your HTML. Cache your assets. Split your bundles. Ship less JavaScript, don't make the user download half the internet just to see a landing page. All good advice👍 but eventually the JavaScript reaches the browser. AND THEN WHAT? &lt;br&gt;
The browser still has to parse it, compile it, execute it, and React still has to do its own work on the main thread. That part doesn't disappear just because your bundle arrived quickly.&lt;/p&gt;

&lt;p&gt;and hydration is not some magical lightweight operation where React looks at the HTML and says, "yep, looks good 👍" and walks away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;there's actual CPU work happening.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The browser already has the DOM because the server sent HTML. React now has to come in and understand that existing DOM, build its Fiber representation, reconcile what it expects with what is already there, attach the necessary behavior, and make that server-rendered UI something React can actually control.&lt;/p&gt;

&lt;p&gt;So when I started reading about React 18, the interesting question for me wasn't really "Did React make hydration faster?"&lt;/p&gt;

&lt;p&gt;It was more like:&lt;/p&gt;

&lt;p&gt;"Wait... what if the problem isn't only how fast we hydrate, but how we schedule the work?"&lt;/p&gt;

&lt;p&gt;And THAT is where React 18 gets interesting.&lt;/p&gt;

&lt;p&gt;First, React isn't just "attaching event listeners"&lt;/p&gt;

&lt;p&gt;This was one of those things that sounded obvious until I actually looked closer.&lt;/p&gt;

&lt;p&gt;We casually say:&lt;/p&gt;

&lt;p&gt;React hydrates the server-rendered HTML.COOOOL, but internally, React isn't simply wandering through the DOM attaching onClick handlers like some extremely determined intern. 😂&lt;/p&gt;

&lt;p&gt;The server has already produced HTML. The browser has parsed that HTML and created actual DOM nodes. &lt;strong&gt;React then has to reconcile its expected component structure with those nodes and determine whether the existing DOM can be reused.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That's where Fiber becomes important.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;During a normal client-side mount, React is creating host nodes as part of rendering the UI. During hydration, those nodes already exist. React has to match its work against something that the browser has already created.&lt;/p&gt;

&lt;p&gt;So conceptually, if the server gave us a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; and React expects a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; in that position, React can claim and reuse that existing node rather than treating the whole thing like a fresh client render.&lt;/p&gt;

&lt;p&gt;And this is why hydration mismatches are more interesting than just "oops, React printed a warning."&lt;/p&gt;

&lt;p&gt;React is basically trying to reconcile two realities:&lt;/p&gt;

&lt;p&gt;What the server already put in the DOM&lt;/p&gt;

&lt;p&gt;AND&lt;/p&gt;

&lt;p&gt;What the client-side React tree says should be there.&lt;/p&gt;

&lt;p&gt;If those realities don't agree, React has a problem.&lt;/p&gt;

&lt;p&gt;You're not just dealing with ugly console output. You're dealing with React failing to establish the relationship it expected between the Fiber tree and the existing DOM.&lt;/p&gt;

&lt;p&gt;That little hydration warning suddenly looks a lot less innocent. 😭&lt;/p&gt;

&lt;p&gt;then I reached Suspense and things got even weirder because I think a lot of us learn Suspense as basically:&lt;/p&gt;

&lt;p&gt;something is loading&lt;br&gt;
|&lt;br&gt;
show fallback&lt;/p&gt;

&lt;p&gt;which is technically useful, but it completely hides the interesting part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suspense is not just your fancy loading spinner wrapper.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a boundary around rendering work.&lt;/p&gt;

&lt;p&gt;Take something like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const Chart = lazy(() =&amp;gt; import("./Chart"));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;at that moment, React doesn't have the component implementation available immediately. The dependency is still loading and React has a mechanism for dealing with that unfinished work, during rendering, the lazy component can suspend. React then looks for the nearest Suspense boundary and renders the fallback instead of pretending that the component is ready.&lt;/p&gt;

&lt;p&gt;The part I find really interesting here is that React hasn't "crashed."&lt;/p&gt;

&lt;p&gt;Nothing went wrong in the traditional sense.&lt;/p&gt;

&lt;p&gt;The renderer basically encountered work it couldn't finish right now and said:&lt;/p&gt;

&lt;p&gt;okay, I can't continue with THIS part. I'll handle the boundary instead.&lt;/p&gt;

&lt;p&gt;That's a very different mental model from thinking of Suspense as merely a component that displays "Loading...".&lt;/p&gt;

&lt;p&gt;The fallback is the visible part, the boundary is the interesting parta and then there's &lt;strong&gt;Selective Hydration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where React 18 starts making a loooooooooooooooooooooot more sense.&lt;/p&gt;

&lt;p&gt;Imagine your page has a comments section, and that section is behind a Suspense boundary.&lt;/p&gt;

&lt;p&gt;The page is visible. The HTML is already there. But maybe the Comments subtree hasn't finished hydrating yet.&lt;/p&gt;

&lt;p&gt;Then the user comes along and immediately clicks something inside it.&lt;/p&gt;

&lt;p&gt;Which is basically the most annoying thing a user can do from the perspective of your carefully scheduled rendering work. 😂&lt;/p&gt;

&lt;p&gt;The user does not care that React is currently busy hydrating something else.&lt;/p&gt;

&lt;p&gt;They clicked.&lt;/p&gt;

&lt;p&gt;And this is where the React 18 scheduling model matters.&lt;/p&gt;

&lt;p&gt;Instead of treating hydration like one giant checklist that must be completed from top to bottom before anything else can happen, React can prioritize work associated with an interaction.&lt;/p&gt;

&lt;p&gt;The click is important.&lt;/p&gt;

&lt;p&gt;The Suspense boundary containing the target can become a higher-priority hydration target.&lt;/p&gt;

&lt;p&gt;React can work on getting that part of the tree ready, and once the necessary React tree is available, the queued event can be replayed.&lt;/p&gt;

&lt;p&gt;And I really like this distinction:&lt;/p&gt;

&lt;p&gt;The click didn't disappear. React just wasn't ready to process it yet.&lt;/p&gt;

&lt;p&gt;That's a very different thing.&lt;/p&gt;

&lt;p&gt;The browser received the event.&lt;/p&gt;

&lt;p&gt;React's job was figuring out when the corresponding React tree was ready to handle it.&lt;/p&gt;

&lt;p&gt;This is one of those details that makes "Concurrent React" sound a lot less mysterious once you stop thinking about it as React doing five things at exactly the same time.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;The main thread still exists.&lt;/p&gt;

&lt;p&gt;Your CPU did not suddenly grow another brain because you upgraded React. 😭&lt;/p&gt;

&lt;p&gt;Which brings us to the browser and this is probablyyyy my second favorite part.&lt;/p&gt;

&lt;p&gt;the browser doesn't know React exists, it doesn't care about Fiber it doesn't care about lanes.&lt;/p&gt;

&lt;p&gt;It doesn't care that somewhere inside your node_modules there is a Scheduler having an existential crisis.&lt;/p&gt;

&lt;p&gt;The browser knows JavaScript.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;React's scheduler is running inside JavaScript execution.&lt;/p&gt;

&lt;p&gt;So when people say React can "interrupt rendering," don't take that too literally.&lt;/p&gt;

&lt;p&gt;React can't just freeze arbitrary JavaScript halfway through a function and say, "brb, user clicked."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript execution is still happening on the main thread.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What React can do is structure its rendering work into units and decide when it should yield control back to the browser instead of continuing to consume the thread.&lt;/p&gt;

&lt;p&gt;That distinction matters, React isn't preempting JavaScript.React is cooperating with the browser by yielding.&lt;/p&gt;

&lt;p&gt;So the mental model becomes less:&lt;/p&gt;

&lt;p&gt;React renders everything simultaneously.&lt;/p&gt;

&lt;p&gt;and much more:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;React has a bunch of work to do, but not all work deserves to block the user right now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I think that's the more interesting idea behind Concurrent React, it isn't really about making the CPU magically faster, it is about making React's work interruptible, prioritizable, and schedulable.&lt;/p&gt;

&lt;p&gt;That's a much bigger idea than "React 18 made hydration faster."&lt;/p&gt;

&lt;p&gt;Because the CPU work still exists.&lt;/p&gt;

&lt;p&gt;The JavaScript still exists.&lt;/p&gt;

&lt;p&gt;The hydration still exists.&lt;/p&gt;

&lt;p&gt;React just got much better at deciding:&lt;/p&gt;

&lt;p&gt;"Okay, this can wait. The user just did something." and for a UI library, that's a pretty damn important distinction.&lt;/p&gt;

&lt;p&gt;The more I dig into React internals, the more I realize that a lot of the things we use every day as developers are hiding some seriously interesting engineering underneath.&lt;/p&gt;

&lt;p&gt;i'm still figuring a lot of this out, so if I've misunderstood something here , please tell me !! I'd genuinely rather be corrected than confidently post something wrong. 😭&lt;/p&gt;

&lt;p&gt;would love to know how you think about hydration and Concurrent React, or what React-internals rabbit hole you've fallen into recently.&lt;/p&gt;

&lt;p&gt;Drop your thoughts below amazing people 🙌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>what i learned intentionally breaking hydration in next.js</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Tue, 30 Jun 2026 03:40:14 +0000</pubDate>
      <link>https://dev.to/heytechomaima/what-i-learned-intentionally-breaking-hydration-in-nextjs-1l6h</link>
      <guid>https://dev.to/heytechomaima/what-i-learned-intentionally-breaking-hydration-in-nextjs-1l6h</guid>
      <description>&lt;p&gt;i did something dumb last month. on purpose.&lt;/p&gt;

&lt;p&gt;i sat down, opened a next.js app, and tried to make hydration fail in every way i could think of. not because a bug forced me to. not because i was debugging something. just because i wanted to see it. understand it from the inside.&lt;/p&gt;

&lt;p&gt;and honestly? best few hours i've spent learning anything in a while.&lt;/p&gt;

&lt;p&gt;why i even did this&lt;/p&gt;

&lt;p&gt;you know how you use something for months and you think you get it, but you don't really get it? hydration was that for me. i knew the surface-level thing: server renders HTML, client takes over, they gotta match. cool. got it. moving on.&lt;/p&gt;

&lt;p&gt;except i didn't get it. i just got the vibe of it.&lt;/p&gt;

&lt;p&gt;every time i saw hydration mismatch, i'd ask claude, fix the immediate thing, feel vaguely annoyed, and move on. i never stopped to ask why that specific thing broke it. i was treating symptoms, not understanding the actual disease.&lt;/p&gt;

&lt;p&gt;so i decided to break it deliberately. if i caused the errors myself, i'd actually have to understand what i was doing.&lt;/p&gt;

&lt;p&gt;the setup&lt;/p&gt;

&lt;p&gt;basic next.js app. app router. a few pages. nothing fancy.&lt;/p&gt;

&lt;p&gt;i wasn't trying to build anything. i was trying to destroy something, carefully, so i could see what fell apart and why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;break #1: the obvious one - new Date() on render&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;this is the classic. everyone's seen it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLocaleString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;server renders this at, say, 14:00:00. by the time react runs on the client and tries to reconcile, it's 14:00:01. the strings don't match. react screams.&lt;/p&gt;

&lt;p&gt;thing is, i knew this would happen. what i didn't think about was why react cares.&lt;/p&gt;

&lt;p&gt;here's the thing: react isn't doing a full diff on the entire DOM after hydration. it's trusting that the server HTML is a valid starting point and it's just attaching event listeners and state to it. but if the content doesn't match, it doesn't know what to trust. it can't partially hydrate "mostly correct" HTML. it either matches or it doesn't.&lt;/p&gt;

&lt;p&gt;so it throws the warning, and in some cases actually re-renders the whole thing client-side. you just wasted your server render.&lt;/p&gt;

&lt;p&gt;what i actually learned: hydration isn't "react rechecks everything." it's react skipping the DOM creation step entirely and just walking the existing DOM to attach fiber nodes. mismatch breaks that walk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;break #2: typeof window !== 'undefined' used wrong&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;this one's sneaky. i see this pattern everywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&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;isClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isClient&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client&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="s1"&gt;server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;server: window doesn't exist -&amp;gt; renders "server"&lt;/p&gt;

&lt;p&gt;client: window exists -&amp;gt; renders "client"&lt;/p&gt;

&lt;p&gt;mismatch. every time.&lt;/p&gt;

&lt;p&gt;the fix people reach for is useEffect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsClient&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setIsClient&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but here's what clicked for me when i broke it intentionally: the reason useEffect fixes it is that the first render on the client still returns false. it matches the server. then after hydration completes, useEffect fires, state updates, component re-renders. by that point, react is done hydrating and owns the DOM. it can do whatever.&lt;/p&gt;

&lt;p&gt;that timing is doing a lot of work. it's not a hack. it's actually the intended mental model - first render matches server, then client takes over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;break #3: rendering random values&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;data-id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;i expected the hydration warning. i got it. but what surprised me was opening the react devtools and watching what actually happened.&lt;/p&gt;

&lt;p&gt;react renders the component on the client. it walks the server-rendered DOM. it finds the div. the text content doesn't match. instead of partially fixing it, it flags the whole subtree.&lt;/p&gt;

&lt;p&gt;in dev mode you get the warning. in production? react just silently fixes it by replacing the server content with the client render. no error. no nothing. you'd never know unless you were watching the network tab and noticed your carefully SSR'd HTML was being thrown away immediately.&lt;/p&gt;

&lt;p&gt;that was kind of unsettling actually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;break #4: reading from localStorage on first render&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&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;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`theme-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this one doesn't just mismatches - it crashes. localStorage doesn't exist on the server. you get a reference error before react even gets a chance to complain about hydration.&lt;/p&gt;

&lt;p&gt;but the lesson here was different. it made me think about what "server" actually means in this context. people say "the server doesn't have localStorage" like it's a gotcha fact. but why? because the server is node. node doesn't implement browser APIs. it's not a browser. it's just a JavaScript runtime that can render react components to a string.&lt;/p&gt;

&lt;p&gt;when you think about it that way, the rule becomes obvious instead of arbitrary. don't use browser APIs in code that runs on the server. window, document, localStorage, navigator - all of these are browser things. next.js might be doing SSR but the "S" is still a server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;break #5: conditional rendering based on props that differ server/client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;this one was more subtle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// some parent component&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserCard&lt;/span&gt; &lt;span class="na"&gt;showEmail&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the prop itself is random. so the server might render the email field, the client might not (or vice versa). the child component is "correct" in isolation but the inputs it's receiving are inconsistent.&lt;/p&gt;

&lt;p&gt;i'd never thought about hydration errors being caused outside the component that shows the error. react points at the component that rendered the mismatched output, but the actual bug is in the parent.&lt;/p&gt;

&lt;p&gt;this one burns people in the wild when they're doing things like passing Date.now() as a prop, or any calculation that produces different values between server and client execution.&lt;/p&gt;

&lt;p&gt;the part that actually messed with my head&lt;/p&gt;

&lt;p&gt;at some point i started reading through how react's hydration works internally. like actually reading the source, not just blog posts.&lt;/p&gt;

&lt;p&gt;react has this function hydrateRoot. when you call it, react starts a "hydration pass" where instead of creating new DOM nodes, it reads existing ones. it's walking your real DOM and building its fiber tree from the DOM, not to the DOM.&lt;/p&gt;

&lt;p&gt;but here's the thing - it still runs your component functions. it still calls useState, useEffect setup (well, in terms of registering effects), all of it. it just doesn't write any DOM.&lt;/p&gt;

&lt;p&gt;except when there's a mismatch. then it has to write DOM. and it has to figure out what to write, because the existing DOM is wrong. which means in a bad case, hydration is actually more expensive than a fresh client render because it tries the fast path first, fails, and then falls back to the slow path anyway.&lt;/p&gt;

&lt;p&gt;i genuinely did not know this before i started breaking things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;break #6: using suppressHydrationWarning everywhere&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;okay this one was me being chaotic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;suppressHydrationWarning&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this is a real prop. it tells react "i know this might not match, don't warn me." it's meant for timestamps, dynamic ids, things like that.&lt;/p&gt;

&lt;p&gt;i started slapping it everywhere to see what would happen. and the answer is: everything looks fine. no warnings. but the content is still wrong. react silently accepts the server content for those nodes and doesn't re-render them from the client. so if you're using this as a way to "fix" hydration mismatches on important content, you're not fixing anything. you're just hiding it.&lt;/p&gt;

&lt;p&gt;the actual content on screen is whatever the server rendered. if that's stale, it stays stale until something triggers a re-render.&lt;/p&gt;

&lt;p&gt;what breaking things taught me that reading docs didn't&lt;/p&gt;

&lt;p&gt;docs tell you the what. "hydration mismatch occurs when server and client render different content." yeah, i knew that.&lt;/p&gt;

&lt;p&gt;breaking things showed me the how and why:&lt;/p&gt;

&lt;p&gt;hydration is a read-then-attach operation, not a render-then-replace&lt;br&gt;
the first client render must match the server render, always, no exceptions&lt;br&gt;
useEffect is specifically useful here because it runs after hydration completes&lt;br&gt;
production hides a lot of pain that dev mode surfaces as warnings&lt;br&gt;
the error often points to the symptom, not the cause&lt;/p&gt;

&lt;p&gt;i think there's something genuinely underrated about intentionally making things break. not finding bugs by accident. deliberately causing failures to understand what the system's failure modes are.&lt;/p&gt;

&lt;p&gt;it's a different kind of learning. you're not reading about edge cases. you're creating them.&lt;/p&gt;

&lt;p&gt;one thing i'd try next&lt;/p&gt;

&lt;p&gt;i want to do the same thing with suspense + streaming SSR. intentionally break the boundary conditions, see when react flushes what, figure out the actual mental model instead of the "here's when you'd use " tutorial version.&lt;/p&gt;

&lt;p&gt;probably gonna do it this week if i stop getting distracted by other things.&lt;/p&gt;

&lt;p&gt;(okkay i won't stop getting distracted,  but i'll try.)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>learning</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>A beginner-friendly mental model of HTTP, HTTPS and how the web communicates</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Thu, 14 May 2026 04:11:36 +0000</pubDate>
      <link>https://dev.to/heytechomaima/a-beginner-friendly-mental-model-of-http-https-and-how-the-web-communicates-1b9p</link>
      <guid>https://dev.to/heytechomaima/a-beginner-friendly-mental-model-of-http-https-and-how-the-web-communicates-1b9p</guid>
      <description>&lt;p&gt;Hiee🥂!!&lt;br&gt;
Lately I’ve been diving deep into web internals and honestly the deeper I go, the crazier it feels.&lt;/p&gt;

&lt;p&gt;So I thought of documenting whatever I’m learning and understanding along the way , not as an expert, but as a curious developer trying to connect the dots.&lt;br&gt;
This is one of those notes. &lt;/p&gt;

&lt;p&gt;I know there’s already a lot of content on HTTP and web architecture out there, but I still wanted to write this because writing things in my own words helps me understand them better&lt;/p&gt;

&lt;p&gt;Will probably keep writing more about web internals, React internals and low-level web stuff as I learn :) &lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note that Networking goes wayyy deeper than this ,this is just me trying to understand and explain the core ideas in simple human language while learning)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So here we goo, &lt;/p&gt;

&lt;p&gt;Every time we open a website, click a button or log into an app, there’s a silent conversation happening between the client and the server.&lt;/p&gt;

&lt;p&gt;HTTP is basically the medium that makes this conversation possible.&lt;/p&gt;

&lt;p&gt;Its through which client and server talks to each other as a means of request , as the name suggests already that request means asking something from someone , and response again as the name suggests its giving an answer to someone’s call (in this case the request’s call) &lt;/p&gt;

&lt;p&gt;So a request is basically asking something from the server , and the response is what the server gives us (client) in the form of whatever we intend to see on the internet. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;I hope you get the idea right..don't you?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now what exactly is HTTP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s a protocol , basically a defined set of rules for how requests and responses should happen between the client and the server.&lt;br&gt;
And a request message usually looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Request Line&lt;br&gt;
Headers&lt;br&gt;
Optional Message Body&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;alright?&lt;/p&gt;

&lt;p&gt;Now obviously every request to the server cannot mean the same thing :}&lt;/p&gt;

&lt;p&gt;Sometimes you want to fetch data.&lt;br&gt;
Sometimes you want to create something.&lt;br&gt;
Sometimes, update it.&lt;br&gt;
Sometimes delete it.&lt;br&gt;
So for that, HTTP provides different methods to tell the server what action the client actually wants to perform.&lt;/p&gt;

&lt;p&gt;Some common HTTP methods are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;li&gt;PUT&lt;/li&gt;
&lt;li&gt;PATCH&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;li&gt;HEAD&lt;/li&gt;
&lt;li&gt;OPTIONS&lt;/li&gt;
&lt;li&gt;TRACE&lt;/li&gt;
&lt;li&gt;CONNECT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, the most fascinating (and honestly crazy) thing was knowing that HTTP is a stateless protocol.&lt;/p&gt;

&lt;p&gt;Meaning?&lt;/p&gt;

&lt;p&gt;You send a request.&lt;br&gt;
The server processes it.&lt;br&gt;
Give a response.&lt;br&gt;
And then suddenly…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Who are you again?&lt;/em&gt;” &lt;/p&gt;

&lt;p&gt;So in this case, you’d basically have to log in on every single page again and again because somehow the server has to remember the context of YOU, right? 😭&lt;/p&gt;

&lt;p&gt;Like imagine opening Amazon.com, logging in, doing your shopping, ordering earpods, paying for them and everything is done,&lt;/p&gt;

&lt;p&gt;then 2 hours later  or maybe the next day , you open the app again and the website suddenly goes:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Who are you babe?&lt;/em&gt;” 💀&lt;/p&gt;

&lt;p&gt;Wouldn’t that be complete chaos?&lt;/p&gt;

&lt;p&gt;There had to be something which could tell the server:&lt;br&gt;
“ this is the same person, don’t you dare forget them ”&lt;/p&gt;

&lt;p&gt;And that “noble job” is basically being done by Cookies and Session Storage.&lt;/p&gt;

&lt;p&gt;Cookies: a small piece of text stored in the user’s device by the browser , which consists of name-value pairs containing bits of information about the user, so the web experience doesn’t reset every five seconds. &lt;/p&gt;

&lt;p&gt;But remembering the user wasn’t the only challenge with HTTP &lt;br&gt;
There was another problem too, speed and connection efficiency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipelining, Multiplexing and the emergence of HTTPS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HTTP/1.0 was pretty straightforward:&lt;/p&gt;

&lt;p&gt;One request.&lt;br&gt;
One response.&lt;br&gt;
Connection closed.&lt;/p&gt;

&lt;p&gt;and then again,&lt;br&gt;
new request = new connection setup every single time!! &lt;/p&gt;

&lt;p&gt;which was obviously kinda slow and tiring.&lt;/p&gt;

&lt;p&gt;So HTTP/1.1 introduced something called &lt;strong&gt;Pipelining&lt;/strong&gt;.&lt;br&gt;
Meaning?&lt;br&gt;
The client could send multiple requests together without waiting for the previous response to arrive first.&lt;br&gt;
Sounds cool, right?&lt;/p&gt;

&lt;p&gt;but there was still a problem.&lt;/p&gt;

&lt;p&gt;The server still had to return responses in order:&lt;br&gt;
response 1 -&amp;gt; response 2 -&amp;gt; response 3 ...&lt;br&gt;
So if request 1 became slow for some reason, the further requests had to wait too.&lt;/p&gt;

&lt;p&gt;This problem was called &lt;strong&gt;HOL Blocking (Head Of Line Blocking)&lt;/strong&gt;.&lt;br&gt;
and that’s where &lt;strong&gt;Multiplexing&lt;/strong&gt; entered the chat !!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiplexing&lt;/strong&gt; basically means sending and receiving multiple requests and responses simultaneously over the same connection.&lt;/p&gt;

&lt;p&gt;Then came &lt;strong&gt;HTTP/2&lt;/strong&gt; which introduced proper multiplexing over a single connection along with header compression.&lt;/p&gt;

&lt;p&gt;And later &lt;strong&gt;HTTP/3&lt;/strong&gt; came into the picture, running over UDP with faster connection setup and better performance during packet loss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then comes HTTPS (Secure HTTP)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now obviously sending sensitive stuff like passwords, payment details and tokens in plain text over the internet would be a terrible idea💀&lt;/p&gt;

&lt;p&gt;So &lt;strong&gt;HTTPS&lt;/strong&gt; adds encryption to the communication between the client and the server.&lt;br&gt;
Meaning?&lt;br&gt;
Even if someone somehow intercepts the data in between, they still won’t be able to understand it.&lt;/p&gt;

&lt;p&gt;Think of it like this &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;HTTP:&lt;br&gt;
Client -&amp;gt; “my password is 12345” -&amp;gt; Network&lt;br&gt;
HTTPS:&lt;br&gt;
Client -&amp;gt; encrypted unreadable gibberish -&amp;gt; Network&lt;br&gt;
Server -&amp;gt; decrypts -&amp;gt; “my password is 12345”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and behind the scenes, things like &lt;strong&gt;TLS&lt;/strong&gt; and digital certificates help establish this secure communication channel.&lt;/p&gt;

&lt;p&gt;That’s basically the core idea behind &lt;strong&gt;HTTPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;the deeper I go into web internals, the crazier the internet starts feeling,&lt;/p&gt;

&lt;p&gt;Like imagine billions of devices continuously talking to servers through requests, responses, protocols, encryption, cookies, packets and what not !!!&lt;/p&gt;

&lt;p&gt;and somehow all of this works so smoothly that we casually open Instagram while eating chips :)&lt;/p&gt;

&lt;p&gt;Just curious hat was the first web/internet concept that completely blew your mind?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(If I misunderstood something anywhere, I’d genuinely love corrections or deeper insights from y’all🙌)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web</category>
      <category>http</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Sat, 09 May 2026 08:28:27 +0000</pubDate>
      <link>https://dev.to/heytechomaima/-kfd</link>
      <guid>https://dev.to/heytechomaima/-kfd</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devengers/welcome-to-the-devengers-organization-a-group-of-extraordinary-individuals-that-influenced-devto-4ifb" class="crayons-story__hidden-navigation-link"&gt;Welcome to the DEVengers Organization! A group of extraordinary individuals who have shaped Dev.to like no other! 🚀&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/devengers/welcome-to-the-devengers-organization-a-group-of-extraordinary-individuals-that-influenced-devto-4ifb" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Unofficial invite-only group for creators&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 class="crayons-logo crayons-logo--l" href="/devengers"&gt;
            &lt;img alt="The DEVengers logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12483%2Fb3a03d2d-fbb6-4355-9593-dff0f92638e9.webp" class="crayons-logo__image" width="800" height="800"&gt;
          &lt;/a&gt;

          &lt;a href="/francistrdev" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3711376%2Fe88f6fdf-33af-4dde-bb60-fbe662e87d02.gif" alt="francistrdev profile" class="crayons-avatar__image" width="320" height="320"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/francistrdev" class="crayons-story__secondary fw-medium m:hidden"&gt;
              FrancisTRᴅᴇᴠ
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                FrancisTRᴅᴇᴠ
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
                &lt;img alt="Community Curator" class="community-leader-icon" src="https://assets.dev.to/assets/community-leader-icon-b72c9e74eff54916e5c46c962f47ba40c9f611a71f8b157511f9613f69c0001b.svg" width="20" height="20"&gt;
              
              &lt;div id="story-author-preview-content-3635100" 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="/francistrdev" 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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3711376%2Fe88f6fdf-33af-4dde-bb60-fbe662e87d02.gif" class="crayons-avatar__image" alt="" width="320" height="320"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;FrancisTRᴅᴇᴠ&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;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/devengers" class="crayons-story__secondary fw-medium"&gt;The DEVengers&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/devengers/welcome-to-the-devengers-organization-a-group-of-extraordinary-individuals-that-influenced-devto-4ifb" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 8&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/devengers/welcome-to-the-devengers-organization-a-group-of-extraordinary-individuals-that-influenced-devto-4ifb" id="article-link-3635100"&gt;
          Welcome to the DEVengers Organization! A group of extraordinary individuals who have shaped Dev.to like no other! 🚀
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/community"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;community&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/meta"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;meta&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&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/devengers/welcome-to-the-devengers-organization-a-group-of-extraordinary-individuals-that-influenced-devto-4ifb" 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/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.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;63&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/devengers/welcome-to-the-devengers-organization-a-group-of-extraordinary-individuals-that-influenced-devto-4ifb#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              14&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;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>(Avengers Already Warned You) CS Isn’t Dead. You’re Just Watching It Mutate</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Wed, 01 Apr 2026 13:54:58 +0000</pubDate>
      <link>https://dev.to/heytechomaima/avengers-already-warned-you-cs-isnt-dead-youre-just-watching-it-mutate-424g</link>
      <guid>https://dev.to/heytechomaima/avengers-already-warned-you-cs-isnt-dead-youre-just-watching-it-mutate-424g</guid>
      <description>&lt;p&gt;Okay so let’s drop the fake motivation for a second.&lt;/p&gt;

&lt;p&gt;The shift is real and yeah - it’s uncomfortable (as hell).&lt;/p&gt;

&lt;p&gt;People are getting laid off.&lt;br&gt;
Tools are evolving faster than we can even process.&lt;br&gt;
Stuff that took weeks now takes hours.&lt;/p&gt;

&lt;p&gt;and then someone casually says: just understand problems deeply bro&lt;/p&gt;

&lt;p&gt;like that explains anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zoom out for a second&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;10–15 years ago?&lt;/p&gt;

&lt;p&gt;one smartphone per family, one computer in the whole locality, internet felt like a luxury&lt;/p&gt;

&lt;p&gt;and still, the software industry was growing.&lt;/p&gt;

&lt;p&gt;NOW?&lt;/p&gt;

&lt;p&gt;Every person has a device&lt;br&gt;
Every business runs on software&lt;br&gt;
Entire economies are digital&lt;/p&gt;

&lt;p&gt;and some people are saying:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“CS is dead”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;that’s not just wrong ,that’s lazy thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What’s actually happening?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Computer Science and technology is mutating into something we don’t fully have a name for (yet) and no this is not a “new tool” phase.&lt;br&gt;
this is a &lt;strong&gt;new layer of reality&lt;/strong&gt; being added.&lt;/p&gt;

&lt;p&gt;Like avengers, it’s no longer just humans, it’s AI ,enhanced beings, agentic stuff , old rules stop applying&lt;/p&gt;

&lt;p&gt;That’s where we are !!&lt;/p&gt;

&lt;p&gt;The old definition of a “developer” is breaking.&lt;/p&gt;

&lt;p&gt;Not slowly. Rapidly.&lt;/p&gt;

&lt;p&gt;Earlier:&lt;/p&gt;

&lt;p&gt;I can code = value&lt;/p&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;p&gt;I can prompt, glue APIs, ship fast, leverage AI = &lt;em&gt;baseline&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;and even that baseline is shifting every few months.&lt;/p&gt;

&lt;p&gt;So yeah - if someone built their entire identity around:&lt;/p&gt;

&lt;p&gt;syntax&lt;br&gt;
frameworks&lt;br&gt;
memorizing patterns&lt;/p&gt;

&lt;p&gt;They will feel like the ground is disappearing.&lt;/p&gt;

&lt;p&gt;because IT IS !!&lt;/p&gt;

&lt;p&gt;People keep calling it “evolution”.&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;This feels more like when Tony discovered JARVIS.&lt;/p&gt;

&lt;p&gt;We’re not just improving workflows.&lt;/p&gt;

&lt;p&gt;We’re changing:&lt;/p&gt;

&lt;p&gt;how software is built&lt;br&gt;
who can build it&lt;br&gt;
how fast things move&lt;br&gt;
what &lt;strong&gt;skill&lt;/strong&gt; even means&lt;br&gt;
Why the usual advice feels boring now&lt;/p&gt;

&lt;p&gt;so now you need to:&lt;/p&gt;

&lt;p&gt;adapt faster than tools change , unlearn aggressively , build with things you barely understand yet , stay calm when nothing feels stable&lt;/p&gt;

&lt;p&gt;This wasn’t required before at &lt;strong&gt;this level.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;basically you’re closer to Tony Stark in a lab than a traditional coder.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So what now?&lt;/p&gt;

&lt;p&gt;Not “grind harder”.&lt;/p&gt;

&lt;p&gt;Not “just learn DSA”.&lt;/p&gt;

&lt;p&gt;Not “just build projects”.&lt;/p&gt;

&lt;p&gt;That advice alone won’t cut it anymore.&lt;/p&gt;

&lt;p&gt;What actually matters now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you move with uncertainty without freezing?&lt;/li&gt;
&lt;li&gt;Can you learn tools faster than they become obsolete?&lt;/li&gt;
&lt;li&gt;Can you ship even when you don’t feel ready?&lt;/li&gt;
&lt;li&gt;Can you stay in the game while others quit out of confusion?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because that’s what’s filtering people right now.&lt;/p&gt;

&lt;p&gt;Not intelligence.&lt;/p&gt;

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

&lt;p&gt;This phase is  messy &amp;amp; undefined and bit scary ,exactly like every major shift ever.&lt;/p&gt;

&lt;p&gt;but calling it “the death of CS” is just people panicking because:&lt;/p&gt;

&lt;p&gt;the game they learned is not the game being played anymore.&lt;/p&gt;

&lt;p&gt;The industry didn’t die, it just turned into something &lt;strong&gt;more powerful&lt;/strong&gt; and harder to recognize.&lt;/p&gt;

&lt;p&gt;and yeah, it does feel like Avengers.&lt;/p&gt;

&lt;p&gt;not the calm parts.&lt;/p&gt;

&lt;p&gt;the chaotic ones where nobody knows what’s going on,&lt;br&gt;
but the people who stay in the fight end up shaping what comes next !!&lt;/p&gt;

&lt;p&gt;let me know in the comments how you see this whole thing ?&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>techtalks</category>
      <category>web</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Fri, 16 Jan 2026 09:43:13 +0000</pubDate>
      <link>https://dev.to/heytechomaima/-2e74</link>
      <guid>https://dev.to/heytechomaima/-2e74</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/thebitforge/stop-overengineering-how-to-write-clean-code-that-actually-ships-18ni" class="crayons-story__hidden-navigation-link"&gt;Stop Overengineering: How to Write Clean Code That Actually Ships 🚀&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="/thebitforge" 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%2F3581035%2F7a4e3e11-052c-4b61-9f45-e3f421e69147.png" alt="thebitforge profile" class="crayons-avatar__image" width="768" height="1344"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/thebitforge" class="crayons-story__secondary fw-medium m:hidden"&gt;
              TheBitForge
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                TheBitForge
                
                
              
              &lt;div id="story-author-preview-content-3162468" 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="/thebitforge" 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%2F3581035%2F7a4e3e11-052c-4b61-9f45-e3f421e69147.png" class="crayons-avatar__image" alt="" width="768" height="1344"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;TheBitForge&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/thebitforge/stop-overengineering-how-to-write-clean-code-that-actually-ships-18ni" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 10&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/thebitforge/stop-overengineering-how-to-write-clean-code-that-actually-ships-18ni" id="article-link-3162468"&gt;
          Stop Overengineering: How to Write Clean Code That Actually Ships 🚀
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/thebitforge/stop-overengineering-how-to-write-clean-code-that-actually-ships-18ni" 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/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.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;96&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/thebitforge/stop-overengineering-how-to-write-clean-code-that-actually-ships-18ni#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              14&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;
            41 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Freelancing was going fine… until</title>
      <dc:creator>Omaima Ameen</dc:creator>
      <pubDate>Mon, 05 Jan 2026 07:39:54 +0000</pubDate>
      <link>https://dev.to/heytechomaima/freelancing-was-going-fine-until-4ibo</link>
      <guid>https://dev.to/heytechomaima/freelancing-was-going-fine-until-4ibo</guid>
      <description>&lt;p&gt;&lt;strong&gt;Heyy geniuses&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(don’t know if that’s the right word, but hoping at least two people read this )&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So,&lt;br&gt;
I’ve been freelancing for the past few months, mostly building conversion-focused websites and animations, and getting clients through LinkedIn and Instagram.&lt;/p&gt;

&lt;p&gt;Everything was going fine… until curiosity kicked in.&lt;/p&gt;

&lt;p&gt;For the last month or so, I’ve been wanting to understand how things actually work internally - not just what works, but why it works.&lt;/p&gt;

&lt;p&gt;So alongside client work, I started digging into React internals, purely because it’s fun to know why things behave the way they do under the hood.&lt;br&gt;
and honestly… it’s been pretty fun.&lt;/p&gt;

&lt;p&gt;Just learning, building, breaking things, fixing them, and enjoying the process.&lt;/p&gt;

&lt;p&gt;This is my first post here on Dev Community - mostly to see if my kind of people are around.&lt;/p&gt;

&lt;p&gt;People who genuinely love &lt;strong&gt;code.&lt;/strong&gt;&lt;br&gt;
People who have something more interesting to say than “&lt;strong&gt;huhh AI will replace developers.&lt;/strong&gt;”&lt;/p&gt;

&lt;p&gt;Curious to know 👀&lt;br&gt;
What’s been the real reward for you of posting here and being present in this community?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>firstpost</category>
    </item>
  </channel>
</rss>
