<?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.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>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>
    <item>
      <title>The Day I Stopped Saying “This Isn’t My Job”</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Sat, 04 Apr 2026 20:41:26 +0000</pubDate>
      <link>https://dev.to/glnurltn/the-day-i-stopped-saying-this-isnt-my-job-e8n</link>
      <guid>https://dev.to/glnurltn/the-day-i-stopped-saying-this-isnt-my-job-e8n</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%2Fuhre4aihle3l90z6xwp0.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%2Fuhre4aihle3l90z6xwp0.png" alt=" " width="798" height="131"&gt;&lt;/a&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was hired as a full stack developer.&lt;/p&gt;

&lt;p&gt;My daily work mostly revolved around building features, improving backend services, working on frontend interfaces, and making sure users had a smooth experience. Infrastructure operations, SSL certificate renewals, or platform upgrades were never officially part of my role.&lt;/p&gt;

&lt;p&gt;But in real engineering teams, reality rarely follows job titles.&lt;/p&gt;

&lt;p&gt;One day, our GitLab instance required a version upgrade. It was not a simple “nice to have” update. The upgrade was important for security, compatibility, and long-term maintainability. Around the same time, one of our Red Hat OpenShift SSL certificates was approaching expiration.&lt;/p&gt;

&lt;p&gt;Both tasks carried risk.&lt;/p&gt;

&lt;p&gt;A failed GitLab upgrade could interrupt the entire development workflow for the team. An expired SSL certificate could break secure access to critical internal services. Neither of these problems could wait comfortably for “the right team.”&lt;/p&gt;

&lt;p&gt;And that was the moment I had to make a choice.&lt;/p&gt;

&lt;p&gt;I could say:&lt;/p&gt;

&lt;p&gt;“This isn’t my responsibility.”&lt;/p&gt;

&lt;p&gt;Or I could step forward and learn.&lt;/p&gt;

&lt;p&gt;I chose the second option.&lt;/p&gt;

&lt;p&gt;Learning Beyond the Role&lt;/p&gt;

&lt;p&gt;At first, I felt the weight of uncertainty.&lt;/p&gt;

&lt;p&gt;As developers, we often become comfortable inside the boundaries of our official roles. Frontend, backend, API integrations, databases these were familiar territories for me.&lt;/p&gt;

&lt;p&gt;But production systems teach a different lesson:&lt;br&gt;
software is never isolated from infrastructure.&lt;/p&gt;

&lt;p&gt;So I started where every engineer starts when facing something unfamiliar: documentation.&lt;/p&gt;

&lt;p&gt;I carefully reviewed the GitLab upgrade path, version compatibility notes, backup procedures, and rollback scenarios. I made sure we had snapshots and restore points before touching anything.&lt;/p&gt;

&lt;p&gt;For the Red Hat OpenShift SSL certificate update, I studied how secrets, routes, and ingress configurations were managed inside the cluster. I traced how the certificate propagated through the environment and planned the safest replacement sequence.&lt;/p&gt;

&lt;p&gt;The technical work itself mattered.&lt;/p&gt;

&lt;p&gt;But what mattered more was learning how to stay calm around systems that affect everyone.&lt;/p&gt;

&lt;p&gt;The biggest challenge was not technical complexity.&lt;/p&gt;

&lt;p&gt;It was psychological.&lt;/p&gt;

&lt;p&gt;The fear of breaking production.&lt;br&gt;
The fear of causing downtime.&lt;br&gt;
The fear of touching systems outside my “comfort zone.”&lt;/p&gt;

&lt;p&gt;What helped me overcome that fear was process.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the documentation twice&lt;/li&gt;
&lt;li&gt;Prepare backups first&lt;/li&gt;
&lt;li&gt;Test in lower environments&lt;/li&gt;
&lt;li&gt;Create a rollback plan&lt;/li&gt;
&lt;li&gt;Communicate the maintenance window clearly&lt;/li&gt;
&lt;li&gt;Validate after every step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I realized confidence in engineering is rarely about already knowing the answer.&lt;/p&gt;

&lt;p&gt;It comes from knowing how to reduce risk.&lt;/p&gt;

&lt;p&gt;That experience changed how I think about growth in tech.&lt;/p&gt;

&lt;p&gt;Sometimes the most important career moments begin exactly where your job description ends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What This Taught Me About Inclusion in Tech&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One reason I wanted to share this story for the 2026 WeCoded Challenge is that growth opportunities in tech are often shaped by trust.&lt;/p&gt;

&lt;p&gt;Sometimes inclusion is not only about who gets hired.&lt;br&gt;
It is also about who gets trusted with meaningful problems.&lt;/p&gt;

&lt;p&gt;Being given space to step into unfamiliar responsibilities helped me grow faster than any predefined roadmap could.&lt;/p&gt;

&lt;p&gt;And I believe equitable teams are the ones that create these learning moments for everyone: not based on title, seniority, or assumptions, but based on curiosity, support, and trust.&lt;/p&gt;

&lt;p&gt;That GitLab upgrade and SSL certificate replacement were small operational tasks in the bigger picture of engineering.&lt;/p&gt;

&lt;p&gt;But for me, they represented something larger.&lt;/p&gt;

&lt;p&gt;They taught me that titles define your starting point, not your limits.&lt;/p&gt;

&lt;p&gt;Sometimes the best thing you can do for your career is to stop saying:&lt;/p&gt;

&lt;p&gt;“This isn’t my job.”&lt;/p&gt;

&lt;p&gt;And start asking:&lt;/p&gt;

&lt;p&gt;“How can I solve this safely?”&lt;/p&gt;

&lt;p&gt;I believe that mindset has stayed with me ever since.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>wecoded</category>
      <category>career</category>
    </item>
    <item>
      <title>Trunk-Based vs. Branch-Based Development: Which Strategy Fits Your Team Best?</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Wed, 01 Apr 2026 14:41:34 +0000</pubDate>
      <link>https://dev.to/glnurltn/trunk-based-vs-branch-based-development-which-strategy-fits-your-team-best-53hn</link>
      <guid>https://dev.to/glnurltn/trunk-based-vs-branch-based-development-which-strategy-fits-your-team-best-53hn</guid>
      <description>&lt;p&gt;One of the most important factors that shapes development speed and code quality in modern software teams is the branching strategy. Two of the most common approaches are Trunk-Based Development (TBD) and Branch-Based Development.&lt;/p&gt;

&lt;p&gt;Let’s compare both approaches in a clear and practical way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Is Trunk-Based Development?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trunk-Based Development is a workflow where all developers integrate their changes into a single main branch (usually main) using either very short-lived branches or direct commits.&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%2Fd560o9a4313v1q6vct0j.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%2Fd560o9a4313v1q6vct0j.png" width="777" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encourages small and frequent commits&lt;/li&gt;
&lt;li&gt;Reduces merge conflict risk&lt;/li&gt;
&lt;li&gt;Works perfectly with CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Speeds up release cycles&lt;/li&gt;
&lt;li&gt;Safer deployments with feature flags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires strong testing discipline&lt;/li&gt;
&lt;li&gt;Large features may need careful feature toggle management&lt;/li&gt;
&lt;li&gt;Can be challenging for teams new to the practice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Is Branch-Based Development?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this model, developers create separate branches for each feature, bugfix, or release. Git Flow is one of the most well-known examples of this approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier isolation for large features&lt;/li&gt;
&lt;li&gt;More controlled code review workflows&lt;/li&gt;
&lt;li&gt;Fits enterprise approval-based processes well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-lived branches often create merge conflicts&lt;/li&gt;
&lt;li&gt;Integration happens later&lt;/li&gt;
&lt;li&gt;Release cycles can become slower
The classic “it worked on my branch” issue happens more often&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When Should You Use Each One?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast-moving startup and SaaS teams → Trunk-Based Development&lt;br&gt;
Enterprise teams with heavy approval workflows → Branch-Based Development&lt;br&gt;
Teams with mature DevOps and CI/CD culture → TBD&lt;/p&gt;

&lt;p&gt;From my experience, especially during fast upgrades,urgent production hotfixes, the trunk-based approach significantly improves integration speed and reduces operational risk.&lt;/p&gt;

&lt;p&gt;If your goal is faster releases, fewer merge conflicts, and stronger CI/CD pipelines, Trunk-Based Development offers a more modern engineering workflow.&lt;/p&gt;

&lt;p&gt;Interestingly, I realized that we had already been applying this approach in some of our projects without even knowing it had a formal name. I first came across the term in a LinkedIn job requirements section, which made me reflect on how naturally some engineering best practices emerge in real-world teams.&lt;/p&gt;

&lt;p&gt;I think the real key is this: your branching strategy should match your team’s deployment culture.&lt;/p&gt;

</description>
      <category>development</category>
      <category>git</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Habits I Learned Too Late as a Developer — part 2</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Sat, 21 Feb 2026 18:28:49 +0000</pubDate>
      <link>https://dev.to/glnurltn/habits-i-learned-too-late-as-a-developer-part-2-1gio</link>
      <guid>https://dev.to/glnurltn/habits-i-learned-too-late-as-a-developer-part-2-1gio</guid>
      <description>&lt;p&gt;3️⃣ &lt;strong&gt;Not reading software-related books&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a long time, I didn’t read any software-related books.&lt;/p&gt;

&lt;p&gt;I relied mostly on tutorials, short articles, and videos.&lt;br&gt;
They felt more practical and faster to consume.&lt;/p&gt;

&lt;p&gt;What I didn’t realize was what I was missing:&lt;/p&gt;

&lt;p&gt;Long-form thinking and well-structured mental models&lt;/p&gt;

&lt;p&gt;Ideas that stay relevant for years, not weeks. Short content is great for learning how to do something. Books are better at teaching why things work the way they do.&lt;/p&gt;

&lt;p&gt;Without reading books, my knowledge stayed shallow and fragmented.&lt;br&gt;
I knew many tools, but I lacked depth in fundamentals like system design, data modeling, and architecture.&lt;/p&gt;

&lt;p&gt;I learned this late:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a few well-chosen books can save you years of trial and error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Books that changed how I think:&lt;/p&gt;

&lt;p&gt;Clean Code — not for rules, but for learning how to read code critically&lt;/p&gt;

&lt;p&gt;Designing Data-Intensive Applications — for understanding real-world systems and their trade-offs&lt;/p&gt;

&lt;p&gt;The Pragmatic Programmer — for a long-term developer mindset&lt;br&gt;
This link might be helpful if you want to reach some of them &lt;/p&gt;

&lt;p&gt;📕&lt;a href="https://github.com/GunterMueller/Books-3/" rel="noopener noreferrer"&gt;sample books&lt;/a&gt;&lt;br&gt;
🔗&lt;a href="https://codingfearlessly.com/recommended-software-engineering-books" rel="noopener noreferrer"&gt;a nice article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4️⃣ &lt;strong&gt;Focusing only on code 🖥️ and ignoring networking opportunities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another habit I learned too late was attending meetups, events, and developer gatherings.&lt;/p&gt;

&lt;p&gt;For a long time, I simply wasn’t aware of these communities:&lt;br&gt;
Google Developer Group meetups, Cloud Days, Developer Days, Java Days, and similar events.&lt;/p&gt;

&lt;p&gt;When I finally started attending them, I met many experienced developers and learned far more about industry trends than I expected.&lt;/p&gt;

&lt;p&gt;Before that, I used to think:&lt;/p&gt;

&lt;p&gt;Networking wasn’t necessary for “real developers” &lt;/p&gt;

&lt;p&gt;Skills alone would speak for themselves&lt;/p&gt;

&lt;p&gt;Events were mostly marketing or a waste of time&lt;/p&gt;

&lt;p&gt;That mindset was limiting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By not attending events, I literally missed&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How other developers think and work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Industry perspectives outside my own bubble&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opportunities to learn without preparing anything in advance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Networking doesn’t mean selling yourself.It means exchanging context.&lt;/p&gt;

&lt;p&gt;Sometimes, a single conversation at a meetup teaches more than hours of solo learning.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Which habits did you realize too late in your developer journey?&lt;/em&gt; 👀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
      <category>habits</category>
    </item>
    <item>
      <title>Habits I Learned Too Late as a Developer — Part 1</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Wed, 18 Feb 2026 07:53:41 +0000</pubDate>
      <link>https://dev.to/glnurltn/habits-i-learned-too-late-as-a-developer-part-1-116p</link>
      <guid>https://dev.to/glnurltn/habits-i-learned-too-late-as-a-developer-part-1-116p</guid>
      <description>&lt;p&gt;For a long time, I believed that writing more code would automatically make me a better developer.&lt;br&gt;
It didn’t.&lt;/p&gt;

&lt;p&gt;I was improving my syntax and learning new frameworks, but I was mostly doing it in isolation.&lt;br&gt;
What I missed for years was the ecosystem around software development,the people, the discussions and the shared knowledge.&lt;/p&gt;

&lt;p&gt;These are some of the habits I learned much later than I should have.&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Not following high-quality open-source projects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used GitHub mainly as a place to store my own code.&lt;br&gt;
I wasn’t actively following well-maintained, widely used open-source projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That meant I missed:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How real-world projects are structured&lt;/p&gt;

&lt;p&gt;How maintainers review pull requests&lt;/p&gt;

&lt;p&gt;How design decisions are discussed in issues&lt;/p&gt;

&lt;p&gt;What “production-quality” code actually looks like&lt;/p&gt;

&lt;p&gt;Reading good code consistently turned out to be just as important as writing my own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I do now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even when I’m not actively coding, I visit GitHub weekly and check my starred repositories.&lt;br&gt;
I follow a small number of projects and occasionally read a single file, commit instead of trying to understand the entire codebase.&lt;/p&gt;

&lt;p&gt;This habit alone changed how I think about code quality.&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Not knowing developer communities like Medium, dev.to, or CodePen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a long time, learning meant courses, tutorials and bootcamps only.&lt;br&gt;
I underestimated community-driven platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I later realized:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Courses teach ideal scenarios and sooner or later, you forget most of them&lt;/p&gt;

&lt;p&gt;Community posts show real-world mistakes and trade-offs&lt;/p&gt;

&lt;p&gt;Small experiments often teach more than full tutorials&lt;/p&gt;

&lt;p&gt;Platforms like dev.to and CodePen expose you to problems people are actively solving, not just concepts explained in isolation.&lt;/p&gt;

&lt;p&gt;Following challenges and community experiments is also fun.&lt;br&gt;
And that matters more than I used to think.&lt;/p&gt;

&lt;p&gt;If I want to become a better developer, I need to enjoy the learning process, not just endure it.&lt;/p&gt;

</description>
      <category>developer</category>
      <category>coding</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to Write an ATS-Friendly CV: A Complete Guide</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Tue, 07 Oct 2025 10:22:22 +0000</pubDate>
      <link>https://dev.to/glnurltn/how-to-write-an-ats-friendly-cv-a-complete-guide-3mk1</link>
      <guid>https://dev.to/glnurltn/how-to-write-an-ats-friendly-cv-a-complete-guide-3mk1</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%2Frf2kq99r5b76qma1klb2.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%2Frf2kq99r5b76qma1klb2.jpg" alt=" " width="800" height="847"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In today’s job market, it’s not just recruiters who review your CV &lt;br&gt;
Applicant Tracking Systems (ATS) often decide whether your application even gets seen. If your CV isn’t optimized for these systems, your experience and skills might never reach the hiring manager. Here’s how to write a CV that passes ATS filters while still impressing humans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. What is ATS and Why Does It Matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An ATS is software that scans, filters, and ranks CVs based on keywords, formatting, and relevance to the job description. A poorly formatted CV can get rejected automatically, even if you’re the perfect fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Choose the Right File Format&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Best options: PDF or DOCX (most ATS tools can read both).&lt;/p&gt;

&lt;p&gt;Tip: While many modern ATS systems can read PDF files, some older ones may struggle. To be 100% safe, submit your CV as a .docx file unless the employer specifically requests PDF&lt;br&gt;
Also you may want to check file size too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Keep the Design Simple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stick to standard fonts: Arial, Calibri, or Times New Roman.&lt;/p&gt;

&lt;p&gt;Avoid tables, graphics, icons, or text boxes.&lt;/p&gt;

&lt;p&gt;Use clear headings and consistent spacing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Use Keywords Strategically&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scan the job posting for required skills and titles.&lt;/p&gt;

&lt;p&gt;Match those keywords exactly (e.g., if the posting says “Java Developer,” include “Java Developer” in your CV, not just “Java”).&lt;/p&gt;

&lt;p&gt;List tools, certifications, and methodologies (e.g., Agile, Scrum, AWS).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Stick to Standard Headings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ATS tools recognize traditional section titles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work Experience&lt;/li&gt;
&lt;li&gt;Education&lt;/li&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;Certifications&lt;/li&gt;
&lt;li&gt;Languages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creative headings like “My Journey” may confuse the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Write Bullet Points with Action Verbs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avoid long paragraphs. Use concise bullet points.&lt;/p&gt;

&lt;p&gt;Start each with strong verbs: Developed, Managed, Optimized, Implemented.&lt;/p&gt;

&lt;p&gt;Quantify achievements:&lt;br&gt;
“Increased sales by 25%”&lt;br&gt;
“Led a team of 10 engineers”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avoid using vague expression about your accomplisments&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. Format Contact Information Properly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write your phone number in international format: +1 xxx xxx xxxx.&lt;/p&gt;

&lt;p&gt;Use a professional email address(&lt;a href="mailto:firstname.lastname@email.com"&gt;firstname.lastname@email.com&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Include a LinkedIn URL (avoid shortened links like bit.ly).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Skip Unnecessary Details&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No date of birth, marital status, or full home address.&lt;br&gt;
Even photo can be unnecessary for some applications.&lt;/p&gt;

&lt;p&gt;Stick to what’s relevant to the role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Keep It the Right Length&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ideal CV length: 1–2 pages.&lt;/p&gt;

&lt;p&gt;Make every line count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Test Before You Submit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use online ATS simulators (e.g., Jobscan, Resumeworded) to check how your CV matches the job posting. This helps you adjust keywords and formatting before sending.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing an ATS-friendly CV isn’t about being flashy,it’s about being clear, structured, and keyword-optimized. Pass the system first, then let your experience and achievements convince the recruiter.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Remember: Step one is getting past the robot. Step two is winning over the human.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>tutorial</category>
      <category>writing</category>
    </item>
    <item>
      <title>Axero Frontend Challenge: Building a Dynamic Office Intranet Interface</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Sun, 27 Jul 2025 14:21:00 +0000</pubDate>
      <link>https://dev.to/glnurltn/axero-frontend-challenge-building-a-dynamic-office-intranet-interface-39ke</link>
      <guid>https://dev.to/glnurltn/axero-frontend-challenge-building-a-dynamic-office-intranet-interface-39ke</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I designed a nostalgic-futuristic intranet homepage for a fictional company called NeoOffice. My aim was to blend retro design elements—such as pixel fonts, VHS-glitch effects, and old-school widget with a clean, responsive layout that feels modern and functional. The homepage includes:&lt;/p&gt;

&lt;p&gt;🌟 Employee of the Month widget with dynamic highlighting&lt;br&gt;
📆 Upcoming Events section for internal meetings and community activities&lt;br&gt;
🧭 A modular dashboard with useful internal tools (e.g., HR portal, task board)&lt;br&gt;
💬 Team Spotlight and cooler-style announcements&lt;br&gt;
🎨 Subtle CSS inspired by classic office life &lt;/p&gt;

&lt;p&gt;I wanted the homepage to feel like something you'd find in a 90s sci-fi movie…&lt;/p&gt;

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

&lt;p&gt;Live preview on: &lt;iframe height="600" src="https://codepen.io/G-lnur-ALTAN/embed/NPGrJyp?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Github: &lt;a href="https://github.com/Gulnur-Altan/Nostalgic-Futuristic-Webdev-Office-Space" rel="noopener noreferrer"&gt;https://github.com/Gulnur-Altan/Nostalgic-Futuristic-Webdev-Office-Space&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;This was one of the most creative front-end challenges I've participated in. I started with a wireframe in Figma, then experimented with nostalgic UI elements like:&lt;/p&gt;

&lt;p&gt;Monospace pixel fonts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Glowing neon details&lt;/li&gt;
&lt;li&gt;Subtle hover animations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For accessibility, I followed WCAG color contrast standards, ensured all interactive components were keyboard-navigable, and added labels where needed.&lt;/p&gt;

&lt;p&gt;One of my favorite parts was building the Employee of the Month card. I wanted it to feel special—so I gave it an animated badge, spotlight effect, and hover interaction.&lt;/p&gt;

&lt;p&gt;I also added a dashboard panel to simulate internal tools like “Today's Tasks” access.&lt;/p&gt;

&lt;p&gt;Overall, this project helped me blend creativity with usability, and it helped me understand thoughtful UI/UX in internal tools.&lt;br&gt;
displayed publicly.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>revert the merge</title>
      <dc:creator>gulnur</dc:creator>
      <pubDate>Tue, 08 Jul 2025 14:26:29 +0000</pubDate>
      <link>https://dev.to/glnurltn/revert-the-merge-284m</link>
      <guid>https://dev.to/glnurltn/revert-the-merge-284m</guid>
      <description>&lt;p&gt;🔄 How to Undo an Accidental Merge to the Master Branch &lt;br&gt;
Merging the wrong code into the master branch is something that happens.Fortunately, Git and ways to undo this safely.&lt;/p&gt;

&lt;p&gt;Here’s a guide to help you revert that accidental merge depending on your situation.&lt;/p&gt;

&lt;p&gt;💬 Option 1: Revert the Merge Commit (Safe and Recommended)&lt;br&gt;
If the merge created a merge commit, you can revert it with:&lt;/p&gt;

&lt;p&gt;git revert -m 1 &lt;br&gt;
git push origin master -m 1 &lt;/p&gt;

&lt;p&gt;tells Git to keep the first parent of the merge (usually master) and revert the changes from the merged branch.&lt;/p&gt;

&lt;p&gt;You can find the  using git log &lt;/p&gt;

&lt;p&gt;This will create a new commit that undoes the changes from the merge — safe and clean.&lt;/p&gt;

&lt;p&gt;💥Option 2: Hard Reset (Dangerous on Shared Repos)&lt;br&gt;
If you prefer to reset master to a previous commit (for example, before the merge), you can run:&lt;/p&gt;

&lt;p&gt;git reset --hard &lt;br&gt;
git push origin master --force&lt;/p&gt;

&lt;p&gt;💥Warning: This method rewrites history and can break things for teammates.&lt;/p&gt;

&lt;p&gt;⬅️ Option 3: Use GitLab’s “Revert” Button (Easiest)&lt;br&gt;
If you’re using GitLab and the merge request is still visible:&lt;br&gt;
Go to the merged Merge Request and click the Revert.&lt;br&gt;
GitLab will create a new merge request that reverts the merge.&lt;/p&gt;

&lt;p&gt;Merge it — and you're done!&lt;br&gt;
This is a safe and GUI-friendly option if you prefer not to use the terminal.&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
