<?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: Syed Mujtaba</title>
    <description>The latest articles on DEV Community by Syed Mujtaba (@mujtbabbas).</description>
    <link>https://dev.to/mujtbabbas</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%2F4200596%2F4fece129-0279-491d-a39f-64c682b29f47.jpg</url>
      <title>DEV Community: Syed Mujtaba</title>
      <link>https://dev.to/mujtbabbas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mujtbabbas"/>
    <language>en</language>
    <item>
      <title>Your CI is red because of code you didn't write</title>
      <dc:creator>Syed Mujtaba</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:53:10 +0000</pubDate>
      <link>https://dev.to/mujtbabbas/your-ci-is-red-because-of-code-you-didnt-write-4pfn</link>
      <guid>https://dev.to/mujtbabbas/your-ci-is-red-because-of-code-you-didnt-write-4pfn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Added a markdownlint check to &lt;strong&gt;33 repos&lt;/strong&gt; at once — and woke up to &lt;strong&gt;~100 CI failure emails&lt;/strong&gt; about code I didn't write. The fix: lint only the files changed in the PR, never the whole backlog. Grandfather existing violations; enforce the standard on new changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I maintain a GitHub org with &lt;strong&gt;33 open-source repos&lt;/strong&gt;. Last month I decided to do the responsible thing: add a default &lt;strong&gt;markdownlint&lt;/strong&gt; check to every repo so our docs stay consistent.&lt;/p&gt;

&lt;p&gt;By the next morning I had &lt;strong&gt;~100 failure emails&lt;/strong&gt; in my inbox. Here's what went wrong — and the rollout playbook I'd use instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened
&lt;/h2&gt;

&lt;p&gt;The lint workflow ran against &lt;em&gt;every&lt;/em&gt; markdown file in each repo — READMEs, changelogs, and contributor guides written years ago by people who had never heard of markdownlint. Upstream markdown, as it turns out, has never passed a linter in its life. Trailing spaces, inconsistent heading levels, bare URLs — the works.&lt;/p&gt;

&lt;p&gt;My inbox became a firehose of red X's on code I didn't write, in files I'd never touched, for rules nobody on those projects had agreed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The noise-vs-signal problem
&lt;/h2&gt;

&lt;p&gt;This is the classic failure mode of adopting tooling across many repos at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal:&lt;/strong&gt; "the file you just edited violates the style guide"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise:&lt;/strong&gt; "a README from 2021 has trailing whitespace"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When 95% of failures are noise, people stop reading CI results entirely — and then the 5% that matter get ignored too. A check everyone ignores is worse than no check at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: scope linting to the files you own
&lt;/h2&gt;

&lt;p&gt;Instead of linting the whole repo, I changed the workflow to lint &lt;strong&gt;only files changed in the PR&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get changed files&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;changed&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tj-actions/changed-files@v44&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;**/*.md&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lint changed markdown&lt;/span&gt;
  &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;steps.changed.outputs.any_changed == 'true'&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx markdownlint-cli ${{ steps.changed.outputs.all_changed_files }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Overnight the emails stopped. CI went green on every repo, and the check still catches every &lt;em&gt;new&lt;/em&gt; violation — which is the only thing it was ever supposed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader lesson: a playbook for rolling out tooling across many repos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never lint the backlog on day one.&lt;/strong&gt; Grandfather existing violations; enforce the standard on new changes only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope every check to what the PR touches.&lt;/strong&gt; Changed-files linting, diff-aware tests, incremental type checks — same principle everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable noisy upstream workflows&lt;/strong&gt; you don't own rather than letting them train everyone to ignore red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the checks you own green.&lt;/strong&gt; A green build people trust beats a "thorough" build nobody reads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roll out repo by repo&lt;/strong&gt; if you can — 33 repos at once multiplies every mistake by 33.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your CI should tell you about &lt;em&gt;your&lt;/em&gt; code. The moment it starts yelling about code you didn't write, scope it down until the signal comes back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you ever been buried by a noisy CI rollout? What did you do about it — scope it down, fix the backlog, or turn the check off? Tell me in the comments.&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>github</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Migrating 330 digital products between platforms: what broke and what I'd do differently</title>
      <dc:creator>Syed Mujtaba</dc:creator>
      <pubDate>Wed, 28 Oct 2026 13:18:13 +0000</pubDate>
      <link>https://dev.to/mujtbabbas/migrating-330-digital-products-between-platforms-what-broke-and-what-id-do-differently-dd6</link>
      <guid>https://dev.to/mujtbabbas/migrating-330-digital-products-between-platforms-what-broke-and-what-id-do-differently-dd6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Migrated &lt;strong&gt;330 records (305+ products, 39 bundles)&lt;/strong&gt; from a legacy platform (Entrepedia) to a &lt;strong&gt;Next.js + Prisma + MySQL&lt;/strong&gt; stack. The code was fine — the &lt;em&gt;data&lt;/em&gt; was the problem: slug collisions, duplicate titles, cover/deliverable mismatches, and a tangled taxonomy. Scroll to "The checklist I'd use next time" for the actionable part.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Earlier this year I migrated &lt;strong&gt;305+ digital products and 39 bundles&lt;/strong&gt; from Entrepedia to a new &lt;strong&gt;Next.js + Prisma + MySQL&lt;/strong&gt; platform — idesire.io. Catalog migrations look boring until 330 records disagree with each other. Here's an honest breakdown of what broke, how we fixed it, and the checklist I'd run next time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Slug collisions
&lt;/h3&gt;

&lt;p&gt;Two products, one slug. The legacy platform allowed duplicate slugs across categories, so &lt;code&gt;/products/planner&lt;/code&gt; existed twice. On the new platform the slug is the primary lookup, so imports silently overwrote each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; namespaced slugs per category during import, then ran a uniqueness pass and 301-redirected the losers.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Broken legacy records
&lt;/h3&gt;

&lt;p&gt;Years of manual edits left products with missing descriptions, null prices, and orphaned category IDs pointing at categories that no longer existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; a validation report before import — every record got a health check, and anything failing went into a quarantine list for manual review instead of failing the whole batch.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cover / deliverable mismatches
&lt;/h3&gt;

&lt;p&gt;The cover image said "2024 Ultimate Bundle" while the attached deliverable was the 2022 version. Nobody noticed because nobody re-downloaded after uploading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; spot-checked a sample of high-traffic products and re-exported covers from the actual deliverables.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Taxonomy cleanup
&lt;/h3&gt;

&lt;p&gt;Seven overlapping category trees ("Marketing", "marketing", "Digital Marketing", "MKTG"…) had grown over the years. Search and filtering were useless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; collapsed everything into one canonical taxonomy and mapped legacy categories with a lookup table — kept the old names as redirects so bookmarks didn't die.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Duplicates with exact titles
&lt;/h3&gt;

&lt;p&gt;The same product imported twice under slightly different SKUs, with byte-identical titles. Customers saw the same item twice in search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; dedupe pass on normalized title + file hash before import.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Free pricing enforcement
&lt;/h3&gt;

&lt;p&gt;"Free" products carried stale prices — $0.00 in one field and $19 in another. Checkout logic picked whichever it read first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; single source of truth — an &lt;code&gt;is_free&lt;/code&gt; flag drives the price, and the import rejected any record where the two disagreed.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Thumbnail issues
&lt;/h3&gt;

&lt;p&gt;Mixed aspect ratios, oversized images on listing cards, and a handful of hotlinked images that died when the old CDN was shut off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; regenerated thumbnails at fixed sizes during import and replaced hotlinks with locally hosted copies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root causes
&lt;/h2&gt;

&lt;p&gt;Every item above traces back to one of three root causes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;We trusted the legacy data.&lt;/strong&gt; Years of manual edits had made the old database the least reliable source of truth — and we treated it as gospel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implicit rules became import logic.&lt;/strong&gt; The old platform tolerated duplicate slugs, dual price fields, and loose taxonomy. The new one couldn't. Nobody had written those rules down until they bit us.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We validated after the import, not before.&lt;/strong&gt; We found problems by reading broken pages instead of by reading a validation report.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The checklist I'd use next time
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Audit the legacy data &lt;em&gt;before&lt;/em&gt; writing a line of migration code — export everything to a spreadsheet first&lt;/li&gt;
&lt;li&gt;[ ] Write a validation report: every record passes or goes to quarantine; nothing silently drops&lt;/li&gt;
&lt;li&gt;[ ] Normalize and dedupe on (title, file hash), not on IDs you don't trust&lt;/li&gt;
&lt;li&gt;[ ] Plan the slug strategy up front: uniqueness rules + 301 redirects for collisions&lt;/li&gt;
&lt;li&gt;[ ] Freeze the taxonomy first — one canonical tree, legacy names mapped, not merged&lt;/li&gt;
&lt;li&gt;[ ] Verify deliverables match their covers on a sample of top-selling products&lt;/li&gt;
&lt;li&gt;[ ] Make pricing a single source of truth (&lt;code&gt;is_free&lt;/code&gt; flag, not two price fields)&lt;/li&gt;
&lt;li&gt;[ ] Regenerate all media at import time — fixed sizes, local hosting, no hotlinks&lt;/li&gt;
&lt;li&gt;[ ] Dry-run the full import on staging, then diff staging vs. legacy record by record&lt;/li&gt;
&lt;li&gt;[ ] Keep the old platform read-only (not deleted) for 90 days as a reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Migrations are 20% code and 80% data archaeology. The checklist is the part I'd never skip again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What broke in &lt;em&gt;your&lt;/em&gt; last migration? Share your war stories in the comments — the messier, the better.&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>nextjs</category>
      <category>laravel</category>
    </item>
    <item>
      <title>The open source references I keep in my own account (standalone editions, honestly labelled)</title>
      <dc:creator>Syed Mujtaba</dc:creator>
      <pubDate>Fri, 23 Oct 2026 23:52:04 +0000</pubDate>
      <link>https://dev.to/mujtbabbas/the-open-source-references-i-keep-in-my-own-account-standalone-editions-honestly-labelled-3mgc</link>
      <guid>https://dev.to/mujtbabbas/the-open-source-references-i-keep-in-my-own-account-standalone-editions-honestly-labelled-3mgc</guid>
      <description>&lt;p&gt;Quick honesty note before anything else: none of the projects below are mine. They are well known open source references that I keep as standalone editions in my GitHub account, each one credited to its upstream project in the repo description and README, because I actually use them in my daily work as a full-stack developer.&lt;/p&gt;

&lt;p&gt;Why keep your own editions at all? Three reasons. My tooling keeps working even if an upstream repo moves. I can pin the exact version my workflow depends on. And I add a small enhancement layer on top: standardised docs, dependabot, CI and lint, so every edition behaves the same way in my setup.&lt;/p&gt;

&lt;p&gt;The ones that earn their keep:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;public-apis, standalone edition&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/public-apis" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/public-apis&lt;/a&gt;)&lt;br&gt;
The collective list of free APIs. Original: public-apis/public-apis. I reach for it at the start of almost every integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;free-for-dev, standalone edition&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/free-for-dev" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/free-for-dev&lt;/a&gt;)&lt;br&gt;
Free tiers of SaaS, PaaS and IaaS offerings. Original: ripienaar/free-for-dev. It pairs well with my own FreeDomain list if you are bootstrapping a side project at zero cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;markitdown, standalone edition&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/markitdown" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/markitdown&lt;/a&gt;)&lt;br&gt;
Microsoft's tool for converting files and office documents to Markdown. Original: microsoft/markitdown. It sits in the middle of my document pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ui-ux-pro-max-skill, standalone edition&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/ui-ux-pro-max-skill" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/ui-ux-pro-max-skill&lt;/a&gt;)&lt;br&gt;
A design intelligence skill for AI assisted UI work. It shapes how I brief design tasks before writing code.&lt;/p&gt;

&lt;p&gt;If you use these tools too, star the ORIGINALS first, they earned it. If my editions are useful to you, a star there helps me justify the maintenance time. And if you maintain similar reference editions, I would like to hear how you handle upstream updates in the comments.&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>tools</category>
    </item>
    <item>
      <title>Building in public from Skardu: the production systems behind my GitHub</title>
      <dc:creator>Syed Mujtaba</dc:creator>
      <pubDate>Fri, 23 Oct 2026 19:34:36 +0000</pubDate>
      <link>https://dev.to/mujtbabbas/building-in-public-from-skardu-the-production-systems-behind-my-github-29jk</link>
      <guid>https://dev.to/mujtbabbas/building-in-public-from-skardu-the-production-systems-behind-my-github-29jk</guid>
      <description>&lt;p&gt;I am a senior full-stack developer in Skardu, Pakistan. A lot of my client and product code lives in private repos, but the public side of my GitHub is bigger than I realised, and until this week almost none of it had been shown to anyone. Here is what is actually public and worth a look.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FreeDomain&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/FreeDomain" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/FreeDomain&lt;/a&gt;)&lt;br&gt;
A curated list of free domains, DNS, hosting and developer resources for side projects. It is the repo I maintain for the community, and this week it went from 1 star to 14 because people finally saw it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POS System&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/pos-system" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/pos-system&lt;/a&gt;)&lt;br&gt;
A complete point of sale system for retail: sales, inventory and daily closing. Boring on paper, used every single day, which is the highest compliment business software can get.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hostel Management System&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/Hostel-Management-System-Laravel" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/Hostel-Management-System-Laravel&lt;/a&gt;)&lt;br&gt;
An end to end Laravel system for hostels: tenants, rooms, billing and the daily admin that eats hours when it lives in spreadsheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CreativeAI&lt;/strong&gt; (&lt;a href="https://github.com/mujtbabbas/CreativeAI" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/CreativeAI&lt;/a&gt;)&lt;br&gt;
An experimental AI driven creative platform, my sandbox for testing modern AI tooling in a real product shape instead of demo notebooks.&lt;/p&gt;

&lt;p&gt;Alongside these I also keep standalone editions of well known open source references (public-apis, free-for-dev, markitdown and others) in my account, each credited to its upstream project, because I use them daily in my own work.&lt;/p&gt;

&lt;p&gt;If any of the public projects look useful, a star genuinely helps other people find them. Questions and feedback are welcome in the comments.&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Free domains for side projects: what actually works in 2026 (from maintaining a curated list)</title>
      <dc:creator>Syed Mujtaba</dc:creator>
      <pubDate>Thu, 22 Oct 2026 19:31:58 +0000</pubDate>
      <link>https://dev.to/mujtbabbas/free-domains-for-side-projects-what-actually-works-in-2026-from-maintaining-a-curated-list-2n1p</link>
      <guid>https://dev.to/mujtbabbas/free-domains-for-side-projects-what-actually-works-in-2026-from-maintaining-a-curated-list-2n1p</guid>
      <description>&lt;p&gt;Every side project hits the same wall: you need a domain and a few basic services before you have even validated the idea, and the "free" options are scattered across dozens of sites, half of them outdated.&lt;/p&gt;

&lt;p&gt;I maintain FreeDomain, an open-source curated list of free domain options and free developer resources — free subdomains, DNS, hosting and the small services you need to get a project live at zero cost. I keep it updated because I build a lot of small products myself (a flight-booking platform, a learning-products platform, a few SaaS tools) and I kept re-researching the same free tiers.&lt;/p&gt;

&lt;p&gt;What I have learned maintaining it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free subdomains are fine for validation; move to a paid domain the day real users arrive.&lt;/li&gt;
&lt;li&gt;Always read the renewal terms — "free for year 1" and "free forever" are very different things.&lt;/li&gt;
&lt;li&gt;Keep a note of where each project's DNS lives. Future-you will not remember.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The list is here: &lt;a href="https://github.com/mujtbabbas/FreeDomain" rel="noopener noreferrer"&gt;https://github.com/mujtbabbas/FreeDomain&lt;/a&gt;&lt;br&gt;
If it saves you time, a ⭐ on the repo helps other developers find it — and I am working towards a small GitHub milestone with it. Additions and corrections via PR are welcome.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Hello DEV, I'm Mujtaba — full-stack dev building travel &amp; learning platforms from Pakistan</title>
      <dc:creator>Syed Mujtaba</dc:creator>
      <pubDate>Thu, 22 Oct 2026 13:56:52 +0000</pubDate>
      <link>https://dev.to/mujtbabbas/hello-dev-im-mujtaba-full-stack-dev-building-travel-learning-platforms-from-pakistan-2pc1</link>
      <guid>https://dev.to/mujtbabbas/hello-dev-im-mujtaba-full-stack-dev-building-travel-learning-platforms-from-pakistan-2pc1</guid>
      <description>&lt;p&gt;For years I've been building booking platforms and e-learning marketplaces from Pakistan — quietly shipping, rarely writing. Today that changes: hello, DEV! I'm Mujtaba. 👋&lt;/p&gt;

&lt;p&gt;I'm a full-stack developer, and I figured the best introduction is to show you what I spend my days on.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Senior Full-Stack Developer at Gravité&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Founder of Divine Fly&lt;/strong&gt;, a travel tech company&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My stack
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Next.js&lt;/code&gt; · &lt;code&gt;Laravel&lt;/code&gt; · &lt;code&gt;Node&lt;/code&gt; · &lt;code&gt;PHP&lt;/code&gt; · &lt;code&gt;MySQL&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm building
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://divinefly.pk" rel="noopener noreferrer"&gt;divinefly.pk&lt;/a&gt;&lt;/strong&gt; — a full booking platform for travel: flights, hotels, and holiday packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DivineFly Desk&lt;/strong&gt; — an internal Laravel app that powers our operations behind the scenes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;idesire.io&lt;/strong&gt; — an e-learning platform with 330+ digital products, recently migrated to a Next.js + Prisma + MySQL stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'll be writing about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform migrations&lt;/strong&gt; — I just moved 305+ products and 39 bundles between platforms. War stories incoming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web security&lt;/strong&gt; — I do security audits, so expect practical hardening guides, not just theory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform engineering&lt;/strong&gt; — lessons from building booking and learning products that have to work at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm here to share what I learn in the trenches and to learn from this community. If that sounds like your kind of thing, hit follow — I'd love to have you along for the ride.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are you building right now? Say hi in the comments — let's connect.&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>laravel</category>
      <category>node</category>
    </item>
  </channel>
</rss>
