<?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: Mohammad Haroon </title>
    <description>The latest articles on DEV Community by Mohammad Haroon  (@mohammad_haroon).</description>
    <link>https://dev.to/mohammad_haroon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4013702%2Fa2bf4c47-8448-4a84-a67f-ca19d3c206d7.png</url>
      <title>DEV Community: Mohammad Haroon </title>
      <link>https://dev.to/mohammad_haroon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohammad_haroon"/>
    <language>en</language>
    <item>
      <title>What I Learned Shipping 3 Full-Stack MERN Projects as a Solo Developer</title>
      <dc:creator>Mohammad Haroon </dc:creator>
      <pubDate>Fri, 03 Jul 2026 16:14:59 +0000</pubDate>
      <link>https://dev.to/mohammad_haroon/what-i-learned-shipping-3-full-stack-mern-projects-as-a-solo-developer-1o1l</link>
      <guid>https://dev.to/mohammad_haroon/what-i-learned-shipping-3-full-stack-mern-projects-as-a-solo-developer-1o1l</guid>
      <description>&lt;p&gt;A while back I sat down and counted how many full projects I'd actually shipped, start to finish, on my own. Not tutorials. Not clones. Real products with real users testing them. The number was three, and each one taught me something the last one didn't.&lt;/p&gt;

&lt;p&gt;I'm Muhammad Haroon, a full-stack developer working mostly in the MERN stack out of Bahawalpur, Pakistan. This isn't a "10 tips for React" listicle. It's what actually happened while building a SaaS tool, an AI meeting app, and a maritime job platform, including the parts that broke and the decisions I'd make differently now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 1: A multi-tenant SaaS taught me that architecture decisions compound
&lt;/h2&gt;

&lt;p&gt;The first big one was &lt;strong&gt;ProjectSphere&lt;/strong&gt;, a project management tool built to support multiple organizations on a single codebase. Simple idea. Deceptively hard execution.&lt;/p&gt;

&lt;p&gt;The mistake I made early was treating "multi-tenant" as a database problem only. I figured if I scoped every query by &lt;code&gt;organizationId&lt;/code&gt;, I was done. I was not done.&lt;/p&gt;

&lt;p&gt;What I actually needed to think through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data isolation&lt;/strong&gt;: one bad query without a tenant filter and you've leaked another company's data. I ended up writing a Mongoose middleware layer that injected the tenant scope automatically instead of trusting every controller to remember it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role-based access inside each tenant&lt;/strong&gt;: an admin in Org A shouldn't accidentally get admin rights in Org B just because the JWT payload wasn't checked properly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding flow&lt;/strong&gt;: every new org needs default roles, default project templates, and a clean first-run experience, or your product feels half-built even when the core features work fine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson that stuck with me: in multi-tenant systems, the boring stuff (data scoping, permission checks, seed data for new tenants) is the actual product. The flashy features are what people see in the demo. The boring stuff is what keeps you out of a very bad support ticket six months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 2: Real-time audio taught me to respect the network
&lt;/h2&gt;

&lt;p&gt;Next was &lt;strong&gt;Meeting AI&lt;/strong&gt;, a meeting platform with live transcription and AI-generated notes. React 19 on the frontend, Express 5 on the backend, Supabase for storage and auth, Agora RTC for the real-time audio layer, and Groq's Whisper implementation for transcription.&lt;/p&gt;

&lt;p&gt;This project humbled me. WebRTC and real-time audio are not "just another API integration." The moment you introduce live audio streams, you're dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network jitter and packet loss that behaves completely differently on a stable office wifi versus someone's mobile data on a bus&lt;/li&gt;
&lt;li&gt;Reconnection logic, because a dropped connection mid-meeting is a support nightmare if you haven't planned for it&lt;/li&gt;
&lt;li&gt;Latency between when someone speaks and when the transcription shows up, which affects how "live" the product actually feels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I originally tried handling reconnection with a naive retry loop. It worked in testing on my own laptop and fell apart the first time a real user tested it on a spotty connection. I had to rebuild that layer with proper state management for connection status, so the UI could tell the user "reconnecting" instead of just silently failing.&lt;/p&gt;

&lt;p&gt;The other piece worth mentioning is multi-organization workspace support with role-based access control, which I built into this project too. If you're adding RBAC to a real-time product, test your permission checks against live sessions, not just static API calls. Permissions that work fine on a REST endpoint can behave unexpectedly once a session is already active and a user's role changes mid-call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 3: A maritime job platform taught me that "modules" beat "monoliths" for client work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MaritimeLink&lt;/strong&gt; was a job platform for the maritime industry, built with React, Tailwind, and REST APIs, with modules for KYC verification, job applications, training courses, and an admin panel.&lt;/p&gt;

&lt;p&gt;This one was closer to freelance client work than a personal project, and it changed how I structure things now. Instead of building one large application, I broke it into modules that could be developed, tested, and even disabled independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/modules
  /kyc
  /job-applications
  /courses
  /admin-panel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each module had its own routes, its own state slice, and its own API layer. When the client wanted to change how KYC verification worked, I didn't have to touch the job application logic at all. When they asked for a new admin feature, it slotted into the admin module without a ripple effect through the rest of the app.&lt;/p&gt;

&lt;p&gt;For anyone doing freelance or client-based development, this is probably the single most useful pattern I've adopted. Clients change their minds. Scope shifts. A modular structure means those changes cost you hours instead of days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern across all three
&lt;/h2&gt;

&lt;p&gt;Looking back at these projects together, a few things kept repeating regardless of what the app actually did:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The unglamorous 20% (auth, permissions, error states, reconnection logic) takes 80% of the real engineering effort.&lt;/strong&gt; Budget your time accordingly, especially if you're quoting freelance work by the hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on bad conditions, not good ones.&lt;/strong&gt; Slow networks, wrong permissions, empty states. Your happy path will always work. Your app is judged on what happens when things aren't happy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular beats monolithic once a second developer, a second client, or a second organization enters the picture.&lt;/strong&gt; You don't need to over-engineer a personal project, but the moment real users or real clients show up, structure pays for itself fast.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I'm currently doing full-stack work with the MERN stack as part of an internship, alongside freelance projects on the side, mostly React, Node, and WordPress builds for small businesses. If you're working on something similar or you've hit these same walls with real-time apps or multi-tenant systems, I'd genuinely like to hear how you solved it. That's usually how I learn the most, from someone else's war story about the bug that took them three days to find.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About the author&lt;/strong&gt;: Muhammad Haroon is a full-stack web developer specializing in React.js, Node.js, MongoDB, and WordPress. You can see more of his work, including ProjectSphere, Meeting AI, and MaritimeLink, at &lt;a href="https://devowl.me" rel="noopener noreferrer"&gt;devowl.me&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>node</category>
      <category>mern</category>
    </item>
  </channel>
</rss>
