<?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: Ayman Atif</title>
    <description>The latest articles on DEV Community by Ayman Atif (@a95yman).</description>
    <link>https://dev.to/a95yman</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%2F3887349%2F44f7eb73-8509-408e-94a4-f2d98502a27d.jpg</url>
      <title>DEV Community: Ayman Atif</title>
      <link>https://dev.to/a95yman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/a95yman"/>
    <language>en</language>
    <item>
      <title>Why Most Local Business Websites Fail in 2026 (And How to Fix It)</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Sun, 10 May 2026 21:05:38 +0000</pubDate>
      <link>https://dev.to/a95yman/why-most-local-business-websites-fail-in-2026-and-how-to-fix-it-5hia</link>
      <guid>https://dev.to/a95yman/why-most-local-business-websites-fail-in-2026-and-how-to-fix-it-5hia</guid>
      <description>&lt;p&gt;Most local business websites do not fail because the business is bad.&lt;/p&gt;

&lt;p&gt;They fail because the website silently pushes customers away.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A slow homepage.&lt;/li&gt;
&lt;li&gt;An outdated design.&lt;/li&gt;
&lt;li&gt;No clear call-to-action.&lt;/li&gt;
&lt;li&gt;Poor mobile experience.&lt;/li&gt;
&lt;li&gt;Weak trust signals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;p&gt;Visitors leave without calling, booking, or filling out a form.&lt;/p&gt;

&lt;p&gt;And in 2026, that problem is becoming more expensive than ever.&lt;/p&gt;

&lt;p&gt;Search engines are smarter, users are less patient, and AI-powered search is raising expectations for website quality and structure. Recent industry reports show that slow websites, poor mobile usability, weak SEO structure, and missing trust elements are still among the biggest reasons local businesses lose rankings and conversions. ()&lt;/p&gt;

&lt;p&gt;After reviewing dozens of local business websites across industries, I noticed the same mistakes appearing over and over again.&lt;/p&gt;

&lt;p&gt;Here are the biggest ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Website Looks Outdated
&lt;/h2&gt;

&lt;p&gt;People judge websites incredibly fast.&lt;/p&gt;

&lt;p&gt;If your website feels old, cluttered, or poorly designed, users subconsciously assume the business itself is outdated.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lower trust&lt;/li&gt;
&lt;li&gt;fewer calls&lt;/li&gt;
&lt;li&gt;fewer leads&lt;/li&gt;
&lt;li&gt;higher bounce rates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many local business websites still look like they were built years ago and never updated.&lt;/p&gt;

&lt;p&gt;Modern websites need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear visual hierarchy&lt;/li&gt;
&lt;li&gt;premium typography&lt;/li&gt;
&lt;li&gt;clean spacing&lt;/li&gt;
&lt;li&gt;responsive layouts&lt;/li&gt;
&lt;li&gt;modern interactions&lt;/li&gt;
&lt;li&gt;trust-focused sections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Design is no longer just “appearance”.&lt;/p&gt;

&lt;p&gt;It directly affects conversion and credibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Mobile Experience Is Terrible
&lt;/h2&gt;

&lt;p&gt;Most local traffic now comes from mobile devices.&lt;/p&gt;

&lt;p&gt;Yet many local business websites still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;load slowly on phones&lt;/li&gt;
&lt;li&gt;have broken layouts&lt;/li&gt;
&lt;li&gt;use tiny text&lt;/li&gt;
&lt;li&gt;hide important contact buttons&lt;/li&gt;
&lt;li&gt;feel frustrating to navigate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Studies and SEO audits continue to show that mobile usability problems are one of the biggest conversion killers for local businesses. ()&lt;/p&gt;

&lt;p&gt;If users cannot quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understand what you do&lt;/li&gt;
&lt;li&gt;trust your business&lt;/li&gt;
&lt;li&gt;contact you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;they leave.&lt;/p&gt;

&lt;p&gt;Fast.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. There Is No Clear Conversion Flow
&lt;/h4&gt;

&lt;p&gt;A surprising number of websites never clearly guide the user toward action.&lt;/p&gt;

&lt;p&gt;You land on the homepage and ask:&lt;br&gt;
“What am I supposed to do next?”&lt;/p&gt;

&lt;p&gt;Good business websites guide users intentionally.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visible CTA buttons&lt;/li&gt;
&lt;li&gt;clear service structure&lt;/li&gt;
&lt;li&gt;trust-building sections&lt;/li&gt;
&lt;li&gt;strategic contact placement&lt;/li&gt;
&lt;li&gt;pricing clarity&lt;/li&gt;
&lt;li&gt;strong visual hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your website should function like a salesperson, not a digital brochure.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Website Is Slow
&lt;/h2&gt;

&lt;p&gt;This one quietly destroys both SEO and conversions.&lt;/p&gt;

&lt;p&gt;Slow websites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hurt rankings&lt;/li&gt;
&lt;li&gt;increase bounce rates&lt;/li&gt;
&lt;li&gt;reduce trust&lt;/li&gt;
&lt;li&gt;lower conversions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google increasingly prioritizes performance and user experience signals. Technical SEO experts continue to highlight slow loading speed, broken mobile experiences, and crawl issues as major ranking problems for local businesses. ()&lt;/p&gt;

&lt;p&gt;Most local business websites become slow because they rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bloated WordPress plugins&lt;/li&gt;
&lt;li&gt;outdated themes&lt;/li&gt;
&lt;li&gt;poor hosting&lt;/li&gt;
&lt;li&gt;unoptimized assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern frameworks and optimized architecture make a massive difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Website Has Weak SEO Foundations
&lt;/h2&gt;

&lt;p&gt;Many websites look decent visually but are almost invisible on Google.&lt;/p&gt;

&lt;p&gt;Common local SEO problems include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;poor page structure&lt;/li&gt;
&lt;li&gt;weak local targeting&lt;/li&gt;
&lt;li&gt;missing schema markup&lt;/li&gt;
&lt;li&gt;inconsistent business info&lt;/li&gt;
&lt;li&gt;duplicate location pages&lt;/li&gt;
&lt;li&gt;weak internal linking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recent local SEO research shows these mistakes are still extremely common in 2026. ()&lt;/p&gt;

&lt;p&gt;And now AI-powered search systems are making quality and structure even more important.&lt;/p&gt;

&lt;p&gt;Businesses that optimize properly for modern search experiences are seeing stronger traffic and conversion performance. ()&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Website Does Not Build Trust
&lt;/h2&gt;

&lt;p&gt;Trust is everything for local businesses.&lt;/p&gt;

&lt;p&gt;Before someone contacts you, they ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can I trust this company?&lt;/li&gt;
&lt;li&gt;Are they professional?&lt;/li&gt;
&lt;li&gt;Are they active?&lt;/li&gt;
&lt;li&gt;Are they legitimate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why modern business websites need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testimonials&lt;/li&gt;
&lt;li&gt;reviews&lt;/li&gt;
&lt;li&gt;case studies&lt;/li&gt;
&lt;li&gt;premium visuals&lt;/li&gt;
&lt;li&gt;clean branding&lt;/li&gt;
&lt;li&gt;strong About pages&lt;/li&gt;
&lt;li&gt;professional pricing presentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without trust signals, even good traffic struggles to convert.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Modern Local Business Websites Need in 2026
&lt;/h2&gt;

&lt;p&gt;Modern local business websites should focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;speed&lt;/li&gt;
&lt;li&gt;mobile-first UX&lt;/li&gt;
&lt;li&gt;conversion structure&lt;/li&gt;
&lt;li&gt;modern design&lt;/li&gt;
&lt;li&gt;SEO foundations&lt;/li&gt;
&lt;li&gt;trust-building&lt;/li&gt;
&lt;li&gt;clear messaging&lt;/li&gt;
&lt;li&gt;premium branding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The websites performing best today are no longer “simple business sites”.&lt;/p&gt;

&lt;p&gt;They feel closer to modern SaaS products and premium agency experiences.&lt;/p&gt;

&lt;p&gt;That shift is happening because users now compare every website to brands like Stripe, Linear, Apple, and Vercel.&lt;/p&gt;

&lt;p&gt;Expectations are higher than ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;That is exactly why I built VERTEX LOCAL.&lt;/p&gt;

&lt;p&gt;A premium Next.js website system designed for local businesses, freelancers, and agencies that want modern high-converting websites without starting from scratch.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Next.js 16&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS v4&lt;/li&gt;
&lt;li&gt;Framer Motion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Home page&lt;/li&gt;
&lt;li&gt;Services page&lt;/li&gt;
&lt;li&gt;About page&lt;/li&gt;
&lt;li&gt;Projects page&lt;/li&gt;
&lt;li&gt;Pricing page&lt;/li&gt;
&lt;li&gt;Blog system&lt;/li&gt;
&lt;li&gt;Contact &amp;amp; booking UI&lt;/li&gt;
&lt;li&gt;Premium dark-mode design system&lt;/li&gt;
&lt;li&gt;Conversion-focused layouts&lt;/li&gt;
&lt;li&gt;Reusable architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;p&gt;Build a local business website system that actually feels modern, premium, fast, and conversion-focused.&lt;/p&gt;

&lt;p&gt;You can check it out here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://yaman95.gumroad.com/l/vertex-local" rel="noopener noreferrer"&gt;VERTEX LOCAL&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Most local business websites are not losing because competition is impossible.&lt;/p&gt;

&lt;p&gt;They are losing because their websites were never designed for modern user expectations.&lt;/p&gt;

&lt;p&gt;The good news?&lt;/p&gt;

&lt;p&gt;Most of these problems are fixable.&lt;/p&gt;

&lt;p&gt;A faster, more modern, conversion-focused website can completely change how people perceive your business online.&lt;/p&gt;

&lt;p&gt;And in 2026, perception matters more than ever.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>local</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Why Most Small Business Websites Never Get Traffic (And How I Solved It With Next.js)</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Sat, 09 May 2026 18:35:55 +0000</pubDate>
      <link>https://dev.to/a95yman/why-most-small-business-websites-never-get-traffic-and-how-i-solved-it-with-nextjs-2bk5</link>
      <guid>https://dev.to/a95yman/why-most-small-business-websites-never-get-traffic-and-how-i-solved-it-with-nextjs-2bk5</guid>
      <description>&lt;p&gt;Every day, thousands of small businesses launch new websites.&lt;/p&gt;

&lt;p&gt;Most of them look decent.&lt;/p&gt;

&lt;p&gt;But almost none of them get visibility.&lt;/p&gt;

&lt;p&gt;No traffic.&lt;br&gt;
No leads.&lt;br&gt;
No Google rankings.&lt;br&gt;
No discoverability.&lt;/p&gt;

&lt;p&gt;And honestly, the problem usually is not the business itself.&lt;/p&gt;

&lt;p&gt;The problem is the website foundation.&lt;/p&gt;

&lt;p&gt;After spending months analyzing modern websites, I kept noticing the same issues everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poor SEO structure&lt;/li&gt;
&lt;li&gt;Slow performance&lt;/li&gt;
&lt;li&gt;Weak page hierarchy&lt;/li&gt;
&lt;li&gt;No sitemap setup&lt;/li&gt;
&lt;li&gt;Generic layouts&lt;/li&gt;
&lt;li&gt;Low conversion design&lt;/li&gt;
&lt;li&gt;Bad mobile experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many websites are built to “exist”.&lt;/p&gt;

&lt;p&gt;Very few are built to grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Problem Most Developers Ignore
&lt;/h2&gt;

&lt;p&gt;A lot of developers focus only on making the UI look good.&lt;/p&gt;

&lt;p&gt;But visibility starts much deeper than visuals.&lt;/p&gt;

&lt;p&gt;Search engines care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structure&lt;/li&gt;
&lt;li&gt;Speed&lt;/li&gt;
&lt;li&gt;Metadata&lt;/li&gt;
&lt;li&gt;Crawlability&lt;/li&gt;
&lt;li&gt;Semantic hierarchy&lt;/li&gt;
&lt;li&gt;User experience&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even AI-driven search systems are increasingly rewarding websites that are clean, structured, and easy to understand.&lt;/p&gt;

&lt;p&gt;That means your website architecture matters more than ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Started Using Next.js
&lt;/h2&gt;

&lt;p&gt;As someone coming from a backend development background, I always preferred clean architecture and maintainable systems.&lt;/p&gt;

&lt;p&gt;Frontend development often felt chaotic to me.&lt;/p&gt;

&lt;p&gt;Then I discovered Next.js.&lt;/p&gt;

&lt;p&gt;And surprisingly, it solved many of the problems I hated about frontend development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner structure&lt;/li&gt;
&lt;li&gt;Better organization&lt;/li&gt;
&lt;li&gt;Easier scalability&lt;/li&gt;
&lt;li&gt;Excellent performance&lt;/li&gt;
&lt;li&gt;SEO-friendly rendering&lt;/li&gt;
&lt;li&gt;Reusable architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of fighting the framework, I finally felt productive building frontend applications.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Realization&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
I realized I was rebuilding the same SEO and marketing foundation every single time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hero sections&lt;/li&gt;
&lt;li&gt;Landing pages&lt;/li&gt;
&lt;li&gt;Metadata setup&lt;/li&gt;
&lt;li&gt;Responsive sections&lt;/li&gt;
&lt;li&gt;SEO configuration&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Footers&lt;/li&gt;
&lt;li&gt;Conversion-focused layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repetitive setup phase was consuming more time than actually building products.&lt;/p&gt;

&lt;p&gt;So I decided to solve that problem once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building AquaFlow
&lt;/h2&gt;

&lt;p&gt;I built AquaFlow as a modern SEO-ready Next.js template focused on one goal:&lt;/p&gt;

&lt;p&gt;Helping developers and businesses launch websites that are already optimized for visibility, performance, and conversions.&lt;/p&gt;

&lt;p&gt;Instead of starting from scratch every time, the template already includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modern responsive sections&lt;/li&gt;
&lt;li&gt;SEO-ready structure&lt;/li&gt;
&lt;li&gt;Fast performance&lt;/li&gt;
&lt;li&gt;Clean reusable architecture&lt;/li&gt;
&lt;li&gt;Conversion-focused UI&lt;/li&gt;
&lt;li&gt;Production-ready organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea was simple:&lt;br&gt;
Stop rebuilding the plumbing. Start building the actual product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters More in 2026
&lt;/h2&gt;

&lt;p&gt;Search is changing fast.&lt;/p&gt;

&lt;p&gt;Websites are no longer competing only for Google rankings.&lt;/p&gt;

&lt;p&gt;They are competing for visibility across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;AI search systems&lt;/li&gt;
&lt;li&gt;ChatGPT recommendations&lt;/li&gt;
&lt;li&gt;Perplexity&lt;/li&gt;
&lt;li&gt;Search snippets&lt;/li&gt;
&lt;li&gt;Local discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Structured, fast, well-organized websites now have a huge advantage.&lt;/p&gt;

&lt;p&gt;Most businesses still underestimate this.&lt;/p&gt;

&lt;p&gt;That creates a massive opportunity for developers who understand both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean architecture&lt;/li&gt;
&lt;li&gt;modern SEO foundations&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A beautiful website without visibility is just an expensive placeholder.&lt;/p&gt;

&lt;p&gt;Modern websites need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;load fast&lt;/li&gt;
&lt;li&gt;rank properly&lt;/li&gt;
&lt;li&gt;scale cleanly&lt;/li&gt;
&lt;li&gt;convert visitors&lt;/li&gt;
&lt;li&gt;support growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly why I built AquaFlow.&lt;/p&gt;

&lt;p&gt;If you are interested in seeing the template:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://yaman95.gumroad.com/l/aquaflow" rel="noopener noreferrer"&gt;AquaFlow : SEO-Ready Next.js Template&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sass</category>
      <category>nextjs</category>
      <category>startup</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Built a Production-Ready ASP.NET Core + Next.js SaaS Boilerplate So You Don’t Have To</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Fri, 08 May 2026 22:31:56 +0000</pubDate>
      <link>https://dev.to/a95yman/i-built-a-production-ready-aspnet-core-nextjs-saas-boilerplate-so-you-dont-have-to-p05</link>
      <guid>https://dev.to/a95yman/i-built-a-production-ready-aspnet-core-nextjs-saas-boilerplate-so-you-dont-have-to-p05</guid>
      <description>&lt;p&gt;After building several SaaS products, I got tired of rewriting the same foundational code every single time: authentication, multi-tenancy, billing, tenant isolation, email templates, etc.&lt;/p&gt;

&lt;p&gt;So I decided to package everything into &lt;strong&gt;ShipReady&lt;/strong&gt; — a clean, modern full-stack SaaS boilerplate.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem Every Solo Developer or Small Team Faces
&lt;/h3&gt;

&lt;p&gt;You have a great idea.&lt;br&gt;&lt;br&gt;
You start building.&lt;br&gt;&lt;br&gt;
Two weeks later you’re still setting up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User authentication &amp;amp; authorization&lt;/li&gt;
&lt;li&gt;Multi-tenant database isolation&lt;/li&gt;
&lt;li&gt;Stripe subscription management + webhooks&lt;/li&gt;
&lt;li&gt;Tenant switching logic&lt;/li&gt;
&lt;li&gt;Proper project structure and Clean Architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;h3&gt;
  
  
  What is ShipReady?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ShipReady&lt;/strong&gt; is a full-stack SaaS starter that combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: ASP.NET Core (Clean Architecture + CQRS-ready)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 15 (App Router, Server Actions, TypeScript)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: Stripe integration (Subscriptions, Webhooks, Customer Portal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Feature&lt;/strong&gt;: Robust Multi-tenancy with proper data isolation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Auth&lt;/strong&gt;: Built with best practices (JWT + cookies or your preference)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Complete multi-tenant architecture (tenant resolution middleware, scoped services, etc.)&lt;/li&gt;
&lt;li&gt;Stripe billing fully integrated&lt;/li&gt;
&lt;li&gt;Tenant management dashboard + switching&lt;/li&gt;
&lt;li&gt;Clean, well-organized codebase with clear separation of concerns&lt;/li&gt;
&lt;li&gt;Ready for production deployment&lt;/li&gt;
&lt;li&gt;Live demo available&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: .NET 8/9 + EF Core + Clean Architecture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 15 + TypeScript + Tailwind&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: SQL Server / PostgreSQL ready&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments&lt;/strong&gt;: Stripe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: ASP.NET Core Identity + JWT&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  See It in Action
&lt;/h3&gt;

&lt;p&gt;I recorded a full walkthrough demo showing the project structure, how multi-tenancy works, and how fast you can get started.&lt;/p&gt;

&lt;p&gt;[Watch the Demo Here] ← (embed your YouTube video)&lt;/p&gt;

&lt;h3&gt;
  
  
  Who is This For?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;.NET developers who want a modern frontend without the headache&lt;/li&gt;
&lt;li&gt;Solo founders or small teams building B2B SaaS&lt;/li&gt;
&lt;li&gt;Anyone tired of starting every project from scratch&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EarlyBird Launch Offer (Limited)
&lt;/h3&gt;

&lt;p&gt;I’m running a &lt;strong&gt;30% LAUNCH30 discount&lt;/strong&gt; for the first 30 buyers.&lt;/p&gt;

&lt;p&gt;Original price: &lt;strong&gt;$129.99&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;→ Get ShipReady here: &lt;a href="https://yaman95.gumroad.com/l/shipready" rel="noopener noreferrer"&gt;https://yaman95.gumroad.com/l/shipready&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Use code: &lt;strong&gt;LAUNCH30&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if you don’t buy right now, I’d love your honest feedback. Drop a comment below — what’s the biggest pain point you face when starting a new SaaS project?&lt;/p&gt;

&lt;p&gt;Happy shipping! 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  dotnet #aspnetcore #NextJS #SaaS #boilerplate #buildinpublic #csharp #webdev
&lt;/h1&gt;

</description>
      <category>sass</category>
      <category>dotnet</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Stop Rewriting AI Code. Start Building Real Stuff.</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Thu, 07 May 2026 23:27:54 +0000</pubDate>
      <link>https://dev.to/a95yman/stop-rewriting-ai-code-start-building-real-stuff-a2h</link>
      <guid>https://dev.to/a95yman/stop-rewriting-ai-code-start-building-real-stuff-a2h</guid>
      <description>&lt;p&gt;Let’s be honest for a second.&lt;/p&gt;

&lt;p&gt;You sit down, open your editor, and ask your AI for some C# code. A few seconds later, it hands you a mess. Extra namespaces you didn’t ask for. Old patterns that don’t fit .NET 8. So much XML comment noise that you can barely find the actual logic.&lt;/p&gt;

&lt;p&gt;So you sigh, delete half of it, and rewrite the rest.&lt;/p&gt;

&lt;p&gt;That’s not saving time. That’s just a different kind of work.&lt;/p&gt;

&lt;p&gt;I ran into this same wall for months. Then I found a small playbook that changed how I prompt entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Usual AI Frustration
&lt;/h2&gt;

&lt;p&gt;C# and .NET developers have a unique problem. AI models are great at English, but they often learned from old Stack Overflow posts or outdated tutorials. They will happily write Entity Framework queries from 2017. They will add patterns you don't need. They will guess your .NET version wrong.&lt;/p&gt;

&lt;p&gt;And the worst part? Long, fluffy prompts just burn through tokens. You end up paying more for code you have to fix anyway.&lt;/p&gt;

&lt;p&gt;This is why the playbook &lt;em&gt;70+ Battle Tested AI Prompts for C# and ASP.NET Core&lt;/em&gt; caught my attention. It was clearly made by someone who actually builds production software.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Actually Get
&lt;/h2&gt;

&lt;p&gt;The pack includes over 70 prompts split into 12 practical chapters. Not random theory. Things you use every day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture patterns like Clean Architecture, Vertical Slices, and DDD&lt;/li&gt;
&lt;li&gt;EF Core 8 for queries, raw SQL, and compiled queries&lt;/li&gt;
&lt;li&gt;Security with JWT, refresh tokens, and rate limiting&lt;/li&gt;
&lt;li&gt;Modern APIs using Minimal APIs, gRPC, and versioning&lt;/li&gt;
&lt;li&gt;Frontend work with Blazor components and SignalR&lt;/li&gt;
&lt;li&gt;Testing with xUnit, integration tests, and snapshots&lt;/li&gt;
&lt;li&gt;Performance using Span, multi-level caching, and memory debugging&lt;/li&gt;
&lt;li&gt;DevOps covering Docker, GitHub Actions, and Azure Key Vault&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also four bonus system prompts. You can turn your AI into a Senior Architect, a Security Auditor, a Legacy Code Expert, or a Code Reviewer. That alone is worth a lot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Pack Is Different
&lt;/h2&gt;

&lt;p&gt;First, it saves you money. Each prompt includes a "Token Tip" that helps you strip out unnecessary words. The creator claims you can cut your token usage by 30 to 50 percent. Less noise means lower API bills.&lt;/p&gt;

&lt;p&gt;Second, this is production ready. These are not clean textbook examples. They include real constraints like SemaphoreSlim for cache protection and batch backfilling for heavy loads. This is code that won't crash when traffic hits.&lt;/p&gt;

&lt;p&gt;Third, every prompt was tested against GPT-4o, Claude 3.5, and GitHub Copilot. No guessing. No "it works in my head." Real verification.&lt;/p&gt;

&lt;p&gt;Fourth, you learn how to prompt better. Beyond the templates, you get the "6 Golden Rules of .NET Prompting." It is a simple framework that stops you from ever writing a vague, bloated prompt again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Is This For
&lt;/h2&gt;

&lt;p&gt;This is for .NET developers using Copilot, Cursor, or ChatGPT who are tired of fixing AI mistakes. It is for tech leads who want consistent AI output across a team. And it is for freelancers who need to ship quality features fast without endless debugging.&lt;/p&gt;

&lt;p&gt;You only need basic knowledge of .NET 8 and C#. In fact, working through these prompts will teach you proper patterns along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Honest Take
&lt;/h2&gt;

&lt;p&gt;I have used a lot of prompt collections. Most are just recycled tips. This one feels different because it focuses on C# first. The author clearly knows how modern .NET development works and what actually breaks in production.&lt;/p&gt;

&lt;p&gt;If you are spending too much time fighting your AI instead of shipping real code, this pack will pay for itself very quickly.&lt;/p&gt;

&lt;p&gt;You can find it over on Gumroad. The link is straightforward: &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__body flex items-center justify-between"&gt;
        &lt;a href="https://yaman95.gumroad.com/l/70-plus-tested-ai-prompts-for-csharp" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;yaman95.gumroad.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
Stop fixing broken AI output. Start building.

</description>
      <category>ai</category>
      <category>claude</category>
      <category>chatgpt</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>I used to fail .NET interviews for not giving the “expected answer”</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Wed, 06 May 2026 16:03:23 +0000</pubDate>
      <link>https://dev.to/a95yman/i-used-to-fail-net-interviews-for-not-giving-the-expected-answer-25co</link>
      <guid>https://dev.to/a95yman/i-used-to-fail-net-interviews-for-not-giving-the-expected-answer-25co</guid>
      <description>&lt;p&gt;I’m a .NET developer. I can build production-ready applications, APIs, and work with databases.&lt;/p&gt;

&lt;p&gt;In the past, I kept failing interviews and getting rejected or ignored, mostly because I wasn’t giving the “expected answer”.&lt;/p&gt;

&lt;p&gt;I could solve problems in real code, but I struggled to explain things in the structured way interviewers wanted. I thought performance should matter more than theory, but interviews don’t really work like that. You have to answer first, then prove yourself later.&lt;/p&gt;

&lt;p&gt;I even got hired once just because I memorized definitions and answered correctly, even though I wasn’t actually strong in what they asked. I had to learn everything on the job and eventually resigned after a short time.&lt;/p&gt;

&lt;p&gt;Now, after going through many interviews, I understand the process much better. I know what they are looking for, how questions are framed, and what kind of answers they expect.&lt;/p&gt;

&lt;p&gt;Still, it’s interesting how different real-world development is from interview performance.&lt;/p&gt;

&lt;p&gt;For anyone going through the same struggle, I also built something to help track and organize job applications and interview progress in a structured way:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://yaman95.gumroad.com/l/job-hunt-system" rel="noopener noreferrer"&gt;https://yaman95.gumroad.com/l/job-hunt-system&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>hiring</category>
      <category>dotnet</category>
      <category>development</category>
    </item>
    <item>
      <title>I Built a Job Hunt System for Developers. Here is Why You Need It.</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Tue, 05 May 2026 17:29:41 +0000</pubDate>
      <link>https://dev.to/a95yman/i-built-a-job-hunt-system-for-developers-here-is-why-you-need-it-283c</link>
      <guid>https://dev.to/a95yman/i-built-a-job-hunt-system-for-developers-here-is-why-you-need-it-283c</guid>
      <description>&lt;p&gt;Job hunting as a developer is broken.&lt;/p&gt;

&lt;p&gt;You send 50 applications. You hear back from 2. One is a rejection. The other is a ghost.&lt;/p&gt;

&lt;p&gt;This happened to me over and over. I knew I had the skills. But my applications were not getting through.&lt;/p&gt;

&lt;p&gt;So I built a system.&lt;/p&gt;

&lt;p&gt;Not a generic spreadsheet. Not a Notion template. A real desktop app with a complete job hunt methodology.&lt;/p&gt;

&lt;p&gt;Here is what I learned and what I built.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Most Job Applications
&lt;/h2&gt;

&lt;p&gt;Recruiters spend 6 to 10 seconds on a resume. If it does not signal relevance immediately, it gets skipped.&lt;/p&gt;

&lt;p&gt;Strong developers get rejected every day. Not because they lack skills. But because their materials do not communicate those skills in recruiter readable language.&lt;/p&gt;

&lt;p&gt;Most people think more applications equal more chances. That is wrong.&lt;/p&gt;

&lt;p&gt;What actually works is fewer, highly targeted applications with a resume tailored to each posting.&lt;/p&gt;




&lt;h2&gt;
  
  
  The System I Built
&lt;/h2&gt;

&lt;p&gt;I created a complete job hunt system for developers. It has three parts.&lt;/p&gt;

&lt;p&gt;First, a 12 page PDF playbook. It covers why developers get ignored, the four step loop of Find, Tailor, Reach Out, and Follow Up, resume tailoring with before and after examples, outreach message templates for LinkedIn and email, and a complete tracking system.&lt;/p&gt;

&lt;p&gt;Second, a Windows desktop app. It includes an application tracker with add, edit, delete, search, filter, and sort. A dashboard with response rates, source performance, and pipeline visualization. A resume tailoring worksheet with action verbs and metric examples. An outreach swipe file with copy ready templates. A weekly review with save and load past entries. An interview log to track questions and improve. Dark mode toggle. Column visibility toggles. Export JSON backup and import restore. Keyboard shortcuts like Ctrl+S to save and Esc to close dialogs.&lt;/p&gt;

&lt;p&gt;Third, the full C# source code. You get the complete WPF and WebView2 project. SQLite database layer. HTML, CSS, JavaScript frontend that you can modify. Build instructions included. You can compile for Mac or Linux yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Source Code Matters
&lt;/h2&gt;

&lt;p&gt;Audit the code. Modify the colors. Add your own columns. Compile for your own machine.&lt;/p&gt;

&lt;p&gt;Or just run the EXE in the Release folder and never look at the code. The choice is yours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Your Data Goes
&lt;/h2&gt;

&lt;p&gt;Nowhere.&lt;/p&gt;

&lt;p&gt;Desktop mode saves to SQLite at your local AppData folder. &lt;/p&gt;

&lt;p&gt;Browser fallback mode uses localStorage for testing.&lt;/p&gt;

&lt;p&gt;Your data never leaves your computer. No telemetry. No accounts.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  What You Will Download
&lt;/h2&gt;

&lt;p&gt;One ZIP file containing a Release folder with the EXE ready to run, a Source folder with the complete C# project, a PDF folder with the playbook, and a README.txt with simple instructions.&lt;br&gt;
No installation required. Just run the EXE.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Regular price is $29.&lt;/p&gt;

&lt;p&gt;For launch, use code YAMAN95. You get it for $14.&lt;/p&gt;

&lt;p&gt;That includes the PDF, the desktop app, and the full source code.&lt;/p&gt;

&lt;p&gt;One payment. Lifetime access.&lt;/p&gt;


&lt;h2&gt;
  
  
  Get It Here
&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://yaman95.gumroad.com/l/job-hunt-system" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;yaman95.gumroad.com&lt;/span&gt;
          

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





&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;You have the skills. You just need a system to show them.&lt;/p&gt;

&lt;p&gt;Stop applying blindly. Start hunting with purpose.&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>careerdevelopment</category>
      <category>career</category>
      <category>developer</category>
    </item>
    <item>
      <title>I Sent Out 30 Resumes As A Developer. I Heard Back From 2.</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Tue, 05 May 2026 00:35:44 +0000</pubDate>
      <link>https://dev.to/a95yman/i-sent-out-30-resumes-as-a-developer-i-heard-back-from-2-50cd</link>
      <guid>https://dev.to/a95yman/i-sent-out-30-resumes-as-a-developer-i-heard-back-from-2-50cd</guid>
      <description>&lt;p&gt;Here is what I learned after 50 interviews and fixing my resume after every rejection.&lt;/p&gt;

&lt;p&gt;The problem was never my skills. It was how I presented them.&lt;/p&gt;

&lt;p&gt;I wrote the same things most developers write. "Worked on the API." "Helped with database optimization." "Responsible for code reviews."&lt;/p&gt;

&lt;p&gt;Those sentences describe presence. They do not describe contribution.&lt;/p&gt;

&lt;p&gt;After months of getting ignored or rejected, I started tracking what actually moved the needle. I studied recruiter behavior. I ran A/B tests on my own resume. I went through 50 interviews and iterated after every single one.&lt;/p&gt;

&lt;p&gt;What I found changed how I write about my work completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10 Second Test That Changed Everything
&lt;/h2&gt;

&lt;p&gt;Print your resume. Set a timer for ten seconds. Look at it fresh.&lt;/p&gt;

&lt;p&gt;Can you immediately tell what kind of developer this person is?&lt;/p&gt;

&lt;p&gt;Is the most recent job visible without scrolling?&lt;/p&gt;

&lt;p&gt;Do the tech skills appear in the top third of the page?&lt;/p&gt;

&lt;p&gt;Most developers fail this test. Not because they lack experience. Because their layout buries the information recruiters actually scan for.&lt;/p&gt;

&lt;p&gt;A recruiter does not read your resume. They scan it. In about ten seconds, they decide if you are worth a closer look. They look for name, title, company names, job titles, years of experience, and tech stack. If any of those are missing or hard to find, your resume fails before it is read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The One Change That Got Me Callbacks
&lt;/h2&gt;

&lt;p&gt;I stopped writing what I was responsible for. I started writing what I built.&lt;/p&gt;

&lt;p&gt;Here is what I mean.&lt;/p&gt;

&lt;p&gt;Before: "Helped improve database performance."&lt;/p&gt;

&lt;p&gt;After: "Identified and resolved 12 slow queries using PostgreSQL EXPLAIN, cutting average response time from 2.1 seconds to 310 milliseconds."&lt;/p&gt;

&lt;p&gt;The first sentence tells someone you existed near a database. The second sentence tells them exactly what you did, how you did it, and what happened as a result.&lt;/p&gt;

&lt;p&gt;Every bullet on your resume needs an action and an outcome. Not every bullet needs a number. But every bullet needs to be specific. If you cannot say "reduced load time by 40 percent," you can say "reduced page load time noticeably by eliminating N plus 1 queries in the product listing endpoint."&lt;/p&gt;

&lt;p&gt;Specific is always better than vague. With or without a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned After 50 Interviews
&lt;/h2&gt;

&lt;p&gt;I compiled everything into a 30 page playbook. No fluff. No generic advice. Just what actually works.&lt;/p&gt;

&lt;p&gt;The playbook includes two complete resume examples you can study and adapt. A bullet point library with over 50 proven phrases for backend, frontend, and full stack roles. The real ten second scan path recruiters use. Weak versus strong transformations for every section. ATS myths explained. And a final checklist to run before every submission.&lt;/p&gt;

&lt;p&gt;You can get it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://yaman95.gumroad.com/l/developer-resume-playbook" rel="noopener noreferrer"&gt;https://yaman95.gumroad.com/l/developer-resume-playbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It costs $9. That is less than a coffee and a sandwich in most cities. If it helps you land one interview, it has paid for itself a hundred times over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Your Resume Without Fighting Your Word Processor
&lt;/h2&gt;

&lt;p&gt;Writing a great resume is one thing. Getting it into a clean, ATS friendly PDF without smashing your keyboard is another.&lt;/p&gt;

&lt;p&gt;I built a tool called ResumeOS that solves this. You drag and drop sections. Click any text to edit it. Switch between one column and two column layouts. Pick a visual style. Your text stays the same, just the spacing changes.&lt;/p&gt;

&lt;p&gt;Then the useful stuff:&lt;/p&gt;

&lt;p&gt;An ATS score that shows you a number from 0 to 100 percent based on keywords, bullet quality, section completeness, and length. A job matcher that lets you paste a job description and tells you exactly which keywords you are missing. A bullet library with over 300 real achievement bullets sorted by role. A feature that highlights weak bullets starting with "responsible for" or "helped with" and gives you stronger alternatives. Spell check that underlines misspelled words. Export to PDF with A4 or Letter size. Save named templates. Auto save every 30 seconds. Restore any previous version from the history panel.&lt;/p&gt;

&lt;p&gt;No account. No monthly fee. One purchase, use it forever.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://yaman95.gumroad.com/l/resumeos-ats-resume-optimizer" rel="noopener noreferrer"&gt;https://yaman95.gumroad.com/l/resumeos-ats-resume-optimizer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you apply to more than one job a month, it pays for itself in time saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Last Thing
&lt;/h2&gt;

&lt;p&gt;Done is better than perfect.&lt;/p&gt;

&lt;p&gt;A complete, specific, slightly imperfect resume submitted today beats a polished resume submitted after three more weeks of revision. Apply, collect feedback from rejections, iterate. That is the real process.&lt;/p&gt;

&lt;p&gt;You are not trying to impress anyone with your resume. You are trying to earn 30 minutes of someone's time. Write it with that goal in mind.&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>leadership</category>
      <category>hiring</category>
    </item>
    <item>
      <title>I Was Getting Zero Job Replies Until I Fixed My Resume Formatting</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Sun, 03 May 2026 23:47:36 +0000</pubDate>
      <link>https://dev.to/a95yman/i-was-getting-zero-job-replies-until-i-fixed-my-resume-formatting-5a71</link>
      <guid>https://dev.to/a95yman/i-was-getting-zero-job-replies-until-i-fixed-my-resume-formatting-5a71</guid>
      <description>&lt;p&gt;I used to send out application after application and hear nothing back. Not a single reply.&lt;/p&gt;

&lt;p&gt;At first, I thought my resume wasn't impressive enough. So I made it fancier. Added columns. Played with layouts. Tossed in some icons.&lt;/p&gt;

&lt;p&gt;Still nothing.&lt;/p&gt;

&lt;p&gt;Then I learned about Applicant Tracking Systems. Companies use software like Lever, Greenhouse, and Workday to scan resumes before a human ever sees them. If the system can't parse your formatting correctly, you're out. No second chance. No recruiter laying eyes on your experience.&lt;/p&gt;

&lt;p&gt;That was my problem. My "nice looking" resume was actually unreadable to the machines doing the first round of filtering.&lt;/p&gt;

&lt;p&gt;So I stopped guessing and built something that actually works.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The free live tool&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I made a simple ATS-friendly resume builder. Clean structure. No fancy columns or broken layouts. Just your information in a format that parsing software can actually read.&lt;/p&gt;

&lt;p&gt;You don't need to sign up for anything. No email. No account. Just open it and use it.&lt;/p&gt;

&lt;p&gt;Try it here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://ats-friendly-resume-builder-sable.vercel.app/" rel="noopener noreferrer"&gt;https://ats-friendly-resume-builder-sable.vercel.app/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The downloadable version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you prefer working offline or want a version you can fully customize and keep on your own computer, I also created a downloadable HTML file. Same clean structure, but you own it. Tweak it however you like. Save multiple versions for different job roles. Everything stays in your browser.&lt;/p&gt;

&lt;p&gt;Grab it here (pay what you want, including free):&lt;br&gt;&lt;br&gt;
&lt;a href="https://yaman95.gumroad.com/l/ats-friendly-resume-builder" rel="noopener noreferrer"&gt;https://yaman95.gumroad.com/l/ats-friendly-resume-builder&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What I'm building next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Right now I'm working on a bigger version with smarter features. Keyword suggestions based on actual job descriptions. Role-specific optimization for frontend, backend, data, and DevOps roles. Better export options.&lt;/p&gt;

&lt;p&gt;If you have ideas or run into problems with the current tool, leave a response. I'm building this because I needed it myself, and I want to make it genuinely helpful for other people.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it out&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're job hunting, give the live builder a shot. It's free and takes a few minutes. And if it helps you land an interview, pass it along to another developer still waiting on that first reply.&lt;/p&gt;

&lt;p&gt;Sometimes the only thing standing between you and an interview is a resume an ATS can actually read.&lt;/p&gt;

</description>
      <category>career</category>
      <category>resume</category>
      <category>cv</category>
      <category>startup</category>
    </item>
    <item>
      <title>How I Structure Authentication in .NET (JWT + Refresh Tokens)</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Thu, 30 Apr 2026 18:52:36 +0000</pubDate>
      <link>https://dev.to/a95yman/how-i-structure-authentication-in-net-jwt-refresh-tokens-161a</link>
      <guid>https://dev.to/a95yman/how-i-structure-authentication-in-net-jwt-refresh-tokens-161a</guid>
      <description>&lt;p&gt;If you’ve built a few .NET APIs, you’ve probably done authentication more than once.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT setup&lt;/li&gt;
&lt;li&gt;login and register endpoints&lt;/li&gt;
&lt;li&gt;protecting routes&lt;/li&gt;
&lt;li&gt;maybe adding roles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works, but every time I started a new project, I found myself repeating the same setup again.&lt;/p&gt;

&lt;p&gt;After doing this a few times, I decided to settle on a structure that I can reuse and understand without digging through tutorials.&lt;/p&gt;

&lt;p&gt;This is the approach I use now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;I’m not trying to build a full identity system.&lt;/p&gt;

&lt;p&gt;I just want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a clean login and register flow&lt;/li&gt;
&lt;li&gt;JWT authentication that works&lt;/li&gt;
&lt;li&gt;refresh tokens so users don’t get logged out constantly&lt;/li&gt;
&lt;li&gt;a structure that doesn’t turn into a mess later The structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I keep things split into simple layers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Api&lt;/li&gt;
&lt;li&gt;Application&lt;/li&gt;
&lt;li&gt;Domain&lt;/li&gt;
&lt;li&gt;Infrastructure&lt;/li&gt;
&lt;li&gt;Shared&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing fancy. Just enough separation so things don’t get mixed together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API handles HTTP and controllers.&lt;/li&gt;
&lt;li&gt;The Application layer contains the logic like login and register.&lt;/li&gt;
&lt;li&gt;The Domain has the core models like User and Role.&lt;/li&gt;
&lt;li&gt;Infrastructure deals with the database and token generation.&lt;/li&gt;
&lt;li&gt;Shared contains helpers like password hashing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it easy to change one part without breaking everything.&lt;/p&gt;

&lt;p&gt;Authentication flow&lt;/p&gt;

&lt;p&gt;Here’s how the flow works.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Register or login
&lt;/h2&gt;

&lt;p&gt;User sends email and password.&lt;/p&gt;

&lt;p&gt;Password is hashed before storing it.&lt;/p&gt;

&lt;p&gt;If login is successful, the API returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a JWT access token&lt;/li&gt;
&lt;li&gt;a refresh token&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Access protected endpoints
&lt;/h2&gt;

&lt;p&gt;The client sends:&lt;/p&gt;

&lt;p&gt;Authorization: Bearer &lt;/p&gt;

&lt;p&gt;The API validates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;signature&lt;/li&gt;
&lt;li&gt;issuer&lt;/li&gt;
&lt;li&gt;audience&lt;/li&gt;
&lt;li&gt;expiration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If everything checks out, the request goes through.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Refresh token
&lt;/h2&gt;

&lt;p&gt;When the access token expires, the client sends the refresh token.&lt;/p&gt;

&lt;p&gt;If it is valid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a new access token is generated&lt;/li&gt;
&lt;li&gt;a new refresh token replaces the old one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This avoids forcing users to log in again.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Roles
&lt;/h2&gt;

&lt;p&gt;Each user has a role like User or Admin.&lt;/p&gt;

&lt;p&gt;Then I can protect routes like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"protected"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Protected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Roles&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Admin"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"admin-only"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;AdminOnly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Simple and clear.&lt;/p&gt;

&lt;p&gt;Why I use refresh tokens&lt;/p&gt;

&lt;p&gt;JWT alone is not enough for real apps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the token expires quickly, users get logged out often.&lt;/li&gt;
&lt;li&gt;If it lasts too long, it becomes a security risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refresh tokens solve that.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short lived access token&lt;/li&gt;
&lt;li&gt;longer lived refresh token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You keep security and still have a smooth experience.&lt;/p&gt;
&lt;h2&gt;
  
  
  Database choice
&lt;/h2&gt;

&lt;p&gt;For this kind of starter, I use SQLite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No setup needed&lt;/li&gt;
&lt;li&gt;works out of the box&lt;/li&gt;
&lt;li&gt;easy to switch later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database file is created on first run, which makes testing simple.&lt;/p&gt;

&lt;p&gt;What I keep simple on purpose&lt;/p&gt;

&lt;p&gt;I don’t try to solve everything here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No email verification&lt;/li&gt;
&lt;li&gt;No password reset&lt;/li&gt;
&lt;li&gt;No advanced permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those can be added later depending on the project.&lt;/p&gt;

&lt;p&gt;This is just a clean starting point.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;I put a free demo here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/i95compile/.Net-Auth-System-Core-Demo.git" rel="noopener noreferrer"&gt;https://github.com/i95compile/.Net-Auth-System-Core-Demo.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can run it, test the endpoints, and see how everything is structured.&lt;/p&gt;
&lt;h2&gt;
  
  
  If you want the full version
&lt;/h2&gt;

&lt;p&gt;I also packaged a version you can reuse directly in your projects.&lt;/p&gt;

&lt;p&gt;Same structure, ready to plug in and extend.&lt;/p&gt;

&lt;p&gt;If you’re tired of rebuilding auth every time, this can save you a bit of time.&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://yaman95.gumroad.com/l/dotnet-auth-system-core-lit" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;yaman95.gumroad.com&lt;/span&gt;
          

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



&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Authentication is one of those things that is not hard, but it’s easy to waste time on.&lt;/p&gt;

&lt;p&gt;Having a clean base you understand makes a big difference when starting new projects.&lt;/p&gt;

&lt;p&gt;That’s what I aimed for here.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>aspdotnet</category>
      <category>vscode</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why You Are Not Getting Better as a Developer (It Is Not More Courses)</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Wed, 29 Apr 2026 15:37:03 +0000</pubDate>
      <link>https://dev.to/a95yman/why-you-are-not-getting-better-as-a-developer-it-is-not-more-courses-4h48</link>
      <guid>https://dev.to/a95yman/why-you-are-not-getting-better-as-a-developer-it-is-not-more-courses-4h48</guid>
      <description>&lt;h2&gt;
  
  
  The uncomfortable truth about consistency and the simple 20 minute system that actually works
&lt;/h2&gt;

&lt;p&gt;You have the courses. The bookmarks. The "must watch" videos saved to watch later.&lt;/p&gt;

&lt;p&gt;And still. You are not improving.&lt;/p&gt;

&lt;p&gt;Not in any way that actually shows up in your work, your confidence, or your code reviews.&lt;/p&gt;

&lt;p&gt;Here is the hard truth no YouTube tutorial will tell you.&lt;/p&gt;

&lt;p&gt;It was never a knowledge problem.&lt;/p&gt;

&lt;p&gt;The Cycle That Keeps Most Developers Stuck&lt;br&gt;
It starts the same way every time.&lt;/p&gt;

&lt;p&gt;New course. New energy. New plan.&lt;/p&gt;

&lt;p&gt;You tell yourself, "This time I am doing it properly."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Day 1: focused&lt;/li&gt;
&lt;li&gt;Day 2: still good&lt;/li&gt;
&lt;li&gt;Day 3: life gets busy&lt;/li&gt;
&lt;li&gt;Day 4: you skip&lt;/li&gt;
&lt;li&gt;Day 5: you tell yourself you will restart next week&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And just like that, you are back to scrolling and watching. You are "learning" but not really building.&lt;/p&gt;

&lt;p&gt;Weeks pass. Sometimes months.&lt;/p&gt;

&lt;p&gt;The worst part is that you already know what to do. That is what makes it so frustrating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Another Course Will Not Save You&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most developers think they need a better course. Or a different tech stack. Or more prerequisites.&lt;/p&gt;

&lt;p&gt;But deep down, you already know the truth.&lt;/p&gt;

&lt;p&gt;Every time you actually sat down and wrote code, even for 30 minutes, you made progress. Small progress. But real progress.&lt;/p&gt;

&lt;p&gt;The problem is not learning. The problem is showing up consistently enough for that learning to compound.&lt;/p&gt;

&lt;p&gt;You do not get better with six hour binge sessions once a month. You get better with 20 minutes every day, even when it feels boring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Uncomfortable Realization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what no one really emphasizes.&lt;/p&gt;

&lt;p&gt;Consistency is not exciting.&lt;/p&gt;

&lt;p&gt;It is repetitive. Quiet. Sometimes boring.&lt;/p&gt;

&lt;p&gt;But it is the only thing that works.&lt;/p&gt;

&lt;p&gt;Intense sprints feel productive, but they do not build real skill. Small daily actions do, because they force your brain to rewire instead of just cramming information.&lt;/p&gt;

&lt;p&gt;Why Consistency Feels So Hard&lt;br&gt;
The advice sounds simple. Just code every day.&lt;/p&gt;

&lt;p&gt;But in reality, you run into specific problems.&lt;/p&gt;

&lt;p&gt;You do not know what to work on each day&lt;/p&gt;

&lt;p&gt;You overthink which topic to learn next&lt;/p&gt;

&lt;p&gt;You set goals that are too big&lt;/p&gt;

&lt;p&gt;You lose all momentum after missing just one day&lt;/p&gt;

&lt;p&gt;So you end up trapped in the same loop.&lt;/p&gt;

&lt;p&gt;Start. Stop. Restart. Repeat.&lt;/p&gt;

&lt;p&gt;And every restart feels heavier than the last.&lt;/p&gt;

&lt;p&gt;This is where most developers quit for good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Actually Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stop thinking "I need to improve."&lt;/p&gt;

&lt;p&gt;Start thinking "I need a system that makes showing up easy."&lt;/p&gt;

&lt;p&gt;Not perfect. Just easy.&lt;/p&gt;

&lt;p&gt;A system that removes decision fatigue, overthinking, and randomness. Because willpower alone does not last. Structure does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Small Shift That Changes Everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stop telling yourself, "I will study when I have time."&lt;/p&gt;

&lt;p&gt;Start telling yourself, "This is something I do daily, even if it is just 20 minutes."&lt;/p&gt;

&lt;p&gt;That shift sounds small, but it changes your identity.&lt;/p&gt;

&lt;p&gt;You are no longer someone who tries to learn coding. You are someone who shows up consistently.&lt;/p&gt;

&lt;p&gt;That is the difference between stuck developers and developers who actually grow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Part Most Developers Skip&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everyone wants results. Better skills. A better job. More confidence.&lt;/p&gt;

&lt;p&gt;But very few people build the one thing that actually leads there.&lt;/p&gt;

&lt;p&gt;A simple, repeatable system they can stick to. Not for three days. Not for two weeks. But long enough to see real change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Free Tool That Fixes This&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I got tired of the start stop cycle. So I built something simple.&lt;/p&gt;

&lt;p&gt;The 30 Day Coding Consistency Tracker&lt;/p&gt;

&lt;p&gt;This is not a course. Not a tutorial. Not another video to save for later.&lt;/p&gt;

&lt;p&gt;It is a simple system that tells you exactly what to work on for 20 minutes each day. No decision fatigue. No overthinking. Just show up and code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is what you get.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30 daily prompts designed for real progress&lt;/li&gt;
&lt;li&gt;A printable tracker to mark each day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decision free. Just open and start.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://yaman95.gumroad.com/l/30-day-junior-developer-reset-system" rel="noopener noreferrer"&gt;Download the free tracker here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No email required. Just the system you have been missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If You Feel Stuck Right Now, Read This&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You are not stuck because you are not smart enough.&lt;/p&gt;

&lt;p&gt;You are not stuck because you chose the wrong path.&lt;/p&gt;

&lt;p&gt;You are not stuck because you need another course.&lt;/p&gt;

&lt;p&gt;You are stuck because your effort is inconsistent.&lt;/p&gt;

&lt;p&gt;And inconsistent effort does not compound. It just burns you out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What To Focus On Instead&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not aim for perfect days.&lt;/p&gt;

&lt;p&gt;Aim for showing up. Aim for doing something small. Aim for not breaking the chain.&lt;/p&gt;

&lt;p&gt;That is it.&lt;/p&gt;

&lt;p&gt;It will not feel impressive at first. But give it a few weeks, and you will notice something.&lt;/p&gt;

&lt;p&gt;You are not restarting anymore. You are progressing.&lt;/p&gt;

&lt;p&gt;That is when things finally start to change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Next Step&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You already know what to learn. You do not need another course.&lt;/p&gt;

&lt;p&gt;You need a system.&lt;/p&gt;

&lt;p&gt;Here is what to do right now.&lt;/p&gt;

&lt;p&gt;Step 1: Click the link below&lt;br&gt;
Step 2: Download the 30 Day Consistency Tracker&lt;br&gt;
Step 3: Commit to 20 minutes today. Not tomorrow. Today.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://yaman95.gumroad.com/l/30-day-junior-developer-reset-system" rel="noopener noreferrer"&gt;Get your free consistency tracker here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bestofdev</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Async/Await in Production: The Bug That Only Appeared Under Load</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Tue, 28 Apr 2026 14:21:41 +0000</pubDate>
      <link>https://dev.to/a95yman/asyncawait-in-production-the-bug-that-only-appeared-under-load-5458</link>
      <guid>https://dev.to/a95yman/asyncawait-in-production-the-bug-that-only-appeared-under-load-5458</guid>
      <description>&lt;p&gt;Most people learn async/await in a clean little test project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;GetDataAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks simple. Feels safe.&lt;/p&gt;

&lt;p&gt;Then you push to production, traffic hits, and suddenly async/await is quietly wrecking your backend. This isn't theoretical. It's a real failure pattern: thread starvation mixed with blocking async calls causing cascading latency spikes.&lt;/p&gt;




&lt;h2&gt;
  
  
  It Worked Fine Locally
&lt;/h2&gt;

&lt;p&gt;We had a typical .NET backend API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ASP.NET Core Web API&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;External HTTP calls&lt;/li&gt;
&lt;li&gt;Async/await everywhere (or so we thought)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simplified version of the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&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;If you come from a synchronous background, nothing looks obviously wrong here.&lt;/p&gt;

&lt;p&gt;Locally? Fast. Stable. No issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  First Sign: Random Slow Requests
&lt;/h2&gt;

&lt;p&gt;In production, under moderate traffic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some requests take 200ms&lt;/li&gt;
&lt;li&gt;Others randomly spike to 5 to 10 seconds&lt;/li&gt;
&lt;li&gt;CPU is fine&lt;/li&gt;
&lt;li&gt;Database is fine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So what's blocking?&lt;/p&gt;

&lt;p&gt;Nothing obvious. That's exactly the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem: Blocking Async Code
&lt;/h2&gt;

&lt;p&gt;This line is the silent killer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or the same thing with &lt;code&gt;.GetAwaiter().GetResult()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's what actually happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The async method starts.&lt;/li&gt;
&lt;li&gt;It hits an &lt;code&gt;await&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The thread gets freed up... but then&lt;/li&gt;
&lt;li&gt;You immediately block, waiting for the result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now layer on top of that how the ASP.NET thread pool behaves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thread Pool Starvation in Action
&lt;/h2&gt;

&lt;p&gt;Under load:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The thread pool has a limited number of threads.&lt;/li&gt;
&lt;li&gt;Each request blocks a thread while waiting on async work.&lt;/li&gt;
&lt;li&gt;But that async work needs threads to resume.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: threads waiting for threads that are already blocked.&lt;/p&gt;

&lt;p&gt;It's not a classic deadlock, but the system acts like one. Requests pile up. Latency explodes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Didn't Fail Locally
&lt;/h2&gt;

&lt;p&gt;Locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low concurrency&lt;/li&gt;
&lt;li&gt;Plenty of free threads&lt;/li&gt;
&lt;li&gt;No pressure on the thread pool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many concurrent requests&lt;/li&gt;
&lt;li&gt;Real external API latency&lt;/li&gt;
&lt;li&gt;Real database latency spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything makes the problem worse.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix: Async All the Way Down
&lt;/h2&gt;

&lt;p&gt;Correct version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And inside your services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUserAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule is simple: if you use async, everything above it must also be async.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Hidden Trap: Sync over Async in Libraries
&lt;/h2&gt;

&lt;p&gt;Even worse is this pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CallAsync&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or legacy code inside libraries that forces sync wrappers around async calls. That spreads the problem silently across multiple layers of your app.&lt;/p&gt;




&lt;h2&gt;
  
  
  Another Silent Killer: Context Capture
&lt;/h2&gt;

&lt;p&gt;In UI apps or older ASP.NET:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;SomethingAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// captures context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;SomethingAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ConfigureAwait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&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;In backend services, this avoids unnecessary context switching overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  How We Actually Diagnosed It
&lt;/h2&gt;

&lt;p&gt;We eventually spotted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spikes in thread pool queue length&lt;/li&gt;
&lt;li&gt;High number of blocked threads&lt;/li&gt;
&lt;li&gt;Requests stuck in "waiting" state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once we removed all the &lt;code&gt;.Result&lt;/code&gt; usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latency dropped&lt;/li&gt;
&lt;li&gt;Throughput roughly doubled&lt;/li&gt;
&lt;li&gt;CPU usage normalized&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Never mix &lt;code&gt;.Result&lt;/code&gt; or &lt;code&gt;.Wait()&lt;/code&gt; with async code.&lt;/li&gt;
&lt;li&gt;Async has to be end to end. Partial doesn't work.&lt;/li&gt;
&lt;li&gt;Thread pool starvation is silent but deadly.&lt;/li&gt;
&lt;li&gt;Production behavior is not local behavior.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;That's it. No magic. Just don't break the async chain, or the system breaks with it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>coding</category>
      <category>csharp</category>
      <category>programming</category>
    </item>
    <item>
      <title>3 LINQ Mistakes That Hurt Backend API Performance in .NET</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Mon, 27 Apr 2026 17:24:31 +0000</pubDate>
      <link>https://dev.to/a95yman/3-linq-mistakes-that-hurt-backend-api-performance-in-net-415k</link>
      <guid>https://dev.to/a95yman/3-linq-mistakes-that-hurt-backend-api-performance-in-net-415k</guid>
      <description>&lt;p&gt;LINQ looks clean and harmless in C#.&lt;/p&gt;

&lt;p&gt;But in real backend APIs, small mistakes can quietly turn into serious performance issues.&lt;/p&gt;

&lt;p&gt;Here are 3 I’ve seen (and made) while working with .NET and Entity Framework:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Loading entire tables into memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A common mistake is doing this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var orders = dbContext.Orders.ToList();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var recent = orders.Where(o =&amp;gt; o.CreatedAt &amp;gt; DateTime.UtcNow.AddDays(-7));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This pulls everything into memory first, then filters in C#.&lt;/p&gt;

&lt;p&gt;The problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unnecessary memory usage&lt;/li&gt;
&lt;li&gt;slow processing on large datasets&lt;/li&gt;
&lt;li&gt;wasted database optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Let the database do the work:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var recent = dbContext.Orders&lt;br&gt;
    .Where(o =&amp;gt; o.CreatedAt &amp;gt; DateTime.UtcNow.AddDays(-7))&lt;br&gt;
    .ToList();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Hidden multiple database calls&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LINQ queries can be deceptively reused:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var query = dbContext.Orders.Where(o =&amp;gt; o.Total &amp;gt; 100);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var count = query.Count();&lt;/code&gt;&lt;br&gt;
&lt;code&gt;var list = query.ToList();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This can result in multiple database executions depending on how it's used.&lt;/p&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Materialize once:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var list = dbContext.Orders&lt;br&gt;
    .Where(o =&amp;gt; o.Total &amp;gt; 100)&lt;br&gt;
    .ToList();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var count = list.Count;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Fetching more data than needed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another common issue:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var orders = dbContext.Orders.ToList();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var result = orders.Select(o =&amp;gt; new&lt;br&gt;
{&lt;br&gt;
    o.Id,&lt;br&gt;
    o.CustomerName&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You are still loading full rows from the database even though you only need 2 fields.&lt;/p&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Project early:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var result = dbContext.Orders&lt;br&gt;
    .Select(o =&amp;gt; new&lt;br&gt;
    {&lt;br&gt;
        o.Id,&lt;br&gt;
        o.CustomerName&lt;br&gt;
    })&lt;br&gt;
    .ToList();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Key idea&lt;/p&gt;

&lt;p&gt;LINQ itself is not the problem.&lt;/p&gt;

&lt;p&gt;The real issue is where the execution happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in memory&lt;/li&gt;
&lt;li&gt;or in the database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In backend systems, that difference matters a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing thought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most performance issues in APIs are not “big architecture problems”.&lt;/p&gt;

&lt;p&gt;They start with small LINQ decisions like these.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/9Vm5R6pPMqE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>database</category>
      <category>performance</category>
      <category>api</category>
    </item>
  </channel>
</rss>
