<?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: gulnur</title>
    <description>The latest articles on DEV Community by gulnur (@glnurltn).</description>
    <link>https://dev.to/glnurltn</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%2F1711188%2F3fba60f1-f1be-4d0f-b569-b0c37d3e3899.jpg</url>
      <title>DEV Community: gulnur</title>
      <link>https://dev.to/glnurltn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/glnurltn"/>
    <language>en</language>
    <item>
      <title>I Want to Become an Open Source Contributor, But I Don't Know Where to Start</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Wed, 15 Jul 2026 10:18:42 +0000</pubDate>
      <link>https://dev.to/glnurltn/i-want-to-become-an-open-source-contributor-but-i-dont-know-where-to-start-p60</link>
      <guid>https://dev.to/glnurltn/i-want-to-become-an-open-source-contributor-but-i-dont-know-where-to-start-p60</guid>
      <description>&lt;p&gt;&lt;em&gt;Cover image is from-&amp;gt;&lt;/em&gt; &lt;a href="https://www.magnific.com/free-photo/programming-background-with-person-working-with-codes-computer_38669459.htm" rel="noopener noreferrer"&gt;Image by magnific&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've always admired people who contribute to open source.&lt;/p&gt;

&lt;p&gt;Every time I use a library, read its documentation, or find a solution on GitHub, I've realized that someone took the time to build it, improve it, and share it with the community.&lt;/p&gt;

&lt;p&gt;The truth is, I honestly don't know where to begin. 🧐&lt;/p&gt;

&lt;p&gt;It's not that I'm afraid of writing code. I've spent years building web applications, fixing bugs, and learning new technologies as a software engineer. But open source feels like a different world.&lt;/p&gt;

&lt;p&gt;Questions keep coming to mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do people choose their first project?&lt;/li&gt;
&lt;li&gt;Is improving documentation enough for a first contribution?&lt;/li&gt;
&lt;li&gt;How do you avoid breaking someone else's project?&lt;/li&gt;
&lt;li&gt;What's the proper etiquette when opening an issue or a pull request?&lt;/li&gt;
&lt;li&gt;How do I figure out what a project actually needs?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more I think about it, the easier it becomes to postpone taking that first step. So instead of waiting until I have everything figured out, I've decided to make this one of my goals.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Open Source 101 plan 📅
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Find a project I actually use.&lt;/li&gt;
&lt;li&gt;Read its documentation, issues, and commit history.&lt;/li&gt;
&lt;li&gt;Look for beginner-friendly issues.&lt;/li&gt;
&lt;li&gt;Submit my first pull request, even if it's just a documentation improvement.&lt;/li&gt;
&lt;li&gt;Learn from the review process instead of trying to be perfect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know my first contribution won't be groundbreaking 😃, and that's okay. Every experienced open source contributor started with a first pull request, right?&lt;/p&gt;

&lt;p&gt;If you've been contributing to open source for a while, I'd love to hear your advice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was the first project you contributed to, and what helped you get started?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if you're in the same position as me, maybe this is the sign that we should both stop waiting and start contributing..&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: My goal is to submit my first open source pull request before the end of this month. I'll come back and share what I learned whether it succeeds or fails.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>developer</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why My Angular 21 Upgrade Failed 👀</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Thu, 09 Jul 2026 09:48:39 +0000</pubDate>
      <link>https://dev.to/glnurltn/why-my-angular-21-upgrade-failed-mef</link>
      <guid>https://dev.to/glnurltn/why-my-angular-21-upgrade-failed-mef</guid>
      <description>&lt;p&gt;I believe Angular upgrades have become much smoother these days. Most of the time, a simple &lt;code&gt;ng update&lt;/code&gt;is enough to move to the latest version.&lt;/p&gt;

&lt;p&gt;Instead, I spent hours chasing errors that looked completely unrelated to the real problem 😭&lt;/p&gt;

&lt;p&gt;After upgrading the project to Angular 21, I started seeing errors like these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot find module '@angular/material/chips'
Cannot find module '@angular/material/dialog'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kw41ob2gru10afgrie4.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%2F2kw41ob2gru10afgrie4.png" alt=" " width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then another one appeared:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: The current version of "@angular/build" supports Angular ^19...
but detected Angular version 21.x instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first, it looked like Angular Material wasn't installed correctly but i think the actual issue was a version mismatch inside the project.&lt;/p&gt;

&lt;p&gt;Some packages had already been upgraded to Angular 21:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@angular/core&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@angular/common&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@angular/material&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the build system was still using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@angular-devkit/build-angular@19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since Angular's build tools are tightly coupled with the framework version, the compiler started producing misleading errors.&lt;/p&gt;

&lt;p&gt;The build pipeline was the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Commands That Helped
&lt;/h2&gt;

&lt;p&gt;I used these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;ls&lt;/span&gt; @angular-devkit/build-angular
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm explain @angular-devkit/build-angular
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They showed that my project was still resolving Angular 19's build package. That was the clue I needed and than I verified that every Angular package was using the same major version.&lt;/p&gt;

&lt;p&gt;Then I cleaned the project completely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; node_modules
&lt;span class="nb"&gt;rm &lt;/span&gt;package-lock.json
npm cache clean &lt;span class="nt"&gt;--force&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes time usually.(and I did it several times cause Im failed 😃)&lt;/p&gt;

&lt;p&gt;Finally, I confirmed that all Angular packages were aligned before building again. &lt;/p&gt;

</description>
      <category>angular</category>
      <category>upgrade</category>
      <category>webdev</category>
    </item>
    <item>
      <title>the Last Sunset</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Sun, 21 Jun 2026 09:03:11 +0000</pubDate>
      <link>https://dev.to/glnurltn/the-last-sunset-3g3e</link>
      <guid>https://dev.to/glnurltn/the-last-sunset-3g3e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The Last Sunset is a browser-based narrative survival game inspired by the June Solstice theme.&lt;/p&gt;

&lt;p&gt;The concept explores a world where time itself is collapsing. Each day becomes shorter than the last, and the sun is gradually fading from existence. The player controls an autonomous AI archival unit tasked with preserving fragments of human civilization before the final sunset.&lt;/p&gt;

&lt;p&gt;Instead of traditional combat or scoring systems, the game focuses on knowledge preservation. Players collect “data capsules” containing remnants of human history such as scientific discoveries, space exploration missions, and digital archives.&lt;/p&gt;

&lt;p&gt;As the game progresses, the environment becomes increasingly unstable, reflecting the collapse of both time and memory.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://www.canva.com/design/DAHNMbqtxmk/kFkw08zzfSyu4qOhEgU_Dw/edit?utm_content=DAHNMbqtxmk&amp;amp;utm_campaign=designshare&amp;amp;utm_medium=link2&amp;amp;utm_source=sharebutton" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;canva.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Codepen:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/G-lnur-ALTAN/embed/EaNMjJV?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;The project is built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JavaScript (no frameworks)&lt;/li&gt;
&lt;li&gt;HTML5 Canvas API for rendering&lt;/li&gt;
&lt;li&gt;Custom game loop with time scaling&lt;/li&gt;
&lt;li&gt;Procedural particle system for feedback effects&lt;/li&gt;
&lt;li&gt;Dynamic day/night cycle with a shrinking sun mechanic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 GitHub Repository:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Gulnur-Altan" rel="noopener noreferrer"&gt;
        Gulnur-Altan
      &lt;/a&gt; / &lt;a href="https://github.com/Gulnur-Altan/theLastSunset" rel="noopener noreferrer"&gt;
        theLastSunset
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A narrative survival game built for the June Solstice Game Jam
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌅 The Last Sunset&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A small narrative browser game inspired by the June Solstice.&lt;/p&gt;
&lt;p&gt;In a world where the sun is slowly fading away, you play as an AI archive unit collecting fragments of human knowledge before the final sunset.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/assets/banner.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fassets%2Fbanner.jpeg" alt="The Last Sunset Banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎮 Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic day cycle&lt;/li&gt;
&lt;li&gt;Shrinking sun mechanic&lt;/li&gt;
&lt;li&gt;Knowledge capsule collection&lt;/li&gt;
&lt;li&gt;Collapse Mode after Day 7&lt;/li&gt;
&lt;li&gt;Multiple endings based on progress&lt;/li&gt;
&lt;li&gt;Built with HTML5 Canvas and Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🕹 Controls&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Move Left&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Move Right&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jump&lt;/td&gt;
&lt;td&gt;Space&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Run Locally&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/yourusername/the-last-sunset.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; the-last-sunset&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Start a local server:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python -m http.server&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then open:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠 Tech Stack&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;HTML5&lt;/li&gt;
&lt;li&gt;CSS3&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Canvas API&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏆 Challenge&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Created for the June Solstice Game Jam.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Preserve humanity's knowledge before the last sunset.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Gulnur-Altan/theLastSunset" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Key systems include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collision detection (AABB)&lt;/li&gt;
&lt;li&gt;Particle burst system for interactions&lt;/li&gt;
&lt;li&gt;Screen shake and slow-motion effects&lt;/li&gt;
&lt;li&gt;Narrative memory synthesis system&lt;/li&gt;
&lt;li&gt;Collapse mode visual degradation system&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I started with a simple canvas-based platformer and gradually evolved it into a narrative-driven experience.&lt;/p&gt;

&lt;p&gt;The core design decision was to avoid traditional “win/lose” mechanics and instead focus on emergent storytelling through systems.&lt;/p&gt;

&lt;p&gt;Key implementation steps:&lt;/p&gt;

&lt;p&gt;Built a physics-based movement system (A/D + jump)&lt;br&gt;
Added procedural spawning of “knowledge capsules”&lt;br&gt;
Designed a dynamic time system where each day becomes shorter&lt;br&gt;
Implemented a shrinking sun to visually represent entropy&lt;br&gt;
Introduced a “collapse mode” after Day 7 where visual glitches and terminal corruption begin&lt;br&gt;
Created a memory synthesis system that generates a final narrative based on collected data&lt;/p&gt;

&lt;p&gt;To improve game feel, I added several “juice” effects:&lt;/p&gt;

&lt;p&gt;Particle bursts on pickup&lt;br&gt;
Camera shake on interaction&lt;br&gt;
Slow-motion moment during collection&lt;br&gt;
Terminal-style archival feedback&lt;/p&gt;

&lt;p&gt;These small additions significantly improved immersion and emotional feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;🧠 Best Ode to Alan Turing&lt;/p&gt;

&lt;p&gt;The game’s narrative structure is inspired by computational memory and symbolic reconstruction of information — concepts closely aligned with Alan Turing’s legacy.&lt;/p&gt;

&lt;p&gt;The “memory synthesis system” at the end of the game reconstructs a final narrative from fragmented data, similar to how an intelligent system interprets incomplete information.&lt;/p&gt;

&lt;p&gt;🤖 Best Google AI Usage&lt;/p&gt;

&lt;p&gt;The concept of emergent storytelling and memory reconstruction was designed with AI-inspired thinking in mind.&lt;/p&gt;

&lt;p&gt;The final system behaves like a simplified symbolic model that reconstructs meaning from partial inputs, similar to how modern AI systems generate coherent narratives from fragmented context.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gamechallenge</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>What Happens When Companies Stop Hiring Juniors?</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Thu, 18 Jun 2026 07:35:04 +0000</pubDate>
      <link>https://dev.to/glnurltn/what-happens-when-companies-stop-hiring-juniors-1al7</link>
      <guid>https://dev.to/glnurltn/what-happens-when-companies-stop-hiring-juniors-1al7</guid>
      <description>&lt;p&gt;&lt;em&gt;cover image is from-&amp;gt;&lt;a href="https://wingassistant.com/blog/junior-developer-101/" rel="noopener noreferrer"&gt;https://wingassistant.com/blog/junior-developer-101/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Over the last few months, I've noticed a common trend in job postings: everyone seems to be looking for mid-level and senior engineers. On the surface, this makes sense. Experienced developers require less onboarding, can contribute faster, and often need less supervision.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But what happens when an industry collectively reduces junior hiring?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first consequence may be that new graduates and career changers struggle to enter the field. Companies ask for experience, but gaining experience is difficult without a first opportunity. Also, I have many friends who have been searching for jobs for months despite actively improving their skills.&lt;/p&gt;

&lt;p&gt;Today's seniors were once juniors. If fewer junior developers enter the industry now, the future talent pipeline becomes smaller. Eventually, companies may find themselves competing for the same limited pool of experienced engineers.&lt;/p&gt;

&lt;p&gt;There is also a knowledge transfer problem. Strong engineering cultures are built when experienced developers mentor less experienced ones. If junior hiring continues to decline, opportunities for mentorship and long-term team development may decrease as well.&lt;/p&gt;

&lt;p&gt;AI tools may change how entry-level work is performed, but they do not eliminate the need for new engineers. Every senior engineer started somewhere.&lt;/p&gt;

&lt;p&gt;Perhaps companies should be asking, "How can we help junior developers become productive faster?"&lt;/p&gt;

&lt;p&gt;Because an industry that stops investing in beginners may eventually run short of experts.&lt;/p&gt;

&lt;p&gt;Related writings:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://daily.dev/posts/why-ai-is-replacing-junior-developers-and-how-mid-level-engineers-can-survive-g2yxkxqjj" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog.daily.dev%2Fapi%2Fposts%2FG2YxKXQjJ" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://daily.dev/posts/why-ai-is-replacing-junior-developers-and-how-mid-level-engineers-can-survive-g2yxkxqjj" rel="noopener noreferrer" class="c-link"&gt;
            Why AI is Replacing Junior Developers and How Mid-Level...
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            AI tools like Claude Code are displacing junior developers by handling boilerplate and basic tasks, while simultaneously flooding codebases with unoptimized,...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdaily.dev%2Ffavicon-32x32.png" width="32" height="32"&gt;
          daily.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://wingassistant.com/blog/junior-developer-101/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwingassistant.com%2Fwp-content%2Fuploads%2F2026%2F02%2Fwb104-storychief-cover_0ec496e5eebeaa8b6ccf8083049ac474_2000.png" height="450" class="m-0" width="750"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://wingassistant.com/blog/junior-developer-101/" rel="noopener noreferrer" class="c-link"&gt;
            Why You Should Hire a Junior Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Wondering whether a junior developer is the best fit for your software needs? What are a junior dev's responsibilities Read our article to help you decide!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwingassistant.com%2Fwp-content%2Fuploads%2F2021%2F10%2Ffavicon.png" width="38" height="38"&gt;
          wingassistant.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>developers</category>
      <category>career</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Anthropic released new FREE AI courses</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Tue, 09 Jun 2026 13:57:01 +0000</pubDate>
      <link>https://dev.to/glnurltn/anthropic-released-new-free-ai-courses-gj</link>
      <guid>https://dev.to/glnurltn/anthropic-released-new-free-ai-courses-gj</guid>
      <description>&lt;p&gt;Anthropic has released FREE courses on its Skills platform. You can now earn free certificates in Skills, MCP, Subagents, Claude Code, and other AI-related topics directly from Anthropic.&lt;/p&gt;

&lt;p&gt;I've already enrolled and will be reviewing the courses over the next few days.&lt;/p&gt;

&lt;p&gt;If you'd like to check them out:&lt;br&gt;
&lt;a href="https://anthropic.skilljar.com/" rel="noopener noreferrer"&gt;https://anthropic.skilljar.com/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;You can read:&lt;br&gt;
&lt;a href="https://app.daily.dev/posts/anthropic-just-released-new-free-ai-courses-vhinyl3gs" rel="noopener noreferrer"&gt;https://app.daily.dev/posts/anthropic-just-released-new-free-ai-courses-vhinyl3gs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image source:&lt;br&gt;
&lt;a href="https://media.daily.dev/image/upload/s--jdHyrLn2--/f_auto/v1780938861/posts/vHinyL3Gs?_a=BAMAMiWQ0" rel="noopener noreferrer"&gt;https://media.daily.dev/image/upload/s--jdHyrLn2--/f_auto/v1780938861/posts/vHinyL3Gs?_a=BAMAMiWQ0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>resources</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Giving a Forgotten Side Project a Second Chance</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Sun, 07 Jun 2026 10:30:21 +0000</pubDate>
      <link>https://dev.to/glnurltn/finishing-up-an-abondoned-app-21n5</link>
      <guid>https://dev.to/glnurltn/finishing-up-an-abondoned-app-21n5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Deploy Friday&lt;/strong&gt;  ☄️&lt;/p&gt;

&lt;p&gt;Deploy Friday is a small browser game inspired by the chaos of software development and Scrum teams. Players must survive a sprint by completing tasks, handling production incidents, and managing their stress level.&lt;/p&gt;

&lt;p&gt;Built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No frameworks or external dependencies. The game is powered by a few simple state variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;stress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sprintTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;gameEnded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Tasks are generated dynamically and random incidents keep the sprint unpredictable. If stress reaches 100%, the sprint fails.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://gulnur-altan.github.io/deploy-friday/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;gulnur-altan.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;This project started as a Scrum Quiz application with multiple-choice questions and score tracking. Although it worked, I lost interest and never finished it🥲&lt;/p&gt;

&lt;p&gt;When I found this challenge, I revisited the project and realized it didn't need more quiz questions maybe it needed a new idea.&lt;/p&gt;

&lt;p&gt;Instead of finishing the quiz, I transformed it into Deploy Friday, a sprint survival game inspired by real developer experiences such as production incidents, urgent meetings, and Friday deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot helped me generate repetitive UI code, prototype gameplay ideas, and refactor JavaScript more quickly.&lt;/p&gt;

&lt;p&gt;The biggest benefit was shortening the gap between having an idea and testing it in the browser, allowing me to focus on the game itself rather than boilerplate code.&lt;/p&gt;

&lt;p&gt;This challenge reminded me that sometimes unfinished projects don't need more features,they may need a fresh direction 🧐&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>scrum</category>
    </item>
    <item>
      <title>All GitHub Copilot plans are now on usage-based billing</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Thu, 04 Jun 2026 08:20:57 +0000</pubDate>
      <link>https://dev.to/glnurltn/all-github-copilot-plans-are-now-on-usage-based-billing-1nfl</link>
      <guid>https://dev.to/glnurltn/all-github-copilot-plans-are-now-on-usage-based-billing-1nfl</guid>
      <description>&lt;p&gt;GitHub officially switched to a usage-based billing model a few days ago. The era of unlimited $10 fixed fees is over 🥲&lt;/p&gt;

&lt;p&gt;Recently, GitHub Copilot started introducing more detailed usage-based concepts around premium requests, model access, and AI consumption. Instead of treating all AI interactions equally, the platform is moving closer to a metered model where advanced workflows consume measurable resources.&lt;/p&gt;

&lt;p&gt;I guess some features like code completions remain exempt from credit consumption&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can also use this link for the preview your price:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://copilot-billing-preview.github.com/" rel="noopener noreferrer"&gt;https://copilot-billing-preview.github.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shift makes sense technically.Modern AI coding assistants are no longer simple autocomplete systems. They now:&lt;/p&gt;

&lt;p&gt;generate large codebases,&lt;br&gt;
review pull requests,&lt;br&gt;
run agentic workflows,&lt;br&gt;
analyze repositories,&lt;br&gt;
reason across multiple files,&lt;br&gt;
and interact with increasingly expensive frontier models.&lt;/p&gt;

&lt;p&gt;Those operations require significant compute power.&lt;/p&gt;

&lt;p&gt;The interesting part is that this starts to make AI tooling look less like traditional software subscriptions and more like cloud infrastructure pricing.&lt;/p&gt;

&lt;p&gt;Developers are already familiar with this pattern:&lt;/p&gt;

&lt;p&gt;storage usage,&lt;br&gt;
API rate limits,&lt;br&gt;
serverless execution time,&lt;br&gt;
bandwidth consumption,&lt;br&gt;
GPU compute.&lt;/p&gt;

&lt;p&gt;AI coding assistants may simply be joining that list.&lt;/p&gt;

&lt;p&gt;I think this also changes how developers will use these tools. Instead of blindly prompting large models for everything, we may start seeing:&lt;/p&gt;

&lt;p&gt;smarter model selection,&lt;br&gt;
lightweight workflows,&lt;br&gt;
hybrid local/cloud setups,&lt;br&gt;
and more attention to AI cost optimization.&lt;/p&gt;

&lt;p&gt;In a way, “&lt;strong&gt;prompt efficiency&lt;/strong&gt;” could become similar to cloud cost optimization in DevOps.&lt;/p&gt;

&lt;p&gt;The bigger takeaway is probably this:&lt;/p&gt;

&lt;p&gt;The industry is moving from “AI as a novelty feature” to “AI as infrastructure”. And infrastructure is rarely unlimited.&lt;/p&gt;

&lt;p&gt;You can visit: &lt;a href="https://github.blog/news-insights/company-news/changes-to-github-copilot-individual-plans/" rel="noopener noreferrer"&gt;https://github.blog/news-insights/company-news/changes-to-github-copilot-individual-plans/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>github</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why Engineers Wear Hoodies While Social Media Sells Perfection</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Fri, 22 May 2026 10:09:31 +0000</pubDate>
      <link>https://dev.to/glnurltn/why-engineers-wear-hoodies-while-social-media-sells-perfection-59g3</link>
      <guid>https://dev.to/glnurltn/why-engineers-wear-hoodies-while-social-media-sells-perfection-59g3</guid>
      <description>&lt;p&gt;&lt;em&gt;cover image is from&lt;/em&gt;-&amp;gt;&lt;a href="https://www.magnific.com/free-vector/hacker-operating-laptop-cartoon-icon-illustration-technology-icon-concept-isolated-flat-cartoon-style_11602236.htm" rel="noopener noreferrer"&gt;Image by catalyststuff on Magnific&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a technical post, but something I’ve been thinking about lately.&lt;br&gt;
On one side, many scientists, engineers, startup founders, and developers live surprisingly simple lives. You see people at companies like Google, OpenAI, or research labs wearing the same hoodie every day, using old backpacks, drinking plain coffee, and focusing deeply on their work.&lt;/p&gt;

&lt;p&gt;On the other side, social media constantly tells young people that they need more:&lt;br&gt;
more skincare,&lt;br&gt;
more fashion trends,&lt;br&gt;
more luxury cafés,&lt;br&gt;
more “must have” products,&lt;br&gt;
more aesthetics,&lt;br&gt;
more shopping hauls,&lt;br&gt;
more routines.&lt;/p&gt;

&lt;p&gt;Personally, I find this culture difficult to relate to. The less you consume the less you need. Especially on platforms driven by influencers, life is no longer presented as something to experience. It becomes something to perform.&lt;/p&gt;

&lt;p&gt;And the contrast is hard to ignore.&lt;/p&gt;

&lt;p&gt;I sometimes feel that scientists, researchers, and professors are no longer cultural role models for younger generations.&lt;/p&gt;

&lt;p&gt;Many highly intelligent and productive people simplify their lives to protect their attention.&lt;br&gt;
Meanwhile, algorithms encourage everyone else to consume endlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplicity Is Not Laziness&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is a reason many developers and scientists dress simply.&lt;/p&gt;

&lt;p&gt;People like Steve Jobs, Mark Zuckerberg, and many engineers in Silicon Valley became known for repetitive, minimal clothing styles.&lt;/p&gt;

&lt;p&gt;Not because they could not afford more. Because reducing unnecessary decisions saves mental energy.&lt;/p&gt;

&lt;p&gt;When your brain is focused on building products, solving problems, writing code, researching medicine, or designing systems, appearance becomes less important than clarity.&lt;/p&gt;

&lt;p&gt;Simplicity creates focus.&lt;/p&gt;

&lt;p&gt;A quiet room.&lt;br&gt;
A basic outfit.&lt;br&gt;
A clean workspace.&lt;br&gt;
A smaller circle.&lt;br&gt;
Less noise.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;image is from&lt;/em&gt;-&amp;gt;&lt;a href="https://www.magnific.com/free-vector/organic-flat-business-people-meditating-illustration_13530658.htm" rel="noopener noreferrer"&gt;Image by freepik&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For many builders, minimalism is not a fashion statement.&lt;br&gt;
It is an optimization strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Influencer Economy Profits From Insecurity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Social media works differently.&lt;/p&gt;

&lt;p&gt;Influencer culture often depends on creating dissatisfaction:&lt;br&gt;
your outfit is outdated,&lt;br&gt;
your body is imperfect,&lt;br&gt;
your lifestyle is boring,&lt;br&gt;
your room needs redesigning,&lt;br&gt;
your skin needs fixing,&lt;br&gt;
your morning routine is wrong.&lt;/p&gt;

&lt;p&gt;The business model is simple:&lt;br&gt;
make people feel incomplete,&lt;br&gt;
then sell them the solution(!)&lt;/p&gt;

&lt;p&gt;Sometimes the pressure is different depending on gender.&lt;/p&gt;

&lt;p&gt;Many young women are pushed toward beauty products, fashion trends, and appearance focused consumption from a very early age through social media and advertising.&lt;/p&gt;

&lt;p&gt;Meanwhile, many men are pushed toward status symbols, gadgets, cars, or financial success.&lt;/p&gt;

&lt;p&gt;Both are forms of consumer pressure. And algorithms reward this behavior because insecurity drives engagement.&lt;/p&gt;

&lt;p&gt;The result is a generation constantly comparing themselves to curated lifestyles that are often unrealistic, filtered, sponsored, or financially unsustainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consumption Has Become an Identity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Years ago, people bought products because they needed them. Now many people buy products to build an online identity.&lt;/p&gt;

&lt;p&gt;Coffee becomes content.&lt;br&gt;
Books become decoration.&lt;br&gt;
Travel becomes proof.&lt;br&gt;
Gyms become aesthetics.&lt;br&gt;
Even productivity becomes performance.&lt;/p&gt;

&lt;p&gt;Sometimes people are no longer asking:&lt;br&gt;
“Do I need this?”&lt;/p&gt;

&lt;p&gt;They ask:&lt;br&gt;
“Would this look good online?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Builders Often Think Long-Term&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One thing I notice about many developers, engineers, and technical people is that they often prioritize long-term freedom over short-term appearance.&lt;/p&gt;

&lt;p&gt;Instead of spending constantly to impress strangers online, they invest time into skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coding&lt;/li&gt;
&lt;li&gt;research&lt;/li&gt;
&lt;li&gt;writing&lt;/li&gt;
&lt;li&gt;building products&lt;/li&gt;
&lt;li&gt;learning systems&lt;/li&gt;
&lt;li&gt;creating businesses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I believe the reward is slower.&lt;br&gt;
But usually more real.&lt;/p&gt;

&lt;p&gt;While social media trends change every month, deep skills compound for years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maybe Simplicity Is Becoming Rebellious Again&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a world trying to monetize attention every second, simplicity almost feels rebellious.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wearing basic clothes.&lt;/li&gt;
&lt;li&gt;Ignoring trends.&lt;/li&gt;
&lt;li&gt;Using things longer.&lt;/li&gt;
&lt;li&gt;Reading instead of scrolling.&lt;/li&gt;
&lt;li&gt;Building instead of performing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these things look exciting on social media.&lt;br&gt;
But they might create a calmer and more meaningful life.&lt;/p&gt;

&lt;p&gt;And maybe that is why so many builders quietly choose simplicity.&lt;br&gt;
I think Im going to wear my hoodie until it falls apart.&lt;/p&gt;

&lt;p&gt;“Simplicity is prerequisite for reliability.”&lt;br&gt;
― Edsger W. Dijkstra&lt;/p&gt;

</description>
      <category>developer</category>
      <category>simplicity</category>
    </item>
    <item>
      <title>Understanding B2B SaaS Products as a Developer</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Fri, 15 May 2026 17:08:28 +0000</pubDate>
      <link>https://dev.to/glnurltn/understanding-b2b-saas-products-as-a-developer-47gl</link>
      <guid>https://dev.to/glnurltn/understanding-b2b-saas-products-as-a-developer-47gl</guid>
      <description>&lt;p&gt;&lt;em&gt;Cover image is from-&amp;gt;&lt;a href="https://www.flaticon.com/free-icons/saas" rel="noopener noreferrer"&gt;https://www.flaticon.com/free-icons/saas&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I first started software development, I mostly focused on technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular vs React&lt;/li&gt;
&lt;li&gt;Java vs Go&lt;/li&gt;
&lt;li&gt;SQL vs NoSQL&lt;/li&gt;
&lt;li&gt;Docker, Kubernetes, APIs...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But after some time, I realized something important:&lt;/p&gt;

&lt;p&gt;A lot of engineering decisions actually come from the product model itself.&lt;/p&gt;

&lt;p&gt;Especially the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;B2B&lt;/li&gt;
&lt;li&gt;B2C&lt;/li&gt;
&lt;li&gt;SaaS products&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Understanding these concepts changes how you think about architecture, UX, scaling, integrations, and even deployment strategies.&lt;/p&gt;

&lt;p&gt;So here’s a simple explanation from a developer perspective.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What is B2B?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;B2B means: &lt;strong&gt;Business to Business&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A company builds software for other companies.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;Jira&lt;/li&gt;
&lt;li&gt;Salesforce&lt;/li&gt;
&lt;li&gt;GitHub Enterprise&lt;/li&gt;
&lt;li&gt;Gitlab Enterprise&lt;/li&gt;
&lt;li&gt;Storytelling/analytics/CRM platforms
(&lt;em&gt;I am using some of them on daily basis&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In B2B products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customers are companies&lt;/li&gt;
&lt;li&gt;Sales cycles are longer&lt;/li&gt;
&lt;li&gt;Integrations matter a lot&lt;/li&gt;
&lt;li&gt;Reliability is critical&lt;/li&gt;
&lt;li&gt;Documentation and APIs are very important&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication systems&lt;/li&gt;
&lt;li&gt;Role management&lt;/li&gt;
&lt;li&gt;Enterprise integrations&lt;/li&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;SDKs&lt;/li&gt;
&lt;li&gt;Multi-tenant architecture&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Security compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A B2B customer might have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;thousands of employees&lt;/li&gt;
&lt;li&gt;millions of requests&lt;/li&gt;
&lt;li&gt;strict uptime requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So engineering expectations are usually higher around stability and maintainability.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What is B2C?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;B2C means: &lt;strong&gt;Business to Consumer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A company builds software directly for end users.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;TikTok&lt;/li&gt;
&lt;li&gt;Spotify&lt;/li&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Duolingo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In B2C products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User experience is everything&lt;/li&gt;
&lt;li&gt;Fast onboarding matters&lt;/li&gt;
&lt;li&gt;Viral growth matters&lt;/li&gt;
&lt;li&gt;UI/UX decisions are critical&lt;/li&gt;
&lt;li&gt;Engagement and retention are key metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this often means focusing on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;li&gt;animations&lt;/li&gt;
&lt;li&gt;recommendation systems&lt;/li&gt;
&lt;li&gt;personalization&lt;/li&gt;
&lt;li&gt;mobile experience&lt;/li&gt;
&lt;li&gt;A/B testing&lt;/li&gt;
&lt;li&gt;analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small UI change can affect millions of users instantly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What Does SaaS Mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SaaS stands for: &lt;strong&gt;Software as a Service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of installing software locally, users access it through the cloud.It is a cloud-based software delivery model basically.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;Figma&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Linear&lt;/li&gt;
&lt;li&gt;PostHog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most modern startups today are SaaS companies.&lt;/p&gt;

&lt;p&gt;Typical SaaS characteristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subscription model&lt;/li&gt;
&lt;li&gt;cloud infrastructure&lt;/li&gt;
&lt;li&gt;continuous updates&lt;/li&gt;
&lt;li&gt;web-based access&lt;/li&gt;
&lt;li&gt;recurring revenue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SaaS usually involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cloud-native systems&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;distributed systems&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;scalability&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;B2B SaaS vs B2C SaaS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where things get interesting. Both can be SaaS products, but engineering priorities change significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B2B SaaS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salesforce&lt;/li&gt;
&lt;li&gt;Atlassian&lt;/li&gt;
&lt;li&gt;HubSpot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering priorities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;integrations&lt;/li&gt;
&lt;li&gt;reliability&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;dashboards&lt;/li&gt;
&lt;li&gt;reporting&lt;/li&gt;
&lt;li&gt;enterprise security&lt;/li&gt;
&lt;li&gt;API quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Success metric:&lt;br&gt;
“Can businesses depend on this product every day?”&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;B2C SaaS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spotify&lt;/li&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Canva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering priorities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;engagement&lt;/li&gt;
&lt;li&gt;UX&lt;/li&gt;
&lt;li&gt;personalization&lt;/li&gt;
&lt;li&gt;recommendation algorithms&lt;/li&gt;
&lt;li&gt;responsiveness&lt;/li&gt;
&lt;li&gt;growth metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Success metric:&lt;br&gt;
“Do users keep coming back?”&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As developers, we sometimes focus only on code quality.&lt;/p&gt;

&lt;p&gt;But product type affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture decisions&lt;/li&gt;
&lt;li&gt;infrastructure&lt;/li&gt;
&lt;li&gt;scaling strategy&lt;/li&gt;
&lt;li&gt;frontend complexity&lt;/li&gt;
&lt;li&gt;deployment frequency&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;even hiring decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;A B2B SDK product may prioritize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;API stability&lt;/li&gt;
&lt;li&gt;backward compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A B2C social app may prioritize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;realtime features&lt;/li&gt;
&lt;li&gt;experimentation&lt;/li&gt;
&lt;li&gt;recommendation systems&lt;/li&gt;
&lt;li&gt;engagement analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different products create different engineering cultures.&lt;/p&gt;




&lt;p&gt;Overall,learning technologies is important.&lt;/p&gt;

&lt;p&gt;However,I believe understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how products make money&lt;/li&gt;
&lt;li&gt;who the users are&lt;/li&gt;
&lt;li&gt;what problems businesses are solving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can make you a stronger developer&lt;/p&gt;

</description>
      <category>b2b</category>
      <category>saas</category>
      <category>b2c</category>
    </item>
    <item>
      <title>PostHog Custom Surveys: Beyond the Default UI</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Wed, 13 May 2026 07:57:03 +0000</pubDate>
      <link>https://dev.to/glnurltn/posthog-custom-surveys-beyond-the-default-ui-44on</link>
      <guid>https://dev.to/glnurltn/posthog-custom-surveys-beyond-the-default-ui-44on</guid>
      <description>&lt;p&gt;PostHog provides a powerful analytics and experimentation platform, including built-in surveys for collecting user feedback. However, in real-world applications especially dashboards, internal tools, or B2B SaaS products the default survey UI is not always flexible enough.&lt;/p&gt;

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

&lt;p&gt;In this article, I’ll walk through how I built a fully custom in-app survey UI on top of PostHog, while still using PostHog as the data and analytics layer.&lt;/p&gt;

&lt;p&gt;This approach allowed me to keep full control over UX, layout, and behavior without introducing an additional backend or feedback system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Go Beyond the Default Survey UI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PostHog’s built-in surveys are great for quick setups, but I ran into a few limitations and I would like to edit the pop-up.&lt;/p&gt;

&lt;p&gt;Limited control over positioning and layout&lt;/p&gt;

&lt;p&gt;UI didn’t fully match with my applicaiton&lt;/p&gt;

&lt;p&gt;Needed a lightweight, non-intrusive CES-style survey&lt;/p&gt;

&lt;p&gt;Wanted tighter control over when and how the survey appears&lt;/p&gt;

&lt;p&gt;Instead of replacing PostHog, I decided to treat it as a survey engine, not a UI framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;PostHog Survey&lt;br&gt;
   ↓&lt;br&gt;
onSurveysLoaded()&lt;br&gt;
   ↓&lt;br&gt;
getActiveMatchingSurveys()&lt;br&gt;
   ↓&lt;br&gt;
Custom Angular UI&lt;br&gt;
   ↓&lt;br&gt;
posthog.capture()&lt;/p&gt;

&lt;p&gt;PostHog decides when a survey should be shown.&lt;br&gt;
My application decides how it should look and behave.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listening for Active Surveys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One important lesson: calling getActiveMatchingSurveys() too early often returns an empty array.&lt;/p&gt;

&lt;p&gt;The correct approach is to wait for surveys to finish loading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;posthog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onSurveysLoaded&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;posthog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getActiveMatchingSurveys&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;surveys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;surveys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;surveys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;surveyId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;questionId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;survey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without onSurveysLoaded, surveys may not be available yet&lt;/p&gt;

&lt;p&gt;Ad blockers or strict CSP rules can silently block surveys&lt;/p&gt;

&lt;p&gt;Defensive checks prevent runtime errors&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a Lightweight Custom UI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than using modals or full-screen components, I chose a small fixed-position card with a basic css, that feels native.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.survey&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;360px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ddd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.survey&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Design goals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal color usage&lt;/li&gt;
&lt;li&gt;Mobile-friendly&lt;/li&gt;
&lt;li&gt;Easy to dismiss&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No disruption to the main workflow&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Submitting Survey Responses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When the user submits a response, the survey is sent back to PostHog as a custom event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;posthog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;custom_survey_submitted&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;survey_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;surveyId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;question_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;questionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;selectedValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;When Does a Custom Survey Make Sense?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Custom surveys are especially useful when:&lt;/p&gt;

&lt;p&gt;You need design-system consistency&lt;/p&gt;

&lt;p&gt;You’re building internal tools or admin panels&lt;/p&gt;

&lt;p&gt;Feedback should feel contextual, not disruptive&lt;/p&gt;

&lt;p&gt;You want analytics-grade data, not just form responses&lt;/p&gt;

&lt;p&gt;PostHog excels as the decision and data layer,custom UI lets your product own the experience.&lt;/p&gt;

&lt;p&gt;If you want, you can visit posthog website,they doing lots of great things.&lt;/p&gt;

&lt;p&gt;Useful Links:&lt;br&gt;
&lt;a href="https://posthog.com/" rel="noopener noreferrer"&gt;https://posthog.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/PostHog/posthog" rel="noopener noreferrer"&gt;https://github.com/PostHog/posthog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/posthog-js" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/posthog-js&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>angular</category>
      <category>posthog</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Getting Started with Playwright E2E Testing</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Mon, 11 May 2026 13:40:56 +0000</pubDate>
      <link>https://dev.to/glnurltn/getting-started-with-playwright-e2e-testing-14a</link>
      <guid>https://dev.to/glnurltn/getting-started-with-playwright-e2e-testing-14a</guid>
      <description>&lt;p&gt;Modern web applications need more than unit tests.&lt;/p&gt;

&lt;p&gt;You also need to test real user flows such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Checkout&lt;/li&gt;
&lt;li&gt;Form submissions&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Playwright becomes useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Playwright?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Playwright is a modern E2E testing framework developed by Microsoft.&lt;/p&gt;

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

&lt;p&gt;Main advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-browser support&lt;/li&gt;
&lt;li&gt;Auto waiting&lt;/li&gt;
&lt;li&gt;Parallel test execution&lt;/li&gt;
&lt;li&gt;Fast and reliable&lt;/li&gt;
&lt;li&gt;Works with Chromium, Firefox, and WebKit&lt;/li&gt;
&lt;li&gt;Installation
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init playwright@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple Login Test&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user can login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#email&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;test@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#password&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;123456&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button[type="submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One of the Best Features: Auto Waiting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Playwright automatically waits for elements to become available before interacting with them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In many cases, you don't need manual waits anymore.&lt;/p&gt;

&lt;p&gt;Running Tests&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx playwright &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also run Playwright in UI mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx playwright &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--ui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I personally use this mode a lot while debugging and fixing my tests.&lt;/p&gt;

&lt;p&gt;If you are building production-grade frontend applications, adding E2E testing to your workflow is worth considering.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>playwright</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Before Cloning a GitHub Repository: How to Check If It’s Safe</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Thu, 07 May 2026 12:38:23 +0000</pubDate>
      <link>https://dev.to/glnurltn/before-cloning-a-github-repository-how-to-check-if-its-safe-c19</link>
      <guid>https://dev.to/glnurltn/before-cloning-a-github-repository-how-to-check-if-its-safe-c19</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqwg089e5pgrlszpde0o.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqwg089e5pgrlszpde0o.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;As developers, we clone GitHub repositories almost every day.&lt;/p&gt;

&lt;p&gt;Sometimes to learn a new framework, sometimes to test an open-source project, and sometimes simply because a repository looks interesting.&lt;/p&gt;

&lt;p&gt;But here’s the problem:&lt;/p&gt;

&lt;p&gt;Running unknown code on your machine can be risky.&lt;br&gt;
(I’ve also heard many stories on LinkedIn about this kind of scam. Yes, this is a real scam, and some people share these repositories with candidates who believe they are going through a legitimate interview process)&lt;/p&gt;

&lt;p&gt;A simple &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;, or shell script may execute malicious commands, download hidden binaries, expose environment variables, or even install crypto miners.&lt;/p&gt;

&lt;p&gt;Open source is powerful, but “public” does not automatically mean “safe”.&lt;/p&gt;

&lt;p&gt;In this writing, we’ll go through a practical checklist to evaluate whether a GitHub repository looks trustworthy before running it locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Check the Repository Owner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before cloning anything, look at who owns the repository.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this a real developer or organization?&lt;/li&gt;
&lt;li&gt;Does the account have activity history?&lt;/li&gt;
&lt;li&gt;Are there multiple repositories?&lt;/li&gt;
&lt;li&gt;Do contributors look legitimate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A repository created yesterday with zero history and copied documentation is already a warning sign.&lt;/p&gt;

&lt;p&gt;Fake repositories often imitate popular projects using similar names.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;react-official-tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nextjs-fast-build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-helper-pro&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some malicious repositories are intentionally named to look trustworthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Inspect the Commit History&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A healthy repository usually has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistent commits&lt;/li&gt;
&lt;li&gt;meaningful commit messages&lt;/li&gt;
&lt;li&gt;multiple contributors&lt;/li&gt;
&lt;li&gt;issue discussions&lt;/li&gt;
&lt;li&gt;pull requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be cautious if you see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one huge initial commit&lt;/li&gt;
&lt;li&gt;random generated commit names&lt;/li&gt;
&lt;li&gt;no development history&lt;/li&gt;
&lt;li&gt;suspicious binary file uploads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything appeared suddenly in a single commit, inspect more carefully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Read the Installation Instructions Carefully&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the biggest mistakes developers make is blindly copying commands from README files.&lt;/p&gt;

&lt;p&gt;Especially commands like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl something.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 777 /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never execute commands you do not fully understand.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;external downloads&lt;/li&gt;
&lt;li&gt;hidden shell scripts&lt;/li&gt;
&lt;li&gt;encoded commands&lt;/li&gt;
&lt;li&gt;unnecessary sudo usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Check package.json or Build Scripts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For JavaScript projects, inspect the scripts section before running &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postinstall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node install.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;postinstall&lt;/code&gt; scripts execute automatically during installation.&lt;/p&gt;

&lt;p&gt;Check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;obfuscated JavaScript&lt;/li&gt;
&lt;li&gt;external downloads&lt;/li&gt;
&lt;li&gt;crypto mining packages&lt;/li&gt;
&lt;li&gt;suspicious environment variable access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"postinstall"&lt;/span&gt; package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Review Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the repository itself is clean, but dependencies are malicious.&lt;/p&gt;

&lt;p&gt;Attackers occasionally publish packages with names very similar to popular libraries.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;expresss&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reeact&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lodas&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is called typo-squatting.&lt;/p&gt;

&lt;p&gt;Use tools like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip-audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go mod verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;outdated dependencies&lt;/li&gt;
&lt;li&gt;abandoned packages&lt;/li&gt;
&lt;li&gt;unknown private registries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Avoid Running Unknown Code on Your Main Machine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is probably the most important habit.&lt;/p&gt;

&lt;p&gt;If you are testing an unknown project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use Docker&lt;/li&gt;
&lt;li&gt;use a virtual machine&lt;/li&gt;
&lt;li&gt;use a separate development environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; node:20 bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isolates the environment and reduces risk.&lt;/p&gt;

&lt;p&gt;Running random repositories directly on your personal machine is not a great idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Look at the Security Tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub provides useful security information.&lt;/p&gt;

&lt;p&gt;Check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;security policies&lt;/li&gt;
&lt;li&gt;dependency alerts&lt;/li&gt;
&lt;li&gt;vulnerability reports&lt;/li&gt;
&lt;li&gt;signed commits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repositories with active maintenance and security practices are usually more trustworthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Be Extra Careful With AI-Generated Repositories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI tools make it easier than ever to generate fake or low-quality projects.&lt;/p&gt;

&lt;p&gt;Some repositories now contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copied README files&lt;/li&gt;
&lt;li&gt;auto-generated code&lt;/li&gt;
&lt;li&gt;hidden malicious payloads&lt;/li&gt;
&lt;li&gt;fake stars or fake engagement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A professional-looking README does not guarantee safety.&lt;/p&gt;

&lt;p&gt;Always inspect the actual code.&lt;/p&gt;




&lt;p&gt;Open source software is one of the best parts of modern development.&lt;/p&gt;

&lt;p&gt;But developers should approach unknown repositories with the same caution used when downloading software from the internet.&lt;/p&gt;

&lt;p&gt;A few minutes of inspection can prevent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;credential leaks&lt;/li&gt;
&lt;li&gt;malware infections&lt;/li&gt;
&lt;li&gt;exposed SSH keys&lt;/li&gt;
&lt;li&gt;compromised development environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before running code, take a moment to verify what you are actually installing.&lt;/p&gt;

</description>
      <category>github</category>
      <category>interview</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
