<?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>Forem: Md Mohosin Ali Shah</title>
    <description>The latest articles on Forem by Md Mohosin Ali Shah (@mohosin2126).</description>
    <link>https://forem.com/mohosin2126</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%2F2584956%2Fdbfb4a7d-f905-4202-ba9d-a0a270632737.jpg</url>
      <title>Forem: Md Mohosin Ali Shah</title>
      <link>https://forem.com/mohosin2126</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mohosin2126"/>
    <language>en</language>
    <item>
      <title>RepoLens Version 2 Ranked #7 on Product Hunt — Building AI for Code Change Intelligence</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Sun, 29 Mar 2026 08:54:57 +0000</pubDate>
      <link>https://forem.com/mohosin2126/repolens-version-2-ranked-7-on-product-hunt-building-ai-for-code-change-intelligence-5ggj</link>
      <guid>https://forem.com/mohosin2126/repolens-version-2-ranked-7-on-product-hunt-building-ai-for-code-change-intelligence-5ggj</guid>
      <description>&lt;p&gt;RepoLens Version 2 ranked &lt;strong&gt;#7 on Product Hunt&lt;/strong&gt; this week.&lt;/p&gt;

&lt;p&gt;That number was exciting, but what mattered more to me was what it represented.&lt;/p&gt;

&lt;p&gt;It felt like a signal that this problem resonates with more people than just me.&lt;/p&gt;

&lt;p&gt;Because RepoLens started from a frustration I kept running into again and again:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;understanding a codebase takes too long.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I opened a new repository, I would usually go through the same cycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open random folders&lt;/li&gt;
&lt;li&gt;search for routes&lt;/li&gt;
&lt;li&gt;trace imports manually&lt;/li&gt;
&lt;li&gt;guess how modules fit together&lt;/li&gt;
&lt;li&gt;try to understand the architecture from scattered files and tribal knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That process was slow, repetitive, and mentally expensive.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;RepoLens Version 1&lt;/strong&gt; to solve that.&lt;/p&gt;

&lt;p&gt;Version 1 was about helping developers understand a repository faster.&lt;/p&gt;

&lt;p&gt;It could analyze repositories, detect stack and structure, map modules and dependencies, extract API endpoints, generate docs, support grounded repository chat, compare branches, and turn a codebase into something much more explorable.&lt;/p&gt;

&lt;p&gt;That solved an important problem.&lt;/p&gt;

&lt;p&gt;But while building it, I realized I had only solved the first half of the real pain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding a Repository Once Is Not Enough
&lt;/h2&gt;

&lt;p&gt;A repository is not static.&lt;/p&gt;

&lt;p&gt;It keeps moving.&lt;/p&gt;

&lt;p&gt;Pull requests change behavior.&lt;br&gt;&lt;br&gt;
Endpoints shift.&lt;br&gt;&lt;br&gt;
Dependencies evolve.&lt;br&gt;&lt;br&gt;
Architecture drifts.&lt;br&gt;&lt;br&gt;
And teams are constantly trying to answer a harder question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;what changed, what was affected, and what actually matters?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is where RepoLens Version 2 came from.&lt;/p&gt;

&lt;p&gt;Version 2 is not just about repository understanding.&lt;/p&gt;

&lt;p&gt;It is about &lt;strong&gt;change intelligence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That shift changed how I thought about the product.&lt;/p&gt;

&lt;p&gt;Instead of only helping someone understand a repository once, I wanted RepoLens to become useful inside the real engineering loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when a pull request opens&lt;/li&gt;
&lt;li&gt;when a branch changes&lt;/li&gt;
&lt;li&gt;when APIs move&lt;/li&gt;
&lt;li&gt;when architecture starts drifting&lt;/li&gt;
&lt;li&gt;when a team needs clarity before review or release&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Changed in Version 2
&lt;/h2&gt;

&lt;p&gt;RepoLens Version 2 now focuses on helping teams understand change with more structure and more trust.&lt;/p&gt;

&lt;p&gt;It can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyze pull requests and generate engineering summaries&lt;/li&gt;
&lt;li&gt;detect affected modules&lt;/li&gt;
&lt;li&gt;detect changed endpoints&lt;/li&gt;
&lt;li&gt;highlight likely review hotspots&lt;/li&gt;
&lt;li&gt;support branch-aware and PR-aware repository chat&lt;/li&gt;
&lt;li&gt;show exact code snippet references and confidence signals&lt;/li&gt;
&lt;li&gt;run incremental analysis instead of full rebuilds every time&lt;/li&gt;
&lt;li&gt;sync automatically from GitHub events&lt;/li&gt;
&lt;li&gt;detect architecture drift&lt;/li&gt;
&lt;li&gt;send alerts for important changes and failed analysis runs&lt;/li&gt;
&lt;li&gt;track workspace usage and operational health&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product story became much clearer through this work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version 1:&lt;/strong&gt; Know any repo fast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version 2:&lt;/strong&gt; Know what changed and what matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That clarity was one of the biggest wins for me as a builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned Building It
&lt;/h2&gt;

&lt;p&gt;One of the biggest lessons from building RepoLens is that &lt;strong&gt;generic AI output is not enough for engineering workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is easy to generate a summary.&lt;/p&gt;

&lt;p&gt;It is much harder to generate something that engineers can actually trust.&lt;/p&gt;

&lt;p&gt;That means the system has to do more than just “talk about code.”&lt;/p&gt;

&lt;p&gt;It has to first build a structured understanding of the repository and its changes, then use AI on top of that structure to make the output more useful, grounded, and verifiable.&lt;/p&gt;

&lt;p&gt;That has shaped almost every product decision in RepoLens so far.&lt;/p&gt;

&lt;p&gt;I do not want RepoLens to be another tool that gives impressive-sounding answers without enough proof behind them.&lt;/p&gt;

&lt;p&gt;I want it to help teams see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;where an answer came from&lt;/li&gt;
&lt;li&gt;what changed&lt;/li&gt;
&lt;li&gt;what was affected&lt;/li&gt;
&lt;li&gt;what deserves attention&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Product Hunt Launch
&lt;/h2&gt;

&lt;p&gt;Launching RepoLens Version 2 on Product Hunt and seeing it reach &lt;strong&gt;#7&lt;/strong&gt; was encouraging not just because of visibility, but because of the kinds of conversations it created.&lt;/p&gt;

&lt;p&gt;The most interesting feedback was not about “AI” in the abstract.&lt;/p&gt;

&lt;p&gt;It was about very practical engineering questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do you handle overlapping PRs?&lt;/li&gt;
&lt;li&gt;How reliable is changed endpoint detection?&lt;/li&gt;
&lt;li&gt;Can this work beyond a single framework?&lt;/li&gt;
&lt;li&gt;Which signals are actually useful in day-to-day development?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly the kind of feedback I hoped for.&lt;/p&gt;

&lt;p&gt;It means the product is starting to move from “interesting demo” territory into “could this fit real engineering workflows?” territory.&lt;/p&gt;

&lt;p&gt;That is the transition I care about most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where RepoLens Is Going
&lt;/h2&gt;

&lt;p&gt;RepoLens started as a way to understand repositories faster.&lt;/p&gt;

&lt;p&gt;Now it is becoming a way to understand &lt;strong&gt;change&lt;/strong&gt; faster.&lt;/p&gt;

&lt;p&gt;That feels like the more important problem.&lt;/p&gt;

&lt;p&gt;Because teams do not just need help reading code.&lt;/p&gt;

&lt;p&gt;They need help reasoning about evolving systems.&lt;/p&gt;

&lt;p&gt;That is what I want RepoLens to keep getting better at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live platform&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://repolensai.com" rel="noopener noreferrer"&gt;https://repolensai.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source analysis engine&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/mohosin2126/repolens-community" rel="noopener noreferrer"&gt;https://github.com/mohosin2126/repolens-community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Hunt launch&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.producthunt.com/products/repolens" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/repolens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work in fast-moving repositories, I would love to know:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which signal would save your team the most time?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR summaries&lt;/li&gt;
&lt;li&gt;affected modules&lt;/li&gt;
&lt;li&gt;changed endpoints&lt;/li&gt;
&lt;li&gt;review hotspots&lt;/li&gt;
&lt;li&gt;branch-aware chat&lt;/li&gt;
&lt;li&gt;architecture drift alerts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>RepoLens Version 2 - Know what changed and what matters</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Wed, 25 Mar 2026 17:30:00 +0000</pubDate>
      <link>https://forem.com/mohosin2126/repolens-version-2-know-what-changed-and-what-matters-1adi</link>
      <guid>https://forem.com/mohosin2126/repolens-version-2-know-what-changed-and-what-matters-1adi</guid>
      <description>&lt;p&gt;RepoLens Version 1 was about understanding a repository quickly.&lt;/p&gt;

&lt;p&gt;It helped answer:&lt;br&gt;
What is in this repository?&lt;br&gt;
How is the codebase structured?&lt;br&gt;
Where do I start?&lt;/p&gt;

&lt;p&gt;But after building and using it more, I realized something important:&lt;/p&gt;

&lt;p&gt;understanding a codebase once is not enough.&lt;/p&gt;

&lt;p&gt;Repositories keep changing.&lt;br&gt;
Pull requests introduce risk.&lt;br&gt;
APIs evolve.&lt;br&gt;
Architecture drifts.&lt;br&gt;
And teams need better visibility into what changed, what was affected, and what actually matters.&lt;/p&gt;

&lt;p&gt;So I built RepoLens Version 2.&lt;/p&gt;

&lt;p&gt;RepoLens is no longer just a repository analysis dashboard.&lt;br&gt;
It is becoming a change intelligence platform for engineering teams.&lt;/p&gt;

&lt;p&gt;What RepoLens V2 Adds&lt;/p&gt;

&lt;p&gt;RepoLens can now:&lt;/p&gt;

&lt;p&gt;analyze pull requests and generate engineering summaries&lt;/p&gt;

&lt;p&gt;show affected modules, changed endpoints, and likely review hotspots&lt;/p&gt;

&lt;p&gt;run incremental analysis instead of reprocessing the whole repository every time&lt;/p&gt;

&lt;p&gt;sync automatically from GitHub push, PR, and merge events&lt;/p&gt;

&lt;p&gt;answer chat questions in repository, branch, PR, and branch-compare context&lt;/p&gt;

&lt;p&gt;show exact code snippets, references, and confidence signals in chat answers&lt;/p&gt;

&lt;p&gt;detect architecture drift and endpoint changes over time&lt;/p&gt;

&lt;p&gt;send alerts for meaningful changes and failed analysis runs&lt;/p&gt;

&lt;p&gt;track workspace usage, plan limits, and operational health&lt;/p&gt;

&lt;p&gt;What This Changes&lt;/p&gt;

&lt;p&gt;Version 1 helped understand a repository.&lt;/p&gt;

&lt;p&gt;Version 2 helps understand change.&lt;/p&gt;

&lt;p&gt;That means RepoLens starts becoming useful in everyday engineering workflows, not just onboarding.&lt;/p&gt;

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

&lt;p&gt;reviewing pull requests&lt;/p&gt;

&lt;p&gt;tracking architecture changes across runs&lt;/p&gt;

&lt;p&gt;seeing what modules and endpoints were affected&lt;/p&gt;

&lt;p&gt;understanding branch differences faster&lt;/p&gt;

&lt;p&gt;getting grounded answers in the exact context you care about&lt;/p&gt;

&lt;p&gt;receiving alerts instead of checking manually&lt;/p&gt;

&lt;p&gt;Product Direction&lt;/p&gt;

&lt;p&gt;The RepoLens product story is becoming clearer:&lt;/p&gt;

&lt;p&gt;Version 1: Know any repo fast.&lt;br&gt;
Version 2: Know what changed and what matters.&lt;/p&gt;

&lt;p&gt;That shift is the part I’m most excited about.&lt;/p&gt;

&lt;p&gt;RepoLens is moving from static repository understanding&lt;br&gt;
to ongoing engineering intelligence.&lt;/p&gt;

&lt;p&gt;Live Platform&lt;br&gt;
&lt;a href="https://repolensai.com" rel="noopener noreferrer"&gt;https://repolensai.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open Source Repository&lt;/p&gt;

&lt;p&gt;The open-source analysis engine is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mohosin2126/repolens-community" rel="noopener noreferrer"&gt;https://github.com/mohosin2126/repolens-community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Version 2 LinkedIn Post&lt;br&gt;
&lt;a href="https://www.linkedin.com/posts/mohosin2126_opensource-ai-github-activity-7442612868300234752-HWkc?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAADpg8RMBJaipaeKrpBc7xSoC8S90bR4HWpk" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/mohosin2126_opensource-ai-github-activity-7442612868300234752-HWkc?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAADpg8RMBJaipaeKrpBc7xSoC8S90bR4HWpk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why I Built Version 2&lt;/p&gt;

&lt;p&gt;I wanted RepoLens to be useful not only when someone first opens a repository,&lt;br&gt;
but also when a team is actively changing it.&lt;/p&gt;

&lt;p&gt;Especially when:&lt;/p&gt;

&lt;p&gt;reviewing pull requests&lt;/p&gt;

&lt;p&gt;tracking risky changes&lt;/p&gt;

&lt;p&gt;watching API and architecture evolution&lt;/p&gt;

&lt;p&gt;keeping teams aligned as systems grow&lt;/p&gt;

&lt;p&gt;Open Core&lt;/p&gt;

&lt;p&gt;RepoLens continues to follow an open-core model.&lt;/p&gt;

&lt;p&gt;The reusable analysis engine remains open source, while the hosted platform builds on top of it with collaboration, change intelligence, notifications, workspace controls, and premium product features.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Shipped v0.3.0 of My Open Source Project Scaffolding CLI</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Wed, 18 Mar 2026 01:03:49 +0000</pubDate>
      <link>https://forem.com/mohosin2126/i-shipped-v030-of-my-open-source-project-scaffolding-cli-10ki</link>
      <guid>https://forem.com/mohosin2126/i-shipped-v030-of-my-open-source-project-scaffolding-cli-10ki</guid>
      <description>&lt;p&gt;A few days ago, I published my open source npm package: &lt;strong&gt;starter-structure-cli&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s a Node.js CLI that scaffolds &lt;strong&gt;production-ready starter projects&lt;/strong&gt; from simple stack tokens.&lt;/p&gt;

&lt;p&gt;You can run something like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx starter-structure-cli my-app react vite ts tailwind express prisma postgres&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and get a structured project generated for you instead of spending hours wiring everything manually.&lt;/p&gt;

&lt;p&gt;Since publishing it, I’ve been improving it quickly, and today I shipped &lt;strong&gt;v0.3.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What made this update especially exciting for me is that the package also started getting real usage.&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;March 3, 2026 to March 9, 2026&lt;/strong&gt;, it got &lt;strong&gt;480 downloads&lt;/strong&gt;.&lt;br&gt;
In the following week, it got &lt;strong&gt;35 more downloads&lt;/strong&gt;.&lt;br&gt;
That brings it to &lt;strong&gt;515 total downloads across the last two weeks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s still early, but seeing people actually try something I built has been genuinely motivating.&lt;/p&gt;


&lt;h2&gt;
  
  
  What &lt;code&gt;starter-structure-cli&lt;/code&gt; does
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;Start coding faster without repeating the same setup work again and again.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of manually creating folder structures, wiring frontend and backend pieces together, setting up ORM config, styling, auth, and other repetitive boilerplate, the CLI gives you a working baseline from the stack you choose.&lt;/p&gt;

&lt;p&gt;It currently supports technologies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;shadcn/ui&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;NestJS&lt;/li&gt;
&lt;li&gt;Prisma&lt;/li&gt;
&lt;li&gt;Mongoose&lt;/li&gt;
&lt;li&gt;Sequelize&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;JWT&lt;/li&gt;
&lt;li&gt;NextAuth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it organizes templates across these project types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single App&lt;/li&gt;
&lt;li&gt;Frontend-only&lt;/li&gt;
&lt;li&gt;Backend-only&lt;/li&gt;
&lt;li&gt;Fullstack&lt;/li&gt;
&lt;li&gt;Monorepo&lt;/li&gt;
&lt;li&gt;Turbo Monorepo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With &lt;strong&gt;v0.3.0&lt;/strong&gt;, the catalog now supports &lt;strong&gt;36 production-ready starter templates&lt;/strong&gt;.&lt;/p&gt;



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

&lt;p&gt;This release focused on three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expanding the template catalog&lt;/li&gt;
&lt;li&gt;cleaning up the CLI internally&lt;/li&gt;
&lt;li&gt;strengthening release quality&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  New starters added
&lt;/h3&gt;

&lt;p&gt;I added several new templates, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fastify + Prisma + PostgreSQL backend starter&lt;/li&gt;
&lt;li&gt;Next.js + TypeScript + shadcn/ui + Tailwind starter&lt;/li&gt;
&lt;li&gt;React/Vite + Prisma + PostgreSQL fullstack starter&lt;/li&gt;
&lt;li&gt;Vue/Vite + Prisma + PostgreSQL fullstack starter&lt;/li&gt;
&lt;li&gt;additional backend, single-app, and fullstack combinations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That pushed the catalog to &lt;strong&gt;36 starter templates&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  A cleaner CLI internally
&lt;/h2&gt;

&lt;p&gt;One of the biggest improvements in this release was refactoring the CLI into smaller, more maintainable modules.&lt;/p&gt;

&lt;p&gt;I split the logic into separate parts for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;argument parsing&lt;/li&gt;
&lt;li&gt;catalog discovery&lt;/li&gt;
&lt;li&gt;template matching&lt;/li&gt;
&lt;li&gt;prompts&lt;/li&gt;
&lt;li&gt;scaffolding&lt;/li&gt;
&lt;li&gt;constants and aliases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made the codebase easier to understand and easier to extend as the number of templates keeps growing.&lt;/p&gt;

&lt;p&gt;That cleanup mattered a lot, because once a scaffolding tool starts supporting many combinations, the matching and discovery flow can become messy very quickly.&lt;/p&gt;

&lt;p&gt;I wanted to improve that before continuing to add more starters.&lt;/p&gt;


&lt;h2&gt;
  
  
  Stronger validation before release
&lt;/h2&gt;

&lt;p&gt;I also improved the validation and release checks.&lt;/p&gt;

&lt;p&gt;The project now verifies things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;referenced bases and layers actually exist&lt;/li&gt;
&lt;li&gt;built template outputs are valid&lt;/li&gt;
&lt;li&gt;expected files are present&lt;/li&gt;
&lt;li&gt;template integrity is preserved before publishing&lt;/li&gt;
&lt;li&gt;release quality is more consistent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gave me much more confidence when shipping updates to npm.&lt;/p&gt;

&lt;p&gt;When a project becomes template-driven and composable, validation stops being optional very quickly.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I’m building this
&lt;/h2&gt;

&lt;p&gt;I built this because I kept running into the same problem:&lt;/p&gt;

&lt;p&gt;Every time I started a new project, I spent too much time on setup before I could start building the real thing.&lt;/p&gt;

&lt;p&gt;Not just creating folders, but also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;organizing frontend and backend structure&lt;/li&gt;
&lt;li&gt;connecting stack pieces together&lt;/li&gt;
&lt;li&gt;configuring database tooling&lt;/li&gt;
&lt;li&gt;choosing a maintainable baseline&lt;/li&gt;
&lt;li&gt;reusing and cleaning up old boilerplate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a tool that could take simple stack words and give me a serious starting point.&lt;/p&gt;

&lt;p&gt;Not a toy template.&lt;br&gt;
Not an empty folder structure.&lt;br&gt;
A real baseline that someone could actually continue building on.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example usage
&lt;/h2&gt;

&lt;p&gt;Interactive mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx starter-structure-cli my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Natural stack-token mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx starter-structure-cli my-app react vite ts tailwind express prisma postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List available templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx starter-structure-cli --list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I learned from shipping this
&lt;/h2&gt;

&lt;p&gt;A few things became very clear while working on this release.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Template quality matters more than template count
&lt;/h3&gt;

&lt;p&gt;Adding more starters is useful, but only if the generated output actually feels worth building on.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Validation becomes essential very quickly
&lt;/h3&gt;

&lt;p&gt;As soon as templates become composable, release-time checks become necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Internal cleanup is part of shipping
&lt;/h3&gt;

&lt;p&gt;Adding features is exciting, but maintainability work is what keeps the project from collapsing under growth.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Real users change how you think
&lt;/h3&gt;

&lt;p&gt;Once people start downloading a package, small details start to matter more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naming&lt;/li&gt;
&lt;li&gt;docs&lt;/li&gt;
&lt;li&gt;consistency&lt;/li&gt;
&lt;li&gt;output quality&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;li&gt;discoverability&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;I want to keep improving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;template coverage&lt;/li&gt;
&lt;li&gt;matching quality&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;generated project quality&lt;/li&gt;
&lt;li&gt;the contributor experience for adding new starters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also want to make template authoring easier over time so the project can grow in a cleaner way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx starter-structure-cli my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/mohosin2126/starter-structure-cli" rel="noopener noreferrer"&gt;https://github.com/mohosin2126/starter-structure-cli&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/starter-structure-cli" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/starter-structure-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it, I’d genuinely love feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which stacks you want next&lt;/li&gt;
&lt;li&gt;how useful the generated structure feels&lt;/li&gt;
&lt;li&gt;what would make a tool like this part of your workflow&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Tool That Turns GitHub Repositories Into Architecture Dashboards - RepoLens Version 01</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Thu, 12 Mar 2026 15:32:08 +0000</pubDate>
      <link>https://forem.com/mohosin2126/i-built-a-tool-that-turns-github-repositories-into-architecture-dashboards-55e3</link>
      <guid>https://forem.com/mohosin2126/i-built-a-tool-that-turns-github-repositories-into-architecture-dashboards-55e3</guid>
      <description>&lt;h2&gt;
  
  
  RepoLens (Version 1) -  Know any repo fast.
&lt;/h2&gt;

&lt;p&gt;Understanding a new codebase is one of the hardest parts of software development.&lt;/p&gt;

&lt;p&gt;You open a repository and immediately face questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How are modules structured?&lt;/li&gt;
&lt;li&gt;Which components depend on each other?&lt;/li&gt;
&lt;li&gt;What APIs exist?&lt;/li&gt;
&lt;li&gt;What does the architecture actually look like?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Developers often spend hours reading files just to understand the structure of a project.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;RepoLens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RepoLens Version One&lt;/strong&gt; analyzes GitHub repositories and turns them into a structured architecture dashboard.&lt;/p&gt;

&lt;p&gt;Instead of manually exploring folders, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;module mapping&lt;/li&gt;
&lt;li&gt;dependency graphs&lt;/li&gt;
&lt;li&gt;API endpoint discovery&lt;/li&gt;
&lt;li&gt;generated architecture documentation&lt;/li&gt;
&lt;li&gt;repository chat grounded in code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Live Platform
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://repolensai.com" rel="noopener noreferrer"&gt;https://repolensai.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Repository
&lt;/h2&gt;

&lt;p&gt;The open-source analysis engine is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mohosin2126/repolens-community" rel="noopener noreferrer"&gt;https://github.com/mohosin2126/repolens-community&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What RepoLens V1 Does
&lt;/h2&gt;

&lt;p&gt;RepoLens runs an analysis pipeline that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clones the repository&lt;/li&gt;
&lt;li&gt;Scans project files&lt;/li&gt;
&lt;li&gt;Detects languages and frameworks&lt;/li&gt;
&lt;li&gt;Parses modules and dependencies&lt;/li&gt;
&lt;li&gt;Extracts API routes&lt;/li&gt;
&lt;li&gt;Generates architecture summaries&lt;/li&gt;
&lt;li&gt;Generates project overview and onboarding docs&lt;/li&gt;
&lt;li&gt;Persists structured analysis results for each run&lt;/li&gt;
&lt;li&gt;Builds semantic chunks from repository content&lt;/li&gt;
&lt;li&gt;Generates embeddings for retrieval and search&lt;/li&gt;
&lt;li&gt;Grounds repo chat answers in indexed source files&lt;/li&gt;
&lt;li&gt;Tracks branch-specific analysis history&lt;/li&gt;
&lt;li&gt;Compares branches across key architecture signals&lt;/li&gt;
&lt;li&gt;Exports reports and comparison results&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Prisma&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;BullMQ&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;ts-morph&lt;/li&gt;
&lt;li&gt;React Flow&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I wanted a tool that helps developers understand large repositories faster.&lt;/p&gt;

&lt;p&gt;Especially when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;joining a new project&lt;/li&gt;
&lt;li&gt;reviewing unfamiliar codebases&lt;/li&gt;
&lt;li&gt;exploring open source projects&lt;/li&gt;
&lt;li&gt;onboarding new developers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Core
&lt;/h2&gt;

&lt;p&gt;RepoLens follows an open-core model.&lt;/p&gt;

&lt;p&gt;The reusable repository analysis engine is open source, while the hosted platform builds on top of it with the full product experience.&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built a CLI That Scaffolds 30+ Fullstack Projects From Natural Language</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Sat, 07 Mar 2026 19:47:24 +0000</pubDate>
      <link>https://forem.com/mohosin2126/i-built-a-cli-that-scaffolds-30-fullstack-projects-from-natural-language-4mbl</link>
      <guid>https://forem.com/mohosin2126/i-built-a-cli-that-scaffolds-30-fullstack-projects-from-natural-language-4mbl</guid>
      <description>&lt;p&gt;Ever typed something like this and wished it just worked?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app react vite ts tailwind express prisma mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, now it does. I built &lt;strong&gt;starter-structure-cli&lt;/strong&gt; an open source Node.js CLI that generates production-ready starter projects from stack tokens you type in plain English.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every time I started a new project, I'd spend hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up folder structure&lt;/li&gt;
&lt;li&gt;Wiring up the frontend to the backend&lt;/li&gt;
&lt;li&gt;Configuring ORMs, auth, styling&lt;/li&gt;
&lt;li&gt;Copy-pasting boilerplate from old projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted one command that just gives me a working project with my exact stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You get an interactive prompt that walks you through picking your stack. Or skip the prompts entirely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app react vite ts tailwind express prisma mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It ships with &lt;strong&gt;30+ templates&lt;/strong&gt; across 6 categories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Single App&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;react-vite-ts-tailwind&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend-only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;react-admin-dashboard&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend-only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;express-prisma-mysql-jwt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fullstack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;react-vite-ts-tailwind-express-prisma-mysql&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monorepo (Client/Server)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nextjs-express-prisma&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monorepo (Turbo + pnpm)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nextjs-api-nestjs-prisma&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Stacks covered: &lt;strong&gt;React, Next.js, Vue, Vite, Tailwind CSS, shadcn/ui, Express, NestJS, Prisma, Mongoose, Sequelize, MongoDB, MySQL, PostgreSQL, JWT, NextAuth&lt;/strong&gt; — and growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cool Parts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Natural Language Matching
&lt;/h3&gt;

&lt;p&gt;You don't need to memorize template names. Just throw stack words at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app reactjs tailwind css nodejs prisma mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI normalizes aliases automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;reactjs&lt;/code&gt; → &lt;code&gt;react&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tailwindcss&lt;/code&gt; → &lt;code&gt;tailwind&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;typescript&lt;/code&gt; → &lt;code&gt;ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;next&lt;/code&gt; → &lt;code&gt;nextjs&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It even ignores filler words like &lt;code&gt;with&lt;/code&gt;, &lt;code&gt;project&lt;/code&gt;, &lt;code&gt;app&lt;/code&gt;, and &lt;code&gt;css&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Composable Template System
&lt;/h3&gt;

&lt;p&gt;Templates aren't just static folders. They're built from &lt;strong&gt;composable layers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;template-sources/
  bases/       → shared project skeletons
  layers/      → stack-specific overlays
  presets/     → final template definitions (JSON)
  components/  → reusable snippets (package.json, README, styles)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A preset JSON file defines how layers compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"templates/fullstack/react-vite-ts-tailwind-express-prisma-mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bases/fullstack/react-vite-ts-tailwind-express"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"layers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"layers/backend-only/prisma-mysql"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variables"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"DB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means adding a new database variant is just a new 5-line JSON preset — not a whole new template folder.&lt;/p&gt;

&lt;p&gt;The system also supports &lt;code&gt;{{ include: }}&lt;/code&gt; directives with &lt;strong&gt;cycle detection&lt;/strong&gt;, so templates can reference shared snippets without infinite loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Interactive + Non-Interactive
&lt;/h3&gt;

&lt;p&gt;Fully interactive with &lt;code&gt;@clack/prompts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app
&lt;span class="c"&gt;# → Pick category → Pick stack options → Generate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or fully automated for CI/scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--category&lt;/span&gt; fullstack &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--frontend&lt;/span&gt; react &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--backend&lt;/span&gt; express &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--orm&lt;/span&gt; prisma &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--database&lt;/span&gt; mysql &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Smart Defaults
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If both JS and TS variants exist, &lt;strong&gt;TypeScript is preferred&lt;/strong&gt; unless you pass &lt;code&gt;--language js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__APP_NAME__&lt;/code&gt; placeholders are replaced in file names, folder names, and file contents&lt;/li&gt;
&lt;li&gt;Auto-installs dependencies with &lt;code&gt;--install&lt;/code&gt; (supports npm, pnpm, yarn)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Generated Project Structures
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fullstack:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
  client/    → React/Vue/Next.js frontend
  server/    → Express/NestJS backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Monorepo (Turbo):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
  apps/
    web/     → frontend
    api/     → backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Templates include starter structure for components, routes, hooks, services, controllers, and data modules — not just empty folders.&lt;/p&gt;

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

&lt;p&gt;The entire CLI is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pure Node.js&lt;/strong&gt; (ES Modules, zero build step)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@clack/prompts&lt;/strong&gt; — beautiful terminal UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;picocolors&lt;/strong&gt; — lightweight terminal colors&lt;/li&gt;
&lt;li&gt;A custom &lt;strong&gt;template build pipeline&lt;/strong&gt; that composes presets at publish time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is intentionally simple. No frameworks, no bundlers, no compilation. Just Node.js doing what it does best — file system operations and CLI parsing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or browse the templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx starter-structure-cli &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/mohosin2126/starter-structure-cli" rel="noopener noreferrer"&gt;github.com/mohosin2126/starter-structure-cli&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/starter-structure-cli" rel="noopener noreferrer"&gt;npmjs.com/package/starter-structure-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star it if you find it useful ⭐  and feel free to open issues or contribute new templates!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What a monorepo needs (the real requirements)</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Wed, 25 Feb 2026 15:35:57 +0000</pubDate>
      <link>https://forem.com/mohosin2126/what-a-monorepo-needs-the-real-requirements-1m28</link>
      <guid>https://forem.com/mohosin2126/what-a-monorepo-needs-the-real-requirements-1m28</guid>
      <description>&lt;p&gt;A good monorepo package manager should handle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Workspaces&lt;/strong&gt; (multiple packages/apps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast installs&lt;/strong&gt; for big repos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic lockfile&lt;/strong&gt; (same deps everywhere)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Good CI caching&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal “dependency weirdness”&lt;/strong&gt; (phantom deps, hoisting surprises)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Good developer workflow&lt;/strong&gt; (run scripts across packages, filtering, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  pnpm in monorepos (why it’s usually best)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Speed (especially after first install)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;pnpm keeps a &lt;strong&gt;global content-addressable store&lt;/strong&gt; (one copy of each package version).&lt;/li&gt;
&lt;li&gt;Each project uses &lt;strong&gt;hardlinks&lt;/strong&gt; into &lt;code&gt;node_modules&lt;/code&gt;.
Result: repeated installs are very fast, and huge monorepos benefit a lot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Disk usage (big win)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;With npm, each workspace can duplicate the same packages across subprojects.&lt;/li&gt;
&lt;li&gt;With pnpm, packages are &lt;strong&gt;reused&lt;/strong&gt; from the store.
Result: smaller repo footprint and faster docker/CI layers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Strict dependency isolation (less “hidden bugs”)
&lt;/h3&gt;

&lt;p&gt;pnpm is strict:&lt;br&gt;
If &lt;code&gt;package-a&lt;/code&gt; doesn’t declare &lt;code&gt;lodash&lt;/code&gt; in its &lt;code&gt;package.json&lt;/code&gt;, it &lt;strong&gt;can’t import it&lt;/strong&gt; just because some other package installed it.&lt;/p&gt;

&lt;p&gt;This prevents the classic monorepo bug:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It worked on my machine because it was hoisted… but CI broke later.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4) Workspace tooling feels made for monorepos
&lt;/h3&gt;

&lt;p&gt;pnpm has very ergonomic workspace commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run scripts across all packages&lt;/li&gt;
&lt;li&gt;filter to run on only affected packages&lt;/li&gt;
&lt;li&gt;recursive installs/builds are clean&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5) CI caching is usually better
&lt;/h3&gt;

&lt;p&gt;Because pnpm’s store is reusable, caching is simpler and more effective.&lt;/p&gt;

&lt;p&gt;In many CI pipelines, pnpm installs become consistently faster after the first cached run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
New monorepos, medium/large repos, teams that care about correctness and speed, TurboRepo/Nx repos.&lt;/p&gt;

&lt;h2&gt;
  
  
  npm in monorepos (when it’s still a good choice)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Maximum compatibility / minimum friction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;npm ships with Node by default.&lt;/li&gt;
&lt;li&gt;Some older tools and scripts assume npm-style hoisting behavior.
That makes npm “boring and safe” in some enterprise setups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Simpler mental model for some teams
&lt;/h3&gt;

&lt;p&gt;If the team already knows npm and the repo is small-ish, npm workspaces can be “good enough.”&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Fewer edge cases with legacy tooling
&lt;/h3&gt;

&lt;p&gt;pnpm’s strictness &lt;em&gt;can&lt;/em&gt; expose issues in older packages that assumed hoisting.&lt;br&gt;
That’s not pnpm’s fault—it’s correctness—but it can create migration work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;br&gt;
Legacy repos, very strict “no new tooling” policy, or ecosystems with fragile dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Differences (quick but important)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dependency layout
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt;: often &lt;strong&gt;hoisted&lt;/strong&gt; dependencies (deps can appear available even if not declared)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pnpm&lt;/strong&gt;: uses a &lt;strong&gt;symlinked structure&lt;/strong&gt; that enforces correctness&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bug prevention
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;pnpm&lt;/strong&gt; catches missing dependencies earlier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; may hide missing dependency problems until later&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;pnpm usually wins for bigger repos and repeated installs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommendation (simple decision guide)
&lt;/h2&gt;

&lt;p&gt;Pick &lt;strong&gt;pnpm&lt;/strong&gt; if you want:&lt;br&gt;
fast installs&lt;br&gt;
lower disk usage&lt;br&gt;
fewer “phantom dependency” bugs&lt;br&gt;
best monorepo ergonomics&lt;/p&gt;

&lt;p&gt;Pick &lt;strong&gt;npm&lt;/strong&gt; if you want:&lt;br&gt;
maximum compatibility&lt;br&gt;
simplest onboarding (no extra tool install)&lt;br&gt;
legacy tooling expectations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My default in 2026:&lt;/strong&gt; &lt;strong&gt;pnpm&lt;/strong&gt; for almost every new monorepo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best-practice setup (works great)
&lt;/h2&gt;

&lt;p&gt;If you choose pnpm, do this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep &lt;strong&gt;one lockfile&lt;/strong&gt; at repo root&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;pnpm workspaces&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add a pinned version for consistency across the team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example idea (conceptual):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;root &lt;code&gt;package.json&lt;/code&gt; with &lt;code&gt;"packageManager": "pnpm@X.Y.Z"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;pnpm-workspace.yaml&lt;/code&gt; listing packages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apps/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;packages/*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>365 Days, 2,010 Contributions: What I Learned from a Year of Zero Missed Days</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Sun, 04 Jan 2026 05:30:21 +0000</pubDate>
      <link>https://forem.com/mohosin2126/365-days-2010-contributions-what-i-learned-from-a-year-of-zero-missed-days-15dc</link>
      <guid>https://forem.com/mohosin2126/365-days-2010-contributions-what-i-learned-from-a-year-of-zero-missed-days-15dc</guid>
      <description>&lt;p&gt;In 2025, I made a silent promise to myself: &lt;strong&gt;Show up.&lt;/strong&gt; No matter how I felt, no matter how busy the day was, I committed to pushing my craft forward every single day. Today, looking back at the green squares on my GitHub profile, the numbers tell one story, but the growth tells another.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Stats
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Days Commited:&lt;/strong&gt; 365 / 365&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Contributions:&lt;/strong&gt; 2,010&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days Missed:&lt;/strong&gt; 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Handle:&lt;/strong&gt; &lt;a href="https://github.com/mohosin2126" rel="noopener noreferrer"&gt;@mohosin2126&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Beyond the Green Squares
&lt;/h3&gt;

&lt;p&gt;While the GitHub contribution graph is a great motivator, it only scratches the surface. In the beginning, I was focused on the "streak." But as the months progressed, the focus shifted from &lt;em&gt;quantity&lt;/em&gt; to &lt;em&gt;quality&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I realized that 2,010 contributions aren't just lines of code; they are 2,010 moments of problem-solving, debugging, and architectural decision-making.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Projects That Defined My Year
&lt;/h3&gt;

&lt;p&gt;My year was largely defined by three major pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;@codethinker (Primary Focus):&lt;/strong&gt; This has been my main driver. Building and scaling this project required me to move beyond basic implementation and think deeply about user experience and system reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@orbillo &amp;amp; @perkoxofficial:&lt;/strong&gt; Contributing to these organizations allowed me to collaborate and understand different codebases, which is essential for any developer looking to grow.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What I Learned When I Refused to Take a Day Off
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Logic Over Syntax
&lt;/h4&gt;

&lt;p&gt;When you code every day, syntax becomes second nature. This frees up your brain to focus on the truly hard parts: &lt;strong&gt;logic and architecture.&lt;/strong&gt; I found myself spending more time planning my approach and less time looking up documentation for basic functions.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. The Power of "Non-Zero" Days
&lt;/h4&gt;

&lt;p&gt;There were days when I didn't feel like a "rockstar." There were days when I was tired or stuck. But I learned the value of the "Non-Zero Day." Even a small refactor or a documentation update keeps the momentum alive. Consistency beats intensity every single time.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Architecture is a Mindset
&lt;/h4&gt;

&lt;p&gt;By maintaining a year-long streak, I was forced to live with my own code for 365 days straight. Nothing teaches you the importance of clean, maintainable architecture quite like having to fix a bug in code you wrote six months ago during a "daily streak" rush.&lt;/p&gt;

&lt;h3&gt;
  
  
  Looking Ahead
&lt;/h3&gt;

&lt;p&gt;If 2025 was about &lt;strong&gt;discipline&lt;/strong&gt;, 2026 will be about &lt;strong&gt;depth&lt;/strong&gt;. I want to take the consistency I’ve built and apply it to even more complex architectural challenges and open-source contributions.&lt;/p&gt;

&lt;p&gt;To anyone thinking about starting their own streak: &lt;strong&gt;Don't wait for the perfect moment.&lt;/strong&gt; Just start. The growth happens in the struggle, not the success.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Let’s Connect!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/mohosin2126" rel="noopener noreferrer"&gt;mohosin2126&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projects I'm working on:&lt;/strong&gt; @codethinker, @orbillo, @perkoxofficial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;How do you stay consistent in your coding journey? I’d love to hear your thoughts in the comments!&lt;/em&gt;&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Primary Key vs Foreign Key: A Complete Guide for Developers</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Mon, 29 Sep 2025 16:21:09 +0000</pubDate>
      <link>https://forem.com/mohosin2126/primary-key-vs-foreign-key-a-complete-guide-for-developers-fle</link>
      <guid>https://forem.com/mohosin2126/primary-key-vs-foreign-key-a-complete-guide-for-developers-fle</guid>
      <description>&lt;p&gt;Relational databases power everything from small web apps to enterprise-grade systems. At the heart of relational database design are &lt;strong&gt;Primary Keys&lt;/strong&gt; and &lt;strong&gt;Foreign Keys&lt;/strong&gt;. These concepts define how data is uniquely identified and how different tables connect to each other. Whether you are designing your first database or optimizing a production system, understanding these keys is essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Primary Key
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Primary Key&lt;/strong&gt; is a column or a group of columns in a database table that uniquely identifies each record in that table.&lt;br&gt;
It acts like a unique ID card for every row, ensuring there is no ambiguity when retrieving, updating, or deleting data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics of a Primary Key
&lt;/h3&gt;

&lt;p&gt;• &lt;strong&gt;Uniqueness&lt;/strong&gt; Every row must have a unique primary key value.&lt;br&gt;
• &lt;strong&gt;Non Null&lt;/strong&gt; Primary keys cannot contain &lt;code&gt;NULL&lt;/code&gt; values.&lt;br&gt;
• &lt;strong&gt;Single Definition&lt;/strong&gt; Each table can have only one primary key but it may consist of multiple columns which is known as a composite key.&lt;br&gt;
• &lt;strong&gt;Immutable&lt;/strong&gt; The value of a primary key should rarely change because it serves as the permanent identifier of the row.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example of a Primary Key
&lt;/h3&gt;

&lt;p&gt;Consider a &lt;code&gt;Users&lt;/code&gt; table&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;user_id (Primary Key)&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;email&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:alice@email.com"&gt;alice@email.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:bob@email.com"&gt;bob@email.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Carol&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:carol@email.com"&gt;carol@email.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here &lt;code&gt;user_id&lt;/code&gt; is the primary key. Even if two users share the same name or email domain their &lt;code&gt;user_id&lt;/code&gt; remains unique.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Foreign Key
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Foreign Key&lt;/strong&gt; is a column or a group of columns in one table that references the primary key of another table.&lt;br&gt;
Its purpose is to enforce &lt;strong&gt;referential integrity&lt;/strong&gt; making sure that relationships between tables remain valid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics of a Foreign Key
&lt;/h3&gt;

&lt;p&gt;• &lt;strong&gt;Reference&lt;/strong&gt; Points to the primary key of another parent table.&lt;br&gt;
• &lt;strong&gt;Duplicates Allowed&lt;/strong&gt; Multiple rows in the child table can reference the same parent record.&lt;br&gt;
• &lt;strong&gt;Optional Relationship&lt;/strong&gt; Can allow &lt;code&gt;NULL&lt;/code&gt; values if the relationship is not mandatory.&lt;br&gt;
• &lt;strong&gt;Multiple Allowed&lt;/strong&gt; A table can have several foreign keys pointing to different parent tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example of a Foreign Key
&lt;/h3&gt;

&lt;p&gt;Consider an &lt;code&gt;Orders&lt;/code&gt; table&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;order_id&lt;/th&gt;
&lt;th&gt;user_id (Foreign Key)&lt;/th&gt;
&lt;th&gt;product&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Laptop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Keyboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Mouse&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here the &lt;code&gt;user_id&lt;/code&gt; column in the &lt;code&gt;Orders&lt;/code&gt; table is a foreign key that references the &lt;code&gt;user_id&lt;/code&gt; column in the &lt;code&gt;Users&lt;/code&gt; table.&lt;br&gt;
This ensures that every order is linked to a valid user. If you try to insert an order with a &lt;code&gt;user_id&lt;/code&gt; that does not exist in the &lt;code&gt;Users&lt;/code&gt; table the database will reject it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primary Key vs Foreign Key Side by Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Primary Key&lt;/th&gt;
&lt;th&gt;Foreign Key&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uniquely identifies each record in a table&lt;/td&gt;
&lt;td&gt;Creates a relationship between two tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uniqueness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Must be unique across all rows&lt;/td&gt;
&lt;td&gt;Can have duplicate values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nullability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cannot contain &lt;code&gt;NULL&lt;/code&gt; values&lt;/td&gt;
&lt;td&gt;Can contain &lt;code&gt;NULL&lt;/code&gt; values if the relationship is optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Number per Table&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only one primary key is allowed&lt;/td&gt;
&lt;td&gt;A table can have multiple foreign keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exists within its own table&lt;/td&gt;
&lt;td&gt;References the primary key of another table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integrity Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Guarantees uniqueness within the table itself&lt;/td&gt;
&lt;td&gt;Ensures valid links between child and parent tables&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This comparison shows that while both keys are used to maintain order and integrity their roles are different.&lt;br&gt;
The primary key focuses on identifying rows within a single table while the foreign key focuses on linking one table to another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real World Analogy
&lt;/h2&gt;

&lt;p&gt;Think of a &lt;strong&gt;Primary Key&lt;/strong&gt; as a &lt;strong&gt;passport number&lt;/strong&gt;. Each passport number is unique to one person and cannot be duplicated.&lt;br&gt;
A &lt;strong&gt;Foreign Key&lt;/strong&gt; is like a &lt;strong&gt;visa stamp&lt;/strong&gt; inside the passport. It connects your identity to another country’s system.&lt;br&gt;
A visa is only valid if the passport exists just as a foreign key is only valid if the corresponding primary key exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;p&gt;To build strong and scalable databases keep these best practices in mind&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;Use Simple and Stable Keys&lt;/strong&gt; Choose primary keys that are simple and unlikely to change such as an auto incrementing integer.&lt;br&gt;
• &lt;strong&gt;Avoid Changing Primary Key Values&lt;/strong&gt; Because other tables may rely on them changing a primary key can cause cascading issues.&lt;br&gt;
• &lt;strong&gt;Index Foreign Keys&lt;/strong&gt; Adding indexes on foreign key columns can significantly improve join performance.&lt;br&gt;
• &lt;strong&gt;Enforce Referential Integrity&lt;/strong&gt; Use database constraints &lt;code&gt;ON DELETE&lt;/code&gt; and &lt;code&gt;ON UPDATE&lt;/code&gt; to control how changes in the parent table affect child tables.&lt;br&gt;
• &lt;strong&gt;Avoid Using Business Data as Keys&lt;/strong&gt; Columns like email or phone numbers can change and should not be primary keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why These Keys Matter
&lt;/h2&gt;

&lt;p&gt;Without a primary key it would be impossible to uniquely identify records making operations like updates or deletions unreliable.&lt;br&gt;
Without a foreign key relationships between tables would be fragile allowing invalid or orphaned records to exist.&lt;br&gt;
Together primary and foreign keys create a structured dependable and maintainable database design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Primary keys and foreign keys are not just database jargon. They are fundamental to creating relational databases that are efficient scalable and consistent.&lt;br&gt;
The primary key ensures that each row in a table is unique while the foreign key maintains valid connections between tables.&lt;br&gt;
Mastering these concepts will help you design systems that handle growth gracefully and maintain data integrity in the real world.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>GitHub on Windows: The Complete Guide to SSH, GitHub Desktop, and No Keygen Commits</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Wed, 13 Aug 2025 18:08:16 +0000</pubDate>
      <link>https://forem.com/mohosin2126/github-on-windows-the-complete-guide-to-ssh-github-desktop-and-no-keygen-commits-4i9g</link>
      <guid>https://forem.com/mohosin2126/github-on-windows-the-complete-guide-to-ssh-github-desktop-and-no-keygen-commits-4i9g</guid>
      <description>&lt;p&gt;Working with GitHub on Windows can be painless and secure if you set it up the right way.&lt;br&gt;
In this article, you will learn three complete workflows&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SSH from Command Prompt or PowerShell for passwordless, secure pushes and pulls&lt;/li&gt;
&lt;li&gt;GitHub Desktop the GUI option no SSH setup required&lt;/li&gt;
&lt;li&gt;No keygen methods working over HTTPS using a Personal Access Token or the GitHub web editor&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Why SSH vs HTTPS on Windows
&lt;/h2&gt;

&lt;p&gt;SSH uses a key pair stored on your machine. No password or token prompts once configured.&lt;br&gt;
HTTPS uses your GitHub login or Personal Access Token PAT. Works out of the box with GitHub Desktop.&lt;br&gt;
Web editor lets you make commits right in your browser with no local setup needed.&lt;/p&gt;
&lt;h2&gt;
  
  
  SSH from Windows CMD or PowerShell
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1 Check for existing SSH keys
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="nv"&gt;%USERPROFILE%&lt;/span&gt;\.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Look for&lt;br&gt;
&lt;code&gt;id_ed25519&lt;/code&gt; private&lt;br&gt;
&lt;code&gt;id_ed25519.pub&lt;/code&gt; public&lt;/p&gt;

&lt;p&gt;If they exist and you want to reuse them, skip to Step 4.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2 Create a new SSH key
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;ssh&lt;/span&gt;&lt;span class="na"&gt;-keygen -t &lt;/span&gt;&lt;span class="kd"&gt;ed25519&lt;/span&gt; &lt;span class="na"&gt;-C &lt;/span&gt;&lt;span class="s2"&gt;"you@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Press Enter to accept default path&lt;br&gt;
&lt;code&gt;%USERPROFILE%\.ssh\id_ed25519&lt;/code&gt;&lt;br&gt;
Optionally set a passphrase.&lt;/p&gt;

&lt;p&gt;If ed25519 is not supported&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;ssh&lt;/span&gt;&lt;span class="na"&gt;-keygen -t &lt;/span&gt;&lt;span class="kd"&gt;rsa&lt;/span&gt; &lt;span class="na"&gt;-b &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt; &lt;span class="na"&gt;-C &lt;/span&gt;&lt;span class="s2"&gt;"you@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3 Start the SSH agent and load your key
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ssh-agent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Automatic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ssh-agent&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ssh-add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="nx"&gt;\.ssh\id_ed25519&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4 Copy your public key
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="nx"&gt;\.ssh\id_ed25519.pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-Clipboard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5 Add the key to GitHub
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to Settings then SSH and GPG keys then New SSH key&lt;/li&gt;
&lt;li&gt;Title it for example Windows Laptop&lt;/li&gt;
&lt;li&gt;Paste your key&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 6 Test your connection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;ssh&lt;/span&gt; &lt;span class="na"&gt;-T &lt;/span&gt;&lt;span class="kd"&gt;git&lt;/span&gt;@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful you will see&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi &amp;lt;username&amp;gt; You have successfully authenticated...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7 Use SSH in Git
&lt;/h3&gt;

&lt;p&gt;Clone&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;clone&lt;/span&gt; &lt;span class="kd"&gt;git&lt;/span&gt;@github.com:OWNER/REPO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switch existing repo from HTTPS to SSH&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;remote&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="na"&gt;-url &lt;/span&gt;&lt;span class="kd"&gt;origin&lt;/span&gt; &lt;span class="kd"&gt;git&lt;/span&gt;@github.com:OWNER/REPO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 8 Commit and push
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;add&lt;/span&gt; .
&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;commit&lt;/span&gt; &lt;span class="na"&gt;-m &lt;/span&gt;&lt;span class="s2"&gt;"feat: first SSH commit from Windows"&lt;/span&gt;
&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;push&lt;/span&gt; &lt;span class="kd"&gt;origin&lt;/span&gt; &lt;span class="kd"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GitHub Desktop The GUI Method No SSH Needed
&lt;/h2&gt;

&lt;p&gt;GitHub Desktop uses HTTPS by default and stores credentials securely. Perfect if you want to skip SSH.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 Install and sign in
&lt;/h3&gt;

&lt;p&gt;Download from desktop.github.com&lt;br&gt;
Sign in with your GitHub account.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2 Add a repository
&lt;/h3&gt;

&lt;p&gt;Clone from GitHub File → Clone Repository&lt;br&gt;
Add existing project File → Add Local Repository&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3 Ensure HTTPS remote
&lt;/h3&gt;

&lt;p&gt;Repository → Repository Settings&lt;br&gt;
Ensure URL is &lt;code&gt;https://github.com/...&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4 Commit changes
&lt;/h3&gt;

&lt;p&gt;Edit files in your project folder.&lt;br&gt;
In Desktop, select changed files, write a commit message, click Commit to branch.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5 Push to GitHub
&lt;/h3&gt;

&lt;p&gt;Click Push origin.&lt;br&gt;
To create a PR, click Create Pull Request.&lt;/p&gt;
&lt;h2&gt;
  
  
  No Keygen Options
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Option 1 HTTPS with Personal Access Token
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a fine grained PAT in GitHub Settings → Developer settings → Personal Access Tokens&lt;/li&gt;
&lt;li&gt;Switch remote to HTTPS
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;remote&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="na"&gt;-url &lt;/span&gt;&lt;span class="kd"&gt;origin&lt;/span&gt; &lt;span class="kd"&gt;https&lt;/span&gt;://github.com/OWNER/REPO.git
&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;push&lt;/span&gt; &lt;span class="kd"&gt;origin&lt;/span&gt; &lt;span class="kd"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Use your GitHub username and PAT when prompted.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Option 2 GitHub Web Commits
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open repo on github.com&lt;/li&gt;
&lt;li&gt;Add file → Create new file or edit existing&lt;/li&gt;
&lt;li&gt;Write changes and commit directly to main or via new branch and PR&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Troubleshooting on Windows
&lt;/h2&gt;

&lt;p&gt;Permission denied publickey&lt;br&gt;
Check if your key is loaded&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh-add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If none re-add&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh-add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="nx"&gt;\.ssh\id_ed25519&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify your public key is in GitHub settings.&lt;/p&gt;

&lt;p&gt;GitHub Desktop cannot push&lt;br&gt;
Switch to HTTPS in Repository Settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick SSH Cheat Sheet Windows
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh-keygen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ed25519&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"you@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ssh-agent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Automatic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ssh-agent&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ssh-add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="nx"&gt;\.ssh\id_ed25519&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERPROFILE&lt;/span&gt;&lt;span class="nx"&gt;\.ssh\id_ed25519.pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set-Clipboard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-T&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;git&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;github.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;commit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SSH is best for developers who want secure passwordless Git operations.&lt;br&gt;
GitHub Desktop is ideal for a quick GUI based workflow.&lt;br&gt;
HTTPS with PAT or Web Commits let you skip SSH entirely.&lt;/p&gt;

&lt;p&gt;Choose the method that fits your workflow and you will never dread pushing to GitHub on Windows again.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Build High-Performance Websites with React.js, Next.js, Vue.js and Tailwind CSS</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Sat, 19 Jul 2025 18:10:50 +0000</pubDate>
      <link>https://forem.com/mohosin2126/build-high-performance-websites-with-reactjs-nextjs-vuejs-and-tailwind-css-6e9</link>
      <guid>https://forem.com/mohosin2126/build-high-performance-websites-with-reactjs-nextjs-vuejs-and-tailwind-css-6e9</guid>
      <description>&lt;p&gt;Hello Dev Community,&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;Md Mohosin Ali&lt;/strong&gt;, a Full Stack Developer based in Bangladesh, specializing in &lt;strong&gt;React.js, Next.js, Vue.js&lt;/strong&gt;, and &lt;strong&gt;Tailwind CSS&lt;/strong&gt;. With over two years of professional experience, I help startups, designers, and businesses transform their design files (Figma, PSD, Adobe XD) into fully responsive, high-performance websites and web applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Services I Provide
&lt;/h2&gt;

&lt;p&gt;I offer complete frontend and backend development services, with a focus on performance, scalability, and pixel-perfect precision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design to Code Conversion
&lt;/h3&gt;

&lt;p&gt;Transform Figma, PSD, or XD designs into dynamic web applications using modern frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic HTML5&lt;/li&gt;
&lt;li&gt;Optimized performance with Next.js and Vue.js&lt;/li&gt;
&lt;li&gt;Tailwind CSS for responsive, mobile-first design&lt;/li&gt;
&lt;li&gt;SEO best practices included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gig Link:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.fiverr.com/mohosin2126/convert-figma-psd-xd-to-responsive-reactjs-nextjs-website-with-tailwind-css" rel="noopener noreferrer"&gt;Convert Figma, PSD, or XD to React/Next.js&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Landing Page Development
&lt;/h3&gt;

&lt;p&gt;Develop clean and modern landing pages optimized for conversions. Built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js / React.js / Vue.js&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Responsive structure and reusable components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gig Link:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="http://fiverr.com/mohosin2126/design-a-custom-nextjs-and-react-landing-page-with-tailwind-css" rel="noopener noreferrer"&gt;Design a Custom React/Next.js Landing Page&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Website Development
&lt;/h3&gt;

&lt;p&gt;Get scalable websites or MVPs tailored for your startup or business:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-page websites or SPAs&lt;/li&gt;
&lt;li&gt;Clean, modular code&lt;/li&gt;
&lt;li&gt;API integration and state management&lt;/li&gt;
&lt;li&gt;Production-ready deployment setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gig Link:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.fiverr.com/mohosin2126/build-modern-responsive-websites-with-reactjs-nextjs-tailwind-css" rel="noopener noreferrer"&gt;Build Responsive Websites with React/Next.js&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  API Integration &amp;amp; Backend Logic
&lt;/h3&gt;

&lt;p&gt;Connect your frontend to a secure, scalable backend with RESTful or GraphQL APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js + Express.js with MongoDB&lt;/li&gt;
&lt;li&gt;JWT or OAuth2 authentication&lt;/li&gt;
&lt;li&gt;Secure data handling, efficient queries, and well-documented endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gig Link:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.fiverr.com/mohosin2126/integrate-rest-api-or-graphql-into-your-nextjs-or-reactjs-website" rel="noopener noreferrer"&gt;Integrate REST API or GraphQL into Your Web App&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React.js, Next.js, Vue.js, Tailwind CSS, Material UI, Shadcn UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js, Express.js, MongoDB, Prisma ORM, Firebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Redux, Context API, TanStack Query&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: REST, GraphQL, Axios, Apollo Client&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev Tools&lt;/strong&gt;: Git, Vercel, Postman, JWT, Role-Based Access&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recent Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Career Props – Job Portal&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A scalable HR platform with real-time updates, advanced search, and user roles.&lt;br&gt;&lt;br&gt;
Live: &lt;a href="https://career-props.vercel.app" rel="noopener noreferrer"&gt;https://career-props.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other notable projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Addition (E-Commerce for Influencers)&lt;/li&gt;
&lt;li&gt;Truthful Taxes (Financial Services)&lt;/li&gt;
&lt;li&gt;HireMaster (Job Portal)&lt;/li&gt;
&lt;li&gt;NestEgg (Financial Property Dashboard)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Work With Me?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Professional and scalable codebase&lt;/li&gt;
&lt;li&gt;Responsive, mobile-friendly design&lt;/li&gt;
&lt;li&gt;SEO optimization and fast loading times&lt;/li&gt;
&lt;li&gt;Clean and maintainable architecture&lt;/li&gt;
&lt;li&gt;Unlimited revisions on standard and premium packages&lt;/li&gt;
&lt;li&gt;Clear documentation and post-delivery support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get in Touch
&lt;/h2&gt;

&lt;p&gt;If you're looking for a developer who values quality, speed, and clean code, I invite you to explore my Fiverr profile and contact me for collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Fiverr Profile:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.fiverr.com/mohosin2126" rel="noopener noreferrer"&gt;https://www.fiverr.com/mohosin2126&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s build something exceptional—custom-coded and performance-optimized.&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>tailwindcss</category>
      <category>freelance</category>
    </item>
    <item>
      <title>DBMS vs. RDBMS: Concepts, Differences, and Real-World Applications</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Tue, 20 May 2025 16:51:28 +0000</pubDate>
      <link>https://forem.com/mohosin2126/dbms-vs-rdbms-concepts-differences-and-real-world-applications-5ckd</link>
      <guid>https://forem.com/mohosin2126/dbms-vs-rdbms-concepts-differences-and-real-world-applications-5ckd</guid>
      <description>&lt;p&gt;In today’s data-driven world, effective data management is essential for everything from lightweight applications to complex enterprise systems. Two foundational technologies used for managing data are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DBMS (Database Management System)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDBMS (Relational Database Management System)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these terms are often used interchangeably, they refer to distinct systems with different capabilities. This article explores what DBMS and RDBMS are, highlights their key differences, and provides real-world examples to help you understand when to use each.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What is a DBMS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Database Management System (DBMS)&lt;/strong&gt; is software that enables users to &lt;strong&gt;create, retrieve, update, and manage data&lt;/strong&gt; in a structured format. Typically, data is stored in files on disk, and the DBMS provides the tools to interact with that data efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Characteristics of DBMS:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stores data in &lt;strong&gt;flat files&lt;/strong&gt;, &lt;strong&gt;hierarchical&lt;/strong&gt;, or &lt;strong&gt;network models&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Designed for &lt;strong&gt;small-scale&lt;/strong&gt; applications and &lt;strong&gt;single-user environments&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Does &lt;strong&gt;not support relationships&lt;/strong&gt; between data entities&lt;/li&gt;
&lt;li&gt;Provides &lt;strong&gt;basic security&lt;/strong&gt; and &lt;strong&gt;limited transaction management&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Offers &lt;strong&gt;minimal support for complex queries&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Suitable for &lt;strong&gt;standalone desktop applications&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Real-World Example: Microsoft Access&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Consider a small business using &lt;strong&gt;Microsoft Access&lt;/strong&gt; to maintain a &lt;strong&gt;customer contact list&lt;/strong&gt; and &lt;strong&gt;order records&lt;/strong&gt;. The data is stored in isolated files, and any relationship between them must be handled manually. For example, finding out which customers placed which orders would require cross-referencing files manually, as the system lacks relational enforcement.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;DBMS Data Structure Example:&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer File:
CustomerID | Name   | Email
-----------|--------|---------------------
1          | Alice  | alice@example.com
2          | Bob    | bob@example.com

Order File:
OrderID | CustomerID | Item
--------|------------|--------
101     | 1          | Laptop
102     | 2          | Phone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, there’s no enforced relationship between &lt;code&gt;CustomerID&lt;/code&gt; in the two files. The system does not validate the integrity of that link.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What is an RDBMS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Relational Database Management System (RDBMS)&lt;/strong&gt; stores data in &lt;strong&gt;tables (relations)&lt;/strong&gt; and allows for &lt;strong&gt;relationships between tables&lt;/strong&gt; using &lt;strong&gt;keys&lt;/strong&gt;. Based on &lt;strong&gt;E.F. Codd’s relational model&lt;/strong&gt;, RDBMSs use &lt;strong&gt;Structured Query Language (SQL)&lt;/strong&gt; for database operations and provide robust support for data integrity, multi-user access, and complex queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Key Characteristics of RDBMS:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Organizes data in &lt;strong&gt;tables&lt;/strong&gt; with rows and columns&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;relationships&lt;/strong&gt; using &lt;strong&gt;primary keys&lt;/strong&gt; and &lt;strong&gt;foreign keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enforces &lt;strong&gt;data integrity constraints&lt;/strong&gt; (e.g., NOT NULL, UNIQUE, FOREIGN KEY)&lt;/li&gt;
&lt;li&gt;Allows for &lt;strong&gt;complex querying and reporting&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;concurrent access&lt;/strong&gt; and &lt;strong&gt;ACID-compliant transactions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Offers &lt;strong&gt;advanced security&lt;/strong&gt; and &lt;strong&gt;high scalability&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Real-World Example: MySQL&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A typical &lt;strong&gt;e-commerce platform&lt;/strong&gt; might use &lt;strong&gt;MySQL&lt;/strong&gt;, an open-source RDBMS, to manage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User information&lt;/li&gt;
&lt;li&gt;Product listings&lt;/li&gt;
&lt;li&gt;Orders&lt;/li&gt;
&lt;li&gt;Payment histories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These entities are stored in separate but &lt;strong&gt;relationally linked&lt;/strong&gt; tables, enabling efficient and reliable operations.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;RDBMS Data Structure Example:&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Customers Table&lt;/span&gt;
&lt;span class="n"&gt;CustomerID&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;   &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt;
&lt;span class="c1"&gt;-----------|--------|---------------------&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bob&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;

&lt;span class="c1"&gt;-- Orders Table (CustomerID is a foreign key)&lt;/span&gt;
&lt;span class="n"&gt;OrderID&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;CustomerID&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;
&lt;span class="c1"&gt;--------|------------|--------&lt;/span&gt;
&lt;span class="mi"&gt;101&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Laptop&lt;/span&gt;
&lt;span class="mi"&gt;102&lt;/span&gt;     &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;          &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Phone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;CustomerID&lt;/code&gt; in the &lt;strong&gt;Orders&lt;/strong&gt; table is a &lt;strong&gt;foreign key&lt;/strong&gt; referencing the &lt;strong&gt;Customers&lt;/strong&gt; table. The RDBMS enforces referential integrity, ensuring that every order is associated with a valid customer.&lt;/p&gt;

&lt;p&gt;You can execute a SQL query like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;Customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Customers&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;Customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name   | Item
--------|-------
Alice  | Laptop
Bob    | Phone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;DBMS vs. RDBMS: Feature Comparison&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;DBMS&lt;/th&gt;
&lt;th&gt;RDBMS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Files (flat, hierarchical, network)&lt;/td&gt;
&lt;td&gt;Tabular format (tables/relations)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Relationships&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Fully supported using keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Integrity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual enforcement&lt;/td&gt;
&lt;td&gt;Enforced via constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-user Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited or absent&lt;/td&gt;
&lt;td&gt;Fully supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Query Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proprietary or minimal&lt;/td&gt;
&lt;td&gt;SQL (Structured Query Language)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Full ACID compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Advanced (roles, privileges, encryption)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low (for small systems)&lt;/td&gt;
&lt;td&gt;High (suitable for enterprise-level apps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MS Access, dBase, FoxPro&lt;/td&gt;
&lt;td&gt;MySQL, PostgreSQL, Oracle, SQL Server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;When to Use DBMS or RDBMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Use &lt;strong&gt;DBMS&lt;/strong&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developing &lt;strong&gt;simple or personal applications&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Handling &lt;strong&gt;small datasets&lt;/strong&gt; without complex relationships&lt;/li&gt;
&lt;li&gt;Building &lt;strong&gt;standalone systems&lt;/strong&gt; without multi-user requirements&lt;/li&gt;
&lt;li&gt;Minimal security or transaction handling is acceptable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Use &lt;strong&gt;RDBMS&lt;/strong&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Building &lt;strong&gt;complex applications&lt;/strong&gt; that require &lt;strong&gt;data relationships&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Managing &lt;strong&gt;large volumes of data&lt;/strong&gt; with high integrity&lt;/li&gt;
&lt;li&gt;Supporting &lt;strong&gt;multiple concurrent users&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Requiring &lt;strong&gt;complex querying&lt;/strong&gt;, &lt;strong&gt;reporting&lt;/strong&gt;, and &lt;strong&gt;security&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Needing &lt;strong&gt;scalable and robust data systems&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While both DBMS and RDBMS are tools for managing data, &lt;strong&gt;RDBMS offers greater power, flexibility, and scalability&lt;/strong&gt;, making it the preferred choice for modern, multi-user, data-intensive applications. &lt;strong&gt;DBMS&lt;/strong&gt; still has relevance for lightweight, localized applications where relational features and advanced functionalities are not necessary.&lt;/p&gt;

&lt;p&gt;Understanding the distinctions between DBMS and RDBMS enables you to &lt;strong&gt;select the most appropriate solution&lt;/strong&gt; for your project, ensuring performance, reliability, and maintainability.&lt;/p&gt;

</description>
      <category>database</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Vue.js Composition API: My Learning Journey as a Beginner</title>
      <dc:creator>Md Mohosin Ali Shah</dc:creator>
      <pubDate>Mon, 21 Apr 2025 16:41:26 +0000</pubDate>
      <link>https://forem.com/mohosin2126/vuejs-composition-api-my-learning-journey-as-a-beginner-6nf</link>
      <guid>https://forem.com/mohosin2126/vuejs-composition-api-my-learning-journey-as-a-beginner-6nf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gcwir563fr88vrrslz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gcwir563fr88vrrslz9.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;br&gt;
As someone new to Vue.js, I've been on an exciting journey learning the Composition API. In this article, I want to share what I've discovered so far to help fellow beginners who are also interested in mastering this powerful frontend framework. Everything I'm sharing comes from my own learning process and notes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I Chose to Learn Vue's Composition API
&lt;/h2&gt;

&lt;p&gt;When I started exploring Vue.js, I discovered there are two ways to build components: the Options API (the traditional approach) and the Composition API (introduced in Vue 3). As a beginner, I decided to focus on the Composition API because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It lets me organize code by logical concerns rather than option types&lt;/li&gt;
&lt;li&gt;It makes reusing logic between components much easier&lt;/li&gt;
&lt;li&gt;It provides better TypeScript support (which I plan to learn later)&lt;/li&gt;
&lt;li&gt;It's the future direction of Vue&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Key Concepts I've Mastered So Far
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Reactive State Management
&lt;/h3&gt;

&lt;p&gt;The foundation of Vue is its reactivity system. I learned there are two primary ways to create reactive state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reactive&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Using ref for primitive values&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// Access/modify with .value&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// Access/modify with .value&lt;/span&gt;

&lt;span class="c1"&gt;// Using reactive for objects&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;reactive&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;preferences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;  &lt;span class="c1"&gt;// Access/modify directly (user.name, user.preferences.theme)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important difference I discovered is that with &lt;code&gt;ref&lt;/code&gt;, you need to use &lt;code&gt;.value&lt;/code&gt; to access or change the value in JavaScript code, but not in templates where Vue automatically "unwraps" refs. With &lt;code&gt;reactive&lt;/code&gt;, you access properties directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conditional Rendering
&lt;/h3&gt;

&lt;p&gt;Vue makes showing and hiding content based on conditions remarkably straightforward:&lt;/p&gt;

&lt;h4&gt;
  
  
  v-if / v-else-if / v-else
&lt;/h4&gt;

&lt;p&gt;This completely adds or removes elements from the DOM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"status === 'active'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Active Status&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-else-if=&lt;/span&gt;&lt;span class="s"&gt;"status === 'inactive'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Inactive Status&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-else&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Unknown Status&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  v-show
&lt;/h4&gt;

&lt;p&gt;This toggled visibility using CSS display property (element remains in DOM):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-show=&lt;/span&gt;&lt;span class="s"&gt;"isVisible"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This content toggles visibility&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I found that &lt;code&gt;v-if&lt;/code&gt; is better when the condition changes infrequently since removing/adding DOM elements is more expensive than toggling visibility with &lt;code&gt;v-show&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Component Lifecycle Hooks
&lt;/h3&gt;

&lt;p&gt;Understanding when things happen in my components was crucial. The Composition API provides these hooks as functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;onBeforeMount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onBeforeUpdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onUpdated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onBeforeUnmount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onUnmounted&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Setup happens when component initializes (like "created" in Options API)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Setup is running first&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;onBeforeMount&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Right before DOM rendering&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;About to mount - DOM not ready yet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Component mounted - DOM is ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Perfect place for:&lt;/span&gt;
  &lt;span class="c1"&gt;// - API calls&lt;/span&gt;
  &lt;span class="c1"&gt;// - DOM manipulation&lt;/span&gt;
  &lt;span class="c1"&gt;// - Setting up timers/intervals&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Clean up when component is destroyed&lt;/span&gt;
  &lt;span class="nf"&gt;onBeforeUnmount&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&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;onBeforeUpdate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Called when data changes, before DOM updates&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Data changed, DOM update pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;onUpdated&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// After the DOM has updated&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DOM has been re-rendered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;onUnmounted&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Component is completely destroyed&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Component is gone from DOM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Learning about these hooks helped me understand the perfect timing for different operations in my components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Computed Properties and Watchers
&lt;/h2&gt;

&lt;p&gt;As I progressed, I realized the power of derived state and reactions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Computed Properties
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Doe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Automatically updates when dependencies change&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Usage:&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// "John Doe"&lt;/span&gt;

&lt;span class="c1"&gt;// If we update firstName...&lt;/span&gt;
&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// ...fullName automatically becomes "Jane Doe"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Watchers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watchEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="c1"&gt;// Watch specific value with callback&lt;/span&gt;
&lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchSearchResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&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="c1"&gt;// watchEffect runs immediately and tracks dependencies automatically&lt;/span&gt;
&lt;span class="nf"&gt;watchEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Current query: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;// This runs immediately and again whenever searchQuery changes&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Data Fetching Patterns
&lt;/h2&gt;

&lt;p&gt;A common task I needed to learn was fetching data from an API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onMounted&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;onMounted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I discovered that this pattern could be extracted into a reusable function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// useFetch.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watchEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;unref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;
        &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;
        &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Re-fetch when URL changes if it's reactive&lt;/span&gt;
    &lt;span class="nf"&gt;watchEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Otherwise, just fetch once&lt;/span&gt;
    &lt;span class="nf"&gt;fetchData&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage in component:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern of creating "composables" (reusable functions with reactive state) is one of my favorite aspects of the Composition API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Form Handling
&lt;/h2&gt;

&lt;p&gt;Working with forms is a common task in web development. Here's how I learned to implement a basic form with validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;submitted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validateForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Name is required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email is required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="sr"&gt;+@&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.\S&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email is invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;submitForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;validateForm&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Submit form data...&lt;/span&gt;
    &lt;span class="nx"&gt;submitted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;In the template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;submit.prevent=&lt;/span&gt;&lt;span class="s"&gt;"submitForm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"formData.name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"errors.name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ errors.name }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"formData.email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"errors.email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ errors.email }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Message&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"formData.message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My Learning Experience
&lt;/h2&gt;

&lt;p&gt;As a beginner, I found certain aspects of Vue challenging at first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remembering when to use &lt;code&gt;.value&lt;/code&gt; with refs (in JS code, but not in templates)&lt;/li&gt;
&lt;li&gt;Understanding the difference between &lt;code&gt;reactive&lt;/code&gt; and &lt;code&gt;ref&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Determining when to create a composable vs. just using local functions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What helped me most was building small practice components before attempting more complex features. I started with a simple counter, then added more reactivity, and gradually incorporated lifecycle hooks and data fetching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Vue Directives I Use Daily
&lt;/h2&gt;

&lt;p&gt;Here's a quick reference to the Vue directives I use most often:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directive&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v-model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Two-way binding for forms&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;input v-model="name"&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;v-on&lt;/code&gt; or &lt;code&gt;@&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Event handling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;button @click="increment"&amp;gt;+&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;v-bind&lt;/code&gt; or &lt;code&gt;:&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Bind attributes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;img :src="imgUrl"&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v-if/v-else&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conditional rendering&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;p v-if="isLoggedIn"&amp;gt;Welcome&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v-for&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List rendering&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;li v-for="item in items" :key="item.id"&amp;gt;{{ item }}&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v-show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Toggle visibility&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;div v-show="isVisible"&amp;gt;Toggle me&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What's Next on My Learning Path
&lt;/h2&gt;

&lt;p&gt;Now that I've grasped the fundamentals, I'm excited to learn more about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State management with Pinia (Vue's recommended state management solution)&lt;/li&gt;
&lt;li&gt;Vue Router for building multi-page applications&lt;/li&gt;
&lt;li&gt;Advanced component patterns and communication&lt;/li&gt;
&lt;li&gt;Unit testing Vue components&lt;/li&gt;
&lt;li&gt;Performance optimization techniques&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources for Fellow Beginners
&lt;/h2&gt;

&lt;p&gt;If you're also learning Vue.js, I've documented my journey with more detailed examples in my GitHub repository: &lt;a href="https://github.com/mohosin2126/vuejs-learning.git" rel="noopener noreferrer"&gt;https://github.com/mohosin2126/vuejs-learning.git&lt;/a&gt;. Feel free to check it out for more comprehensive examples and notes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Learning Vue.js and its Composition API has been an exciting journey so far. As a beginner, I appreciate how Vue balances power and simplicity. The Composition API might seem a bit more complex at first compared to the Options API, but the flexibility and reusability it offers are well worth the initial learning curve.&lt;/p&gt;

&lt;p&gt;Are you also learning Vue.js? What parts have you found most challenging or interesting? I'd love to hear about your experience in the comments!&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>vue</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
