<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BabaCreates]]></title><description><![CDATA[BabaCreates]]></description><link>https://blogs.babacreates.in</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1769096915134/7832fbcc-fbcb-47bb-8fab-0df013f4b88a.png</url><title>BabaCreates</title><link>https://blogs.babacreates.in</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 01:26:41 GMT</lastBuildDate><atom:link href="https://blogs.babacreates.in/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Best Website Developer in Ranchi? Here’s What Actually Matters Before You Hire One]]></title><description><![CDATA[Let’s be honest for a second.
Most businesses in Ranchi don’t need a website.They need a system that brings them customers.
But what they usually get is:

A slow website

A design that looks like it’s]]></description><link>https://blogs.babacreates.in/best-website-developer-in-ranchi</link><guid isPermaLink="true">https://blogs.babacreates.in/best-website-developer-in-ranchi</guid><category><![CDATA[Web Development]]></category><category><![CDATA[ranchi]]></category><category><![CDATA[web development agency in ranchi]]></category><category><![CDATA[Web Developer]]></category><category><![CDATA[web development agency]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Sat, 28 Mar 2026 14:26:44 GMT</pubDate><content:encoded><![CDATA[<p>Let’s be honest for a second.</p>
<p>Most businesses in Ranchi don’t <em>need</em> a website.<br />They need a system that brings them customers.</p>
<p>But what they usually get is:</p>
<ul>
<li><p>A slow website</p>
</li>
<li><p>A design that looks like it’s stuck in 2012</p>
</li>
<li><p>Zero leads</p>
</li>
<li><p>And a developer who disappears after delivery like a magician</p>
</li>
</ul>
<p>And then people say, “website se kuch hota nahi hai.”<br />Yeah… because you didn’t build a <em>real</em> one.</p>
<hr />
<h3>The Real Problem</h3>
<p>If you’re searching for the best website developer in Ranchi, you’re probably thinking: “Bas ek acchi looking website ban jaye.”</p>
<p>That’s the first mistake.</p>
<p>A website is not a poster.<br />It’s not a digital visiting card.<br />It’s your sales machine.</p>
<p>If it’s not:</p>
<ul>
<li><p>Bringing leads</p>
</li>
<li><p>Building trust</p>
</li>
<li><p>Showing your authority</p>
</li>
</ul>
<p>Then it’s just sitting there… looking pretty and doing nothing.</p>
<hr />
<h3>What You Actually Need</h3>
<p>A proper website should do 3 things:</p>
<h4>1. Convert Visitors into Customers</h4>
<p>Not just “About Us” and “Contact Us”.</p>
<p>It should guide people:</p>
<ul>
<li><p>What you do</p>
</li>
<li><p>Why they should trust you</p>
</li>
<li><p>What action they should take</p>
</li>
</ul>
<p>If someone lands on your site and leaves confused, that’s bad design. Period.</p>
<hr />
<h4>2. Load Fast (Because Nobody Waits)</h4>
<p>If your website takes more than 3 seconds to load, people leave.</p>
<p>Not maybe. Not sometimes.<br />They leave.</p>
<p>We build sites that are:</p>
<ul>
<li><p>Optimized for speed</p>
</li>
<li><p>Lightweight</p>
</li>
<li><p>Built using modern frameworks</p>
</li>
</ul>
<p>Because speed = money.</p>
<hr />
<h4>3. Work Like a Business Tool</h4>
<p>A good website should:</p>
<ul>
<li><p>Capture leads</p>
</li>
<li><p>Integrate with WhatsApp / forms</p>
</li>
<li><p>Track user behavior</p>
</li>
<li><p>Help you scale</p>
</li>
</ul>
<p>Otherwise, why did you even build it?</p>
<hr />
<h3>🛠️ What We Do at Zarasana</h3>
<p>At zarasana.com, we don’t just “make websites”.</p>
<p>We build digital systems for businesses.</p>
<p>That includes:</p>
<ul>
<li><p>Custom website development (no templates nonsense)</p>
</li>
<li><p>Performance-focused builds</p>
</li>
<li><p>Clean UI/UX that actually converts</p>
</li>
<li><p>SEO-ready structure from day one</p>
</li>
<li><p>Scalable backend systems</p>
</li>
</ul>
<p>Basically, we build things that don’t embarrass you in front of your customers.</p>
<hr />
<h3>Who Is This For?</h3>
<p>If you’re:</p>
<ul>
<li><p>A local business in Ranchi trying to grow online</p>
</li>
<li><p>A startup that wants to look legit</p>
</li>
<li><p>A service provider tired of depending only on referrals</p>
</li>
</ul>
<p>Then yes, you need a proper website.</p>
<p>If you just want “₹5,000 wali site”, this is <strong>not</strong> for you.<br />There are plenty of people who will happily ruin your online presence for that price.</p>
<hr />
<h3>Why Businesses Are Finally Taking Websites Seriously</h3>
<p>Things have changed.</p>
<p>People don’t:</p>
<ul>
<li><p>Trust random Instagram pages</p>
</li>
<li><p>Call unknown numbers blindly</p>
</li>
</ul>
<p>They check:</p>
<ul>
<li><p>Your website</p>
</li>
<li><p>Your credibility</p>
</li>
<li><p>Your presence</p>
</li>
</ul>
<p>No website = No trust.</p>
<p>Simple.</p>
<hr />
<h3>Why “Best Website Developer in Ranchi” Even Matters</h3>
<p>Because hiring the wrong developer costs you:</p>
<ul>
<li><p>Time</p>
</li>
<li><p>Money</p>
</li>
<li><p>Lost opportunities</p>
</li>
</ul>
<p>A good developer doesn’t just code.<br />They understand:</p>
<ul>
<li><p>Business</p>
</li>
<li><p>User psychology</p>
</li>
<li><p>Conversion</p>
</li>
</ul>
<p>That’s the difference.</p>
<hr />
<h3>Conclusion</h3>
<p>A website is not an expense.<br />It’s an asset.</p>
<p>If built right, it works for you 24/7.<br />If built wrong, it just sits there… judging you silently.</p>
<p>So next time you search for the best website developer in Ranchi, don’t just look at designs.</p>
<p>Look at:</p>
<ul>
<li><p>Results</p>
</li>
<li><p>Thinking</p>
</li>
<li><p>Execution</p>
</li>
</ul>
<p>That’s what actually grows your business.</p>
<hr />
<p>If you’re serious about building something that actually brings results,<br />check out &amp; book a call: <a href="https://zarasana.com">https://zarasana.com</a></p>
]]></content:encoded></item><item><title><![CDATA[Stop Using AI Widgets: How I Built a Human-in-the-loop Chatbot]]></title><description><![CDATA[You know exactly the kind of chatbot I’m talking about.
You land on a portfolio, the little bubble pops up with a stock sound effect, and you’re greeted by "Support Agent #4" asking for your email before you’ve even read the hero section. It’s not a ...]]></description><link>https://blogs.babacreates.in/stop-using-ai-widgets-how-i-built-a-human-in-the-loop-chatbot</link><guid isPermaLink="true">https://blogs.babacreates.in/stop-using-ai-widgets-how-i-built-a-human-in-the-loop-chatbot</guid><category><![CDATA[Next.js]]></category><category><![CDATA[System Design]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[telegram bot]]></category><category><![CDATA[Redis]]></category><category><![CDATA[serverless]]></category><category><![CDATA[portfolio]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Sat, 07 Feb 2026 17:36:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1770485623966/a7213498-c95c-4363-ac40-8df8df0a72fd.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You know exactly the kind of chatbot I’m talking about.</p>
<p>You land on a portfolio, the little bubble pops up with a stock sound effect, and you’re greeted by "Support Agent #4" asking for your email before you’ve even read the hero section. It’s not a conversation; it’s a lead magnet dressed up as a human.</p>
<p>I didn’t want that.</p>
<p>I didn’t want a third-party script slowing down my First Contentful Paint, and I definitely didn’t want to pay $29/month for a SaaS tool to talk to the three people who visit my site daily.</p>
<p>I wanted a <strong>human-in-the-loop</strong> system. User types on website → I get a ping on Telegram → I reply → User sees it on the site.</p>
<p>No dashboards. No "we'll get back to you." Just me, replying while I’m out trekking or debugging code.</p>
<p>Here is why I built a custom, "dumb" architecture using <strong>Next.js, Redis, and Telegram</strong>, and why it works better than the "smart" solutions the market tries to sell you.  </p>
<p>Must tryout live : <a target="_blank" href="https://babacreates.in/">https://babacreates.in/</a></p>
<hr />
<h2 id="heading-the-requirement-arbitrage">The Requirement Arbitrage</h2>
<p>In engineering, we often grab the "industry standard" tool without asking if we actually have an "industry standard" problem.</p>
<p>The market builds chatbots for <strong>scale</strong>. Intercom, Drift, and Zendesk are designed for teams of 50 agents handling 10,000 concurrent users. They <em>need</em> WebSockets. They <em>need</em> complex ticket routing. They <em>need</em> heavy client-side JavaScript bundles to manage state.</p>
<p><strong>I am not a corporation.</strong> I am one guy with a Next.js portfolio.</p>
<p>This creates a massive gap, a requirement arbitrage. The market solves for complexity I don't have. By rejecting their constraints (scale, multiple agents, 24/7 uptime), I can build something drastically simpler, lighter, and faster.</p>
<p>I don’t need a system that scales to millions. I need a system that scales to <em>me</em>.</p>
<hr />
<h2 id="heading-the-stack-why-telegram">The Stack: Why Telegram?</h2>
<p>Most devs build a custom admin panel for their portfolio. They spend three weeks building a dashboard with auth, database tables, and a UI to view messages.</p>
<p>That’s pure procrastination.</p>
<p>I realized I already have a high-performance, push-notification-enabled, zero-latency admin panel in my pocket: <strong>Telegram</strong>.</p>
<p>By using the Telegram Bot API, I offload the entire "admin" UI.</p>
<ul>
<li><p><strong>Notification system?</strong> Built-in.</p>
</li>
<li><p><strong>Mobile app?</strong> Native and fast.</p>
</li>
<li><p><strong>Media support?</strong> Done.</p>
</li>
</ul>
<p>My "backend" isn't a dashboard I have to log into; it's a chat thread I’m already looking at.</p>
<hr />
<h2 id="heading-the-controversial-choice-polling-gt-websockets">The "Controversial" Choice: Polling &gt; WebSockets</h2>
<p>If I posted this code on Twitter/X, someone would immediately comment: <em>"Bro, why didn't you use</em> <a target="_blank" href="http://Socket.io"><em>Socket.io</em></a><em>? Polling is so 2010."</em></p>
<p>And they’d be wrong.</p>
<p>WebSockets are great, but they require a persistent connection. On a serverless environment like Vercel (Next.js), maintaining a persistent WebSocket connection is a headache. You usually have to spin up a separate Node server or pay for a managed WebSocket service.</p>
<p>For a portfolio? That’s overkill.</p>
<p>I used <strong>Short Polling</strong>. The frontend simply asks the API: <em>"Hey, any new messages?"</em> every few seconds.</p>
<ul>
<li><p><strong>It’s stateless:</strong> Perfect for serverless functions.</p>
</li>
<li><p><strong>It’s cheap:</strong> I’m not paying for idle connections.</p>
</li>
<li><p><strong>It’s robust:</strong> If the user’s network flakily drops and reconnects, polling just works.</p>
</li>
</ul>
<hr />
<h2 id="heading-how-it-actually-works">How It actually works</h2>
<p>The flow is stupidly simple, which is why it’s resilient.</p>
<ol>
<li><p><strong>User sends message:</strong> Next.js API route catches it.</p>
</li>
<li><p><strong>Storage:</strong> Saved to Redis (Upstash) with a TTL (Time To Live). Conversations auto-delete after a month. No database clutter.</p>
</li>
<li><p><strong>Forwarding:</strong> The API hits the Telegram endpoint.</p>
</li>
<li><p><strong>My Phone Buzzes:</strong> I see the message. I reply: <em>"Yeah, I'm free for freelance work next month."</em></p>
</li>
<li><p><strong>The Webhook:</strong> Telegram hits my API with my reply.</p>
</li>
<li><p><strong>The Loop:</strong> My API saves my reply to Redis. The frontend polls it.</p>
</li>
</ol>
<p>The user sees my reply appear on their screen. They don't know it traveled through a Russian messaging app and a serverless Redis instance. They just know I replied fast.</p>
<hr />
<h2 id="heading-design-engineering">Design Engineering</h2>
<p>This wasn't just a backend project. As a design engineer, the feel mattered.</p>
<p>I used <strong>Motion</strong> for the UI. The chat widget doesn't aggressively pop up; it rests in the corner. When you open it, it expands with a spring animation, not a linear CSS transition.</p>
<p>I even added a cool notification sound. Instead of a generic beep, I found a soft, organic "pop" sound. It’s subtle. It feels premium.</p>
<p>These details matter. A portfolio isn't just a showcase of your code; it's a showcase of your <strong>taste</strong>.</p>
<hr />
<h2 id="heading-tldr">TLDR;</h2>
<p>Most portfolios scream, "Look at my tech stack!" This chatbot quietly says, "I solve problems efficiently."</p>
<p>It’s not AI. It’s not a sales funnel. It’s just a direct line to me, built on the principle that the best code is usually the code you <em>didn't</em> have to write.</p>
<p>If you’re building a portfolio, stop over-engineering the things that don't matter so you can focus on the things that do. And sometimes, that means using polling instead of WebSockets.  </p>
<p>Checkout mine : <a target="_blank" href="https://babacreates.in/">https://babacreates.in/</a></p>
]]></content:encoded></item><item><title><![CDATA[Design Sense in the Age of AI Vibe Coders]]></title><description><![CDATA[We’re living in this era of so called AI builders.
You open an editor, type a prompt, and suddenly you have a landing page. Components, spacing, colors, even microcopy. The machine nods politely and says, “Anything else?”
This is the age of AI vibe c...]]></description><link>https://blogs.babacreates.in/design-sense-in-the-age-of-ai-vibe-coders</link><guid isPermaLink="true">https://blogs.babacreates.in/design-sense-in-the-age-of-ai-vibe-coders</guid><category><![CDATA[Design sense]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[Design]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Thu, 05 Feb 2026 09:42:37 GMT</pubDate><content:encoded><![CDATA[<p>We’re living in this era of so called AI builders.</p>
<p>You open an editor, type a prompt, and suddenly you have a landing page. Components, spacing, colors, even microcopy. The machine nods politely and says, “Anything else?”</p>
<p>This is the age of AI vibe coding.</p>
<p>And don’t get me wrong, it’s powerful. It removes friction. It lowers the barrier to entry. It helps people ship.</p>
<p>But it also creates a problem.</p>
<p>When everyone can build, <strong>building stops being impressive</strong>.</p>
<p>What starts to matter is something quieter and harder to fake.</p>
<p><strong><em>Design sense.</em></strong></p>
<p><strong><em>Taste.</em></strong></p>
<p><strong><em>Judgment.</em></strong></p>
<p>That subtle ability to look at a UI and feel that something is wrong before you can explain why.</p>
<hr />
<h2 id="heading-design-sense-is-not-aesthetics">Design sense is not aesthetics</h2>
<p>Let’s clear this up early.</p>
<p>Design sense is not about pretty colors or knowing the latest Figma trick.</p>
<p>It’s about <strong>decisions</strong>.</p>
<p>Knowing:</p>
<ul>
<li><p>When to stop adding</p>
</li>
<li><p>When simplicity is confidence, not laziness</p>
</li>
<li><p>When a UI feels heavy even if it technically works</p>
</li>
<li><p>Why some products feel calm and others feel exhausting</p>
</li>
</ul>
<p>Design sense is less about <em>what you add</em> and more about <em>what you refuse to add</em>.</p>
<p>It’s <strong>not visual flair</strong>. It’s <strong>restraint</strong>.</p>
<hr />
<h2 id="heading-why-ai-cant-give-you-taste">Why AI can’t give you taste</h2>
<p>AI is excellent at execution.</p>
<p>Tell it what you want and it will happily comply. Button here. Animation there. Gradient, shadow, rounded corners. No complaints.</p>
<p>But taste doesn’t start with execution.</p>
<p>Taste starts with a question:</p>
<blockquote>
<p>“Should this exist at all?”</p>
</blockquote>
<p>That question is human.</p>
<p>Two developers can use the same AI tool, same framework, same design system. One ships something forgettable. The other ships something people trust within seconds.</p>
<p>The difference is not intelligence.</p>
<p>It’s <strong>exposure, judgment,</strong> and lived <strong>observation.</strong></p>
<hr />
<h2 id="heading-taste-is-borrowed-before-it-becomes-yours">Taste is borrowed before it becomes yours</h2>
<p>There’s a comforting myth we like to believe.</p>
<p>That originality comes from nowhere.</p>
<p>In reality, <strong>nothing is original</strong>. Not your favorite product. Not your favorite design. <strong>Not even your opinions.</strong></p>
<p>Everything is a remix of things seen, felt, used, and absorbed.</p>
<p>This is where ideas from <em>Steal Like an Artist</em> quietly apply to design sense.</p>
<p>The goal isn’t copying blindly.</p>
<p>The goal is taking inspiration <strong>with awareness</strong>.</p>
<p>When you know where something comes from, why it works, and in what context it was created, you’re no longer stealing. You’re learning.</p>
<p>Over time, those influences blend together. Your preferences sharpen. Your dislikes become clearer. Your eye develops.</p>
<p><strong>That’s how taste forms.</strong></p>
<hr />
<h2 id="heading-what-you-consume-is-shaping-you-whether-you-like-it-or-not">What you consume is shaping you (whether you like it or not)</h2>
<p>This part is uncomfortable, but necessary.</p>
<p>Your design sense is being trained every day.</p>
<p>Not by courses. Not by tutorials.</p>
<p>By what you consume.</p>
<p>The apps you use. The websites you scroll. The films you watch. The writing you read.</p>
<p>If your daily diet is rushed UI, loud visuals, and cluttered experiences, that becomes your baseline.</p>
<p>If you consistently observe well-crafted products, calm interfaces, thoughtful interactions, your standards rise naturally.</p>
<p><strong>Taste is a side effect of attention.</strong></p>
<hr />
<h2 id="heading-frontend-engineers-with-browser-fundamentals-see-differently">Frontend engineers with browser fundamentals see differently</h2>
<p>Here’s where things get interesting.</p>
<p>Design sense alone makes you visually aware.</p>
<p>Design sense plus an understanding of browser behavior makes you genuinely effective.</p>
<p>When you understand:</p>
<ul>
<li><p>How layout shifts break trust</p>
</li>
<li><p>Why slow interactions feel disrespectful</p>
</li>
<li><p>How reflows, paints, and composites affect perception</p>
</li>
<li><p>Why accessibility is UX, not charity</p>
</li>
</ul>
<p>You stop designing for screenshots.</p>
<p>You start designing for real humans on real devices.</p>
<p>Your UI doesn’t just look good.</p>
<p>It feels <strong>stable. Predictable. Considerate.</strong></p>
<p>That feeling is design sense translated into engineering.</p>
<hr />
<h2 id="heading-how-taste-actually-develops-no-mystery-involved">How taste actually develops (no mystery involved)</h2>
<p>There’s no shortcut here, which is probably why this skill is rare.</p>
<p>The process is simple, but not easy.</p>
<p>You:</p>
<ol>
<li><p>Consume a lot</p>
</li>
<li><p>Copy &amp; develop consciously</p>
</li>
<li><p>Observe patterns</p>
</li>
<li><p>Ask why things work</p>
</li>
<li><p>Form opinions</p>
</li>
<li><p>Refine judgment</p>
</li>
</ol>
<p>At some point, you stop asking:</p>
<blockquote>
<p>“Is this good design?”</p>
</blockquote>
<p>And start thinking:</p>
<blockquote>
<p>“This works for this user, in this moment, for this reason.”</p>
</blockquote>
<p>That shift is everything.</p>
<hr />
<h2 id="heading-a-small-real-world-example">A small real-world example</h2>
<p>Early-stage developers often think design means adding.</p>
<p>More animations. More micro-interacitons. More visual noise.</p>
<p>Experienced frontend engineers think design means clarity.</p>
<p>What’s the primary action? What can be removed? Where does attention naturally go?</p>
<p>Same tools. Different taste.</p>
<hr />
<h2 id="heading-ux-is-psychology-wearing-pixels">UX is psychology wearing pixels</h2>
<p>Good UX isn’t aesthetic theory.</p>
<p>It’s human behavior.</p>
<p>It’s about:</p>
<ul>
<li><p>Reducing cognitive load</p>
</li>
<li><p>Respecting habits</p>
</li>
<li><p>Guiding attention gently</p>
</li>
<li><p>Avoiding unnecessary surprises</p>
</li>
</ul>
<p>You don’t learn this from Dribbble.</p>
<p>You learn it by watching people struggle. By noticing hesitation. By seeing frustration build over tiny delays.</p>
<p>Taste grows through empathy.</p>
<hr />
<h2 id="heading-standing-out-in-the-ai-age">Standing out in the AI age</h2>
<p>In a world where AI can generate UI instantly, the rare skill is discernment.</p>
<p>If you want to stand out as a frontend engineer:</p>
<ul>
<li><p>Learn design fundamentals, not just tools</p>
</li>
<li><p>Understand browsers, not just frameworks</p>
</li>
<li><p>Consume high-quality work intentionally</p>
</li>
<li><p>Build opinions slowly and honestly</p>
</li>
<li><p>Treat frontend as a product discipline</p>
</li>
</ul>
<p>Anyone can ship UI.</p>
<p>Very few can ship UI with taste, consistency, and care.</p>
<hr />
<h2 id="heading-tldr">TLDR;</h2>
<p>You are not born with taste.</p>
<p><strong>You collect it. You borrow it. You remix it.</strong></p>
<p>Over time, it becomes yours.</p>
<p>In an age where almost anything can be built automatically, the real advantage is knowing <strong>what deserves to be built</strong>.</p>
<p>That’s design sense. ✌🏼</p>
]]></content:encoded></item><item><title><![CDATA[The Code is the Easy Part: 5 Ways to Actually Get Clients in the AI Era]]></title><description><![CDATA[Let’s be real for a second. We are officially in the era of "Vibe Coders" all around. You can prompt an LLM to spin up a Next.js dashboard in 30 seconds. The barrier to entry for building software has crashed through the floor.
This is definitely ter...]]></description><link>https://blogs.babacreates.in/agency-lead-generation-strategies-ai-era</link><guid isPermaLink="true">https://blogs.babacreates.in/agency-lead-generation-strategies-ai-era</guid><category><![CDATA[Freelancing]]></category><category><![CDATA[business]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[marketing]]></category><category><![CDATA[career advice]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Tue, 27 Jan 2026 07:11:05 GMT</pubDate><content:encoded><![CDATA[<p>Let’s be real for a second. We are officially in the era of "Vibe Coders" all around. You can prompt an LLM to spin up a Next.js dashboard in 30 seconds. The barrier to entry for building software has crashed through the floor.</p>
<p>This is definitely terrifying if you identify solely as a "coder." But I feel it’s an incredible opportunity if you start identifying as a <strong>Founder</strong>.</p>
<p>In 2026, the technical implementation is a commodity. The real skill, the one that actually pays the bills, is <strong>distribution</strong>. You can have the cleanest architecture in the world, but if nobody knows you exist, you’re just a hobbyist with an expensive GitHub Copilot subscription.</p>
<p>Here is how to stop playing "pretend business" and actually fill your pipeline.</p>
<h3 id="heading-1-your-website-is-a-funnel-not-an-art-gallery">1. Your Website is a Funnel, Not an Art Gallery</h3>
<p>We all love a good Framer Motion animation, but does it pay the rent?</p>
<p>Developers have a bad habit of treating their agency sites like tech demos. You don’t need to impress other developers; you need to convert clients who don't know what a <code>div</code> is.</p>
<ul>
<li><p><strong>The Reality Check:</strong> If a user lands on your site and has to hunt for the "Contact" button, you’ve already lost.</p>
</li>
<li><p><strong>The Fix:</strong> Simplify the UI. Kill the cryptic navigation. Your Call-to-Action (CTA) should be offensively obvious. If it feels like you're selling too hard, you're probably doing it right.</p>
</li>
</ul>
<h3 id="heading-2-content-marketing-stop-posting-ai-slop">2. Content Marketing: Stop Posting "AI Slop"</h3>
<p>We can all tell when you let ChatGPT write your LinkedIn posts. It sounds robotic, hollow, and boring.</p>
<p>To win leads now, you need to prove you have a pulse and a brain.</p>
<ul>
<li><p><strong>The Reality Check:</strong> Generic "5 Tips for SEO" posts are dead. The internet is flooded with them.</p>
</li>
<li><p><strong>The Fix:</strong> Write about <strong>pain</strong>. What specific problem keeps your client awake at night? Did you fix a massive database migration disaster? Write about that. Did you save a client $10k with an automation script? Write about that. Opinions and war stories build trust; generic advice builds nothing.</p>
</li>
</ul>
<h3 id="heading-3-seo-the-boring-stuff-that-actually-works">3. SEO: The Boring Stuff That Actually Works</h3>
<p>I know, SEO isn't "vibey." It doesn't give you the dopamine hit of a viral tweet. But it is the highest-ROI activity you can do.</p>
<ul>
<li><p><strong>The Reality Check:</strong> People are literally typing "web agency in my city" into Google right now. If you aren't there, your competitor is taking that cash.</p>
</li>
<li><p><strong>The Fix:</strong> Stop trying to rank for global terms like "Best Web Dev." You won't win. Go local. Optimize your Google My Business profile. Dominate the search results for your specific niche or city. It’s low-hanging fruit, so grab it.</p>
</li>
</ul>
<h3 id="heading-4-paid-ads-spend-money-to-make-money">4. Paid Ads: Spend Money to Make Money</h3>
<p>Organic growth is great, but it’s slow. If you want to speedrun agency growth, you have to pay the toll.</p>
<ul>
<li><p><strong>The Reality Check:</strong> Being "scared" to spend $100 on ads is a junior mindset. A founder looks at Unit Economics: if I spend $100 to get a lead worth $5,000, I will do that trade until the bank stops me.</p>
</li>
<li><p><strong>The Fix:</strong> Target decision-makers on LinkedIn or Instagram. Don't target "Everyone." Target "Marketing Directors in the Healthcare space." Be specific, test your creatives, and kill the ads that burn money.</p>
</li>
</ul>
<h3 id="heading-5-email-nurturing-the-professional-slide">5. Email Nurturing: The "Professional Slide"</h3>
<p>Most clients aren't ready to buy the second they meet you. They’re "just looking."</p>
<ul>
<li><p><strong>The Reality Check:</strong> If you don't get their email, they will leave your site and forget you existed in approximately 4 minutes.</p>
</li>
<li><p><strong>The Fix:</strong> Get them on a list. Send them something actually useful, a checklist, a free audit, a case study. Then, email them once a week. Be the helpful expert in their inbox, so when they <em>are</em> finally ready to buy six months from now, you’re the only name they remember.</p>
</li>
</ul>
<hr />
<p><strong>The Bottom Line:</strong> The days of "build it and they will come" are over. The code is cheap. The design is accessible. The <strong>business logic</strong> and the <strong>relationship</strong> are the premium products now.</p>
<p>Stop obsessing over your tech stack and start obsessing over your customers. That’s how you survive the AI shift.</p>
]]></content:encoded></item><item><title><![CDATA[From Messy to Maintainable: SOLID Principles in JavaScript, React, and Node.js]]></title><description><![CDATA[In this age of AI vibe coder, everyone's a "Senior Engineer" until npm run build fails and the terminal starts screaming in red text.
We get it. ChatGPT wrote 80% of your codebase. Copilot is your co-founder. But here’s the tea: AI is great at genera...]]></description><link>https://blogs.babacreates.in/from-messy-to-maintainable-solid-principles-in-javascript-react-and-nodejs</link><guid isPermaLink="true">https://blogs.babacreates.in/from-messy-to-maintainable-solid-principles-in-javascript-react-and-nodejs</guid><category><![CDATA[clean code]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[SOLID principles]]></category><category><![CDATA[React]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Tue, 27 Jan 2026 06:47:02 GMT</pubDate><content:encoded><![CDATA[<p>In this age of AI vibe coder, everyone's a "Senior Engineer" until <code>npm run build</code> fails and the terminal starts screaming in red text.</p>
<p>We get it. ChatGPT wrote 80% of your codebase. Copilot is your co-founder. But here’s the tea: AI is great at generating code, but it is <strong>terrible</strong> at architecture. It will happily hand you a monolithic <code>app.ts</code> file that looks like a bowl of overly sauced spaghetti.</p>
<p>If you want your React/Node app to survive past the MVP stage without needing a full rewrite (RIP), you need principles like <strong>SOLID</strong>. It’s not just boomer tech wisdom; it’s the difference between a codebase that "slaps" and one that gets you roasted in the code review.</p>
<p>Let’s break it down, TypeScript style.</p>
<hr />
<h3 id="heading-s-single-responsibility-principle-srp">S — Single Responsibility Principle (SRP)</h3>
<p><strong>The Vibe:</strong> "You're doing too much."</p>
<p>A function or component should do <strong>one thing</strong> and do it well. If your React component is fetching data, validating forms, managing 4 <code>useEffect</code> hooks, and rendering the UI... it’s cooked.</p>
<p><strong>The "Mid" Way (React Anti-Pattern):</strong> You have a <code>Dashboard.tsx</code> that is 400 lines long. It fetches users, filters them, handles the loading spinner, and renders the list.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// 🚩 Red Flag: Why is this component doing everything?</span>
<span class="hljs-keyword">const</span> Dashboard = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> [users, setUsers] = useState([]);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    fetch(<span class="hljs-string">'/api/users'</span>).then(...) <span class="hljs-comment">// Fetching logic? inside UI? </span>
  }, []);

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
       {/* 100 lines of JSX */}
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}
</code></pre>
<p><strong>The "W" Way (Separation of Concerns):</strong> Split that messy breakup into two peaceful co-parents: <strong>Logic</strong> (Hooks) and <strong>Looks</strong> (UI).</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// 1. The Brains (Custom Hook)</span>
<span class="hljs-keyword">const</span> useUsers = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-comment">// All the messy fetch/state logic lives here</span>
  <span class="hljs-keyword">return</span> useQuery({ <span class="hljs-attr">queryKey</span>: [<span class="hljs-string">'users'</span>], <span class="hljs-attr">queryFn</span>: fetchUsers });
}

<span class="hljs-comment">// 2. The Beauty (UI Component)</span>
<span class="hljs-keyword">const</span> UserList = <span class="hljs-function">(<span class="hljs-params">{ users }: { users: User[] }</span>) =&gt;</span> {
  <span class="hljs-comment">// Pure UI. No logic. Just vibes.</span>
  <span class="hljs-keyword">return</span> users.map(<span class="hljs-function"><span class="hljs-params">u</span> =&gt;</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Card</span> <span class="hljs-attr">key</span>=<span class="hljs-string">{u.id}</span> <span class="hljs-attr">user</span>=<span class="hljs-string">{u}</span> /&gt;</span></span>);
}

<span class="hljs-comment">// 3. The Page</span>
<span class="hljs-keyword">const</span> Dashboard = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> { data } = useUsers();
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">UserList</span> <span class="hljs-attr">users</span>=<span class="hljs-string">{data}</span> /&gt;</span></span>;
}
</code></pre>
<p><strong>Why it hits:</strong> You can change the UI without breaking the data fetching. You can fix the API call without breaking the CSS. Peace of mind.</p>
<hr />
<h3 id="heading-o-openclosed-principle-ocp">O — Open/Closed Principle (OCP)</h3>
<p><strong>The Vibe:</strong> "New phone, who dis? (Don't change me, extend me)"</p>
<p>Your code should be <strong>Open for extension</strong>, but <strong>Closed for modification</strong>.</p>
<p>Basically, if your Product Manager asks for a new feature (e.g., "Add 'Gold' users!"), you shouldn't have to go into your existing, working code and start hacking away at <code>if/else</code> statements. That’s how bugs are born.</p>
<p><strong>The "L" Way (Node/Express):</strong> The dreaded <code>switch</code> statement of doom.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// 🚩 Every time we add a new role, we have to edit this file.</span>
<span class="hljs-keyword">const</span> calculateBonus = <span class="hljs-function">(<span class="hljs-params">role: string</span>) =&gt;</span> {
  <span class="hljs-keyword">if</span> (role === <span class="hljs-string">'admin'</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">1000</span>;
  <span class="hljs-keyword">if</span> (role === <span class="hljs-string">'manager'</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">500</span>;
  <span class="hljs-keyword">if</span> (role === <span class="hljs-string">'intern'</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">-100</span>; <span class="hljs-comment">// minimal wage lol</span>
  <span class="hljs-comment">// Adding 'super-admin'? Gotta edit this file. Risky.</span>
}
</code></pre>
<p><strong>The "Glow Up" (Object Maps / Strategy Pattern):</strong> Use an object map or a class strategy.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// ✅ Logic is separated.</span>
<span class="hljs-keyword">const</span> bonusStrategies: Record&lt;string, number&gt; = {
  <span class="hljs-attr">admin</span>: <span class="hljs-number">1000</span>,
  <span class="hljs-attr">manager</span>: <span class="hljs-number">500</span>,
  <span class="hljs-attr">intern</span>: <span class="hljs-number">0</span>,
};

<span class="hljs-keyword">const</span> calculateBonus = <span class="hljs-function">(<span class="hljs-params">role: string</span>) =&gt;</span> {
  <span class="hljs-keyword">return</span> bonusStrategies[role] || <span class="hljs-number">0</span>;
}

<span class="hljs-comment">// Want to add a new role?</span>
<span class="hljs-comment">// Just extend the object config. The function logic stays untouched.</span>
bonusStrategies[<span class="hljs-string">'super-admin'</span>] = <span class="hljs-number">9000</span>;
</code></pre>
<hr />
<h3 id="heading-l-liskov-substitution-principle-lsp">L — Liskov Substitution Principle (LSP)</h3>
<p><strong>The Vibe:</strong> "Don't catfosh me."</p>
<p>If something looks like a Duck (a specific Type/Interface), it better quack like a Duck. If you swap a parent class with a child class, the app shouldn't crash.</p>
<p><strong>The "Sus" Way (React/TS):</strong> You make a <code>CoolButton</code> that extends the normal HTML <code>Button</code>, but you decide to break the rules.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// 🚩 This breaks the expectation of a button</span>
interface Props <span class="hljs-keyword">extends</span> React.ButtonHTMLAttributes&lt;HTMLButtonElement&gt; {
  <span class="hljs-comment">// forcing a specific prop that native buttons don't have</span>
  <span class="hljs-attr">verificationCode</span>: string; 
}

<span class="hljs-keyword">const</span> CoolButton = <span class="hljs-function">(<span class="hljs-params">{ onClick, verificationCode, ...props }: Props</span>) =&gt;</span> {
  <span class="hljs-keyword">if</span> (!verificationCode) {
    <span class="hljs-comment">// 💥 IT CRASHES or does nothing if this specific prop is missing</span>
    <span class="hljs-comment">// A normal button wouldn't do this.</span>
    <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Bro where is the code??"</span>);
  }
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{onClick}</span> {<span class="hljs-attr">...props</span>} /&gt;</span></span>;
}
</code></pre>
<p><strong>The Fix:</strong> Ensure your custom component creates a predictable experience that matches the base type. If it <em>extends</em> Button, it should act like a Button.</p>
<hr />
<h3 id="heading-i-interface-segregation-principle-isp">I — Interface Segregation Principle (ISP)</h3>
<p><strong>The Vibe:</strong> "Don't be a stage 5 clinger."</p>
<p>Don't force a component (or function) to depend on data it doesn't need. Stop passing the entire <code>User</code> object when the component only needs the <code>firstName</code>.</p>
<p><strong>The "Messy" Way (TypeScript):</strong></p>
<pre><code class="lang-javascript">interface GOD_USER_OBJECT {
  <span class="hljs-attr">id</span>: string;
  name: string;
  email: string;
  passwordHash: string;
  socialSecurityNumber: string; <span class="hljs-comment">// 💀</span>
  grandmotherMaidenName: string;
}

<span class="hljs-comment">// 🚩 Why does the Navbar need the SSN??</span>
<span class="hljs-keyword">const</span> Navbar = <span class="hljs-function">(<span class="hljs-params">props: { user: GOD_USER_OBJECT }</span>) =&gt;</span> {
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span>Hello, {props.user.name}<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></span>;
}
</code></pre>
<p><strong>The "Clean" Way:</strong> Use TypeScript utility types like <code>Pick</code> or create smaller interfaces.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// ✅ Only ask for what you need</span>
type NavbarProps = Pick&lt;GOD_USER_OBJECT, <span class="hljs-string">'name'</span>&gt;;

<span class="hljs-keyword">const</span> Navbar = <span class="hljs-function">(<span class="hljs-params">{ name }: NavbarProps</span>) =&gt;</span> {
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span>Hello, {name}<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></span>;
}
</code></pre>
<p><strong>Why it hits:</strong> If the backend schema changes the <code>passwordHash</code> field, your Navbar won't break because it never cared about it in the first place.</p>
<hr />
<h3 id="heading-d-dependency-inversion-principle-dip">D — Dependency Inversion Principle (DIP)</h3>
<p><strong>The Vibe:</strong> "Don't catch feelings for low-level details."</p>
<p>High-level modules (your business logic) shouldn't depend on low-level modules (database connections, specific libraries). Both should depend on <strong>abstractions</strong> (interfaces).</p>
<p><strong>The "Toxic Relationship" (Node/Express):</strong> Hardcoding your database inside your controller.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { db } <span class="hljs-keyword">from</span> <span class="hljs-string">'./postgres-driver'</span>; <span class="hljs-comment">// 🚩 Hard dependency</span>

<span class="hljs-keyword">const</span> createPost = <span class="hljs-keyword">async</span> (title: string) =&gt; {
  <span class="hljs-comment">// If we switch to MongoDB tomorrow, we have to rewrite this ENTIRE function.</span>
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> db.query(<span class="hljs-string">`INSERT INTO posts...`</span>); 
}
</code></pre>
<p><strong>The "Independent" Way (Dependency Injection):</strong> Pass the DB capability <em>into</em> the function.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// 1. Define the Interface (The Contract)</span>
interface IPostRepository {
  save(post: Post): <span class="hljs-built_in">Promise</span>&lt;<span class="hljs-keyword">void</span>&gt;;
}

<span class="hljs-comment">// 2. The Logic (doesn't care if it's SQL or Mongo)</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostService</span> </span>{
  <span class="hljs-keyword">constructor</span>(private repo: IPostRepository) {}

  <span class="hljs-keyword">async</span> createPost(title: string) {
    <span class="hljs-comment">// logic...</span>
    <span class="hljs-keyword">await</span> <span class="hljs-built_in">this</span>.repo.save({ title });
  }
}

<span class="hljs-comment">// 3. Inject it at runtime</span>
<span class="hljs-keyword">const</span> service = <span class="hljs-keyword">new</span> PostService(<span class="hljs-keyword">new</span> PostgresRepo()); 
<span class="hljs-comment">// Switching to Mongo? </span>
<span class="hljs-comment">// const service = new PostService(new MongoRepo());</span>
</code></pre>
<hr />
<h3 id="heading-tldr">TL;DR</h3>
<ol>
<li><p><strong>SRP:</strong> Don't be a hero. Do one thing.</p>
</li>
<li><p><strong>OCP:</strong> Extend, don't edit.</p>
</li>
<li><p><strong>LSP:</strong> Don't break the contract.</p>
</li>
<li><p><strong>ISP:</strong> Stop over-sharing data.</p>
</li>
<li><p><strong>DIP:</strong> Depend on interfaces, not implementations.</p>
</li>
</ol>
<p>Write clean code so your future self doesn't have to decipher what kind of caffeine-induced mania you were in when you wrote that <code>utils.ts</code> file. ✌️</p>
]]></content:encoded></item><item><title><![CDATA[Your Service Page Gives "AI Slop" Vibes (Let's Fix That)]]></title><description><![CDATA[Let’s be real for a sec. You could be the GOAT of your industry, but if your service page reads like you copy-pasted a prompt into ChatGPT and called it a day, people are gonna clock it immediately.
We are past the era of complex coding; it’s all abo...]]></description><link>https://blogs.babacreates.in/your-service-page-gives-ai-slop-vibes-lets-fix-that</link><guid isPermaLink="true">https://blogs.babacreates.in/your-service-page-gives-ai-slop-vibes-lets-fix-that</guid><category><![CDATA[SEO]]></category><category><![CDATA[landing page]]></category><category><![CDATA[services]]></category><category><![CDATA[marketing]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Tue, 27 Jan 2026 06:19:54 GMT</pubDate><content:encoded><![CDATA[<p>Let’s be real for a sec. You could be the GOAT of your industry, but if your service page reads like you copy-pasted a prompt into ChatGPT and called it a day, people are gonna clock it immediately.</p>
<p>We are past the era of complex coding; <strong>it’s all about taste now.</strong> Humans have developed a sixth sense for low-effort, robotic content. If your page lacks soul and feels like "AI slop," you’re fumbling the bag.</p>
<p>Let me give you the no-nonsense guide to crafting service pages that actually convert.</p>
<hr />
<h3 id="heading-1-the-headline-stop-sounding-like-a-bot">1. The Headline: Stop sounding like a Bot</h3>
<p>If a user lands on your page and reads a sentence that sounds like a thesaurus exploded, they know you didn't write it.</p>
<p>Avoid the "We leverage synergistic paradigms for optimal output" jargon. That’s an immediate ick. It screams "I have no taste." Be human.</p>
<ul>
<li><p><strong>The AI Flop:</strong> "Unlocking potential through digital innovation." (Generic. Boring. Robot.)</p>
</li>
<li><p><strong>The Human Flex:</strong> "We Build Shopify Stores That Scale to 7-Figures." (Okay, slay.)</p>
</li>
</ul>
<blockquote>
<p><strong>The Rule:</strong> Clarity &gt; Fancy Words. Always.</p>
</blockquote>
<h3 id="heading-2-call-out-your-main-character-the-audience">2. Call Out Your "Main Character" (The Audience)</h3>
<p>AI tries to please everyone. You need to have an opinion.</p>
<p>Explicitly state who this service is for—and who it <em>isn't</em> for. That’s how you show you have actual taste and standards.</p>
<ul>
<li><p><strong>Say this:</strong> "Perfect for SaaS founders ready to scale."</p>
</li>
<li><p><strong>Not this:</strong> "For anyone with a pulse."</p>
</li>
</ul>
<p>This saves you from hopping on discovery calls with people who have zero budget and toxic energy. Protect your peace.</p>
<h3 id="heading-3-the-offer-no-gatekeeping">3. The Offer: No Gatekeeping</h3>
<p>Don't hide what's included. People have trust issues because the internet is full of scams and vaporware.</p>
<p>Use bullet points (we love a skimmable moment) to break down exactly what they get.</p>
<ul>
<li><p><strong>Strategy Sessions</strong></p>
</li>
<li><p><strong>3 Design Revisions</strong></p>
</li>
<li><p><strong>Full Tech Setup</strong></p>
</li>
</ul>
<p>Make the value so obvious that they feel like they’re robbing you.</p>
<h3 id="heading-4-show-the-receipts-social-proof">4. Show the Receipts (Social Proof)</h3>
<p>You can say you’re the best, but... pics or it didn't happen.</p>
<p>Since anyone can generate fake text now, <strong>real</strong> social proof is the ultimate currency. If you don't have testimonials, case studies, or logos of cool brands, you look sus.</p>
<ul>
<li><p><strong>Testimonials:</strong> Use real screenshots if possible. Authentic screenshots &gt; Polished text quotes.</p>
</li>
<li><p><strong>Data:</strong> "Increased revenue by 40%" hits different than "We did a good job."</p>
</li>
</ul>
<h3 id="heading-5-the-process-show-them-youre-not-hallucinating">5. The Process: Show Them You’re Not Hallucinating</h3>
<p>Clients are terrified of getting ghosted or having a project that looks nothing like the vision. Show them your workflow to prove a human is at the wheel.</p>
<p>Keep it simple (3-4 steps max):</p>
<ol>
<li><p><strong>The Vibe Check (Discovery)</strong></p>
</li>
<li><p><strong>The Build (Execution)</strong></p>
</li>
<li><p><strong>The Launch (Results)</strong></p>
</li>
</ol>
<p>This shows competence. It tells them, "Relax, I’ve done this a thousand times. I got you."</p>
<h3 id="heading-6-address-the-red-flags-faq-section">6. Address the Red Flags (FAQ Section)</h3>
<p>Your potential client has objections. They are thinking: <em>Is this just a wrapper for an AI tool? Is it too expensive?</em></p>
<p>Don't wait for them to ask. Create a "Frequently Asked Questions" section that crushes those doubts before they even form. It shows high emotional intelligence.</p>
<h3 id="heading-7-the-cta-secure-the-bag">7. The CTA: Secure the Bag</h3>
<p>Don't make them hunt for the button. Your "Call to Action" needs to be loud, proud, and specific.</p>
<ul>
<li><p><strong>Weak:</strong> "Submit." (Boring.)</p>
</li>
<li><p><strong>Strong:</strong> "Book Your Free Strategy Call." (Yes, let's go.)</p>
</li>
<li><p><strong>Placement:</strong> Put it at the top, the middle, and the bottom. Do not let them leave without seeing it.</p>
</li>
</ul>
<hr />
<h3 id="heading-tldr-summary">TL;DR Summary</h3>
<ol>
<li><p><strong>Headline:</strong> Be specific, don't sound like a generic LLM.</p>
</li>
<li><p><strong>Audience:</strong> Curate your clients; don't accept just anyone.</p>
</li>
<li><p><strong>Deliverables:</strong> List exactly what they get.</p>
</li>
<li><p><strong>Receipts:</strong> Show real proof (screenshots over text).</p>
</li>
<li><p><strong>Process:</strong> Show them the roadmap.</p>
</li>
<li><p><strong>CTA:</strong> Make it easy for them to pay you.</p>
</li>
</ol>
<p>Now go fix your pages. <strong>Taste is the new skill set.</strong> You got this. ✨</p>
]]></content:encoded></item><item><title><![CDATA[I Fired My Database: Why I Moved From "Custom Everything" to a Headless CMS + Next.js]]></title><description><![CDATA[There is a toxic trait that all full-stack developers share: The urge to build everything from scratch.
When I started BabaCreates I didn’t want a "basic" website. I wanted to flex. I built the whole thing using: Next.js frontend, PostgreSQL, Prisma ...]]></description><link>https://blogs.babacreates.in/i-fired-my-database-why-i-moved-from-custom-everything-to-a-headless-cms-nextjs</link><guid isPermaLink="true">https://blogs.babacreates.in/i-fired-my-database-why-i-moved-from-custom-everything-to-a-headless-cms-nextjs</guid><category><![CDATA[Next.js + Sanity]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[Sanity ]]></category><category><![CDATA[portfoliowebsite]]></category><dc:creator><![CDATA[Anmol]]></dc:creator><pubDate>Thu, 22 Jan 2026 16:09:37 GMT</pubDate><content:encoded><![CDATA[<p>There is a toxic trait that all full-stack developers share: <strong>The urge to build <em>everything</em> from scratch.</strong></p>
<p>When I started <a target="_blank" href="https://babacreates.in">BabaCreates</a> I didn’t want a "basic" website. I wanted to flex. I built the whole thing using: Next.js frontend, PostgreSQL, Prisma ORM, and a custom-coded Admin Dashboard.</p>
<p>It worked. It was fast. And it was a <strong>complete pain in the neck</strong> to use.</p>
<p>If I wanted to fix a typo in a blog post, I had to log into a dashboard that looked like it was designed by a prompt engineer (because it was 🥲, I used AI in hurry). If I wanted to add a new "Project" category, I had to run database migrations. I was spending more time pushing code than actually creating content.</p>
<p>I realized I needed something like simple already made CMS which can handle my posts and project and content mangement. But which one?</p>
<h2 id="heading-the-bachelor-phase-dating-different-cms-options">The "Bachelor" Phase: Dating Different CMS Options</h2>
<p>Well I didn't just pick the first tool I saw. I looked around, and honestly, most options had deal-breakers.</p>
<h3 id="heading-1-strapi-the-heavyweight">1. Strapi (The Heavyweight)</h3>
<p>Strapi is cool. It’s open-source and customizable. But hosting it? That’s a whole different job. I’d have to manage a separate server, deal with deployments, and worry about uptime. I want to write blogs, not babysit Docker containers.</p>
<h3 id="heading-2-notion-the-almost-perfect">2. Notion (The "Almost" Perfect)</h3>
<p>I love Notion. I organize my whole life in it. Naturally, I thought about using the Notion API as my backend. <strong>The catch:</strong> Rendering Notion content on a custom Next.js site is... messy. You have to parse their specific block structure, and if you want it to look like <em>your</em> design (and not just a Notion clone), it takes a lot of effort. Plus, querying it for a high-performance site felt clunky.</p>
<h3 id="heading-3-wordpress">3. Wordpress</h3>
<p>Lol. No 🤣</p>
<h2 id="heading-enter-sanity-the-lazy-developers-choice">Enter Sanity: The "Lazy" Developer's Choice</h2>
<p>I landed on <a target="_blank" href="http://Sanity.io"><strong>Sanity.io</strong></a>.</p>
<p>I’m not saying it’s the holy grail of software, but for my use case, a developer who wants a custom frontend but hates managing a CMS for this small thing, it was the sweet spot.</p>
<p>It’s a <strong>Headless CMS</strong>. This means they handle the database and the dashboard, and they just give me an API to fetch my data.</p>
<p><strong>Why it won me over:</strong></p>
<ol>
<li><p><strong>I didn't lose my frontend.</strong> I kept my Next.js app exactly as it was. I didn't have to use some generic template. My site still looks cool and modern because <em>I</em> coded the frontend.</p>
</li>
<li><p><strong>Schema-as-Code.</strong> This is the killer feature. I don't click around a UI to create fields. I write a Javascript object, and Sanity generates the dashboard form for me.</p>
</li>
</ol>
<h2 id="heading-the-migration-how-hard-was-it">The Migration: How Hard Was It?</h2>
<p>Surprisingly easy. I basically deleted my <code>prisma</code> folder and replaced it with a <code>sanity</code> folder.</p>
<h3 id="heading-step-1-defining-the-model">Step 1: Defining the Model</h3>
<p>Instead of writing SQL migrations, I just told Sanity what a "Project" looks like in code:</p>
<p>JavaScrip<a target="_blank" href="https://babacreates.in">t</a></p>
<pre><code class="lang-javascript"><span class="hljs-comment">// project.js</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> {
  <span class="hljs-attr">name</span>: <span class="hljs-string">'project'</span>,
  <span class="hljs-attr">title</span>: <span class="hljs-string">'Project'</span>,
  <span class="hljs-attr">type</span>: <span class="hljs-string">'document'</span>,
  <span class="hljs-attr">fields</span>: [
    { <span class="hljs-attr">name</span>: <span class="hljs-string">'title'</span>, <span class="hljs-attr">type</span>: <span class="hljs-string">'string'</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Project Name'</span> },
    { <span class="hljs-attr">name</span>: <span class="hljs-string">'slug'</span>, <span class="hljs-attr">type</span>: <span class="hljs-string">'slug'</span>, <span class="hljs-attr">options</span>: { <span class="hljs-attr">source</span>: <span class="hljs-string">'title'</span> } },
    { <span class="hljs-attr">name</span>: <span class="hljs-string">'techStack'</span>, <span class="hljs-attr">type</span>: <span class="hljs-string">'array'</span>, <span class="hljs-attr">of</span>: [{ <span class="hljs-attr">type</span>: <span class="hljs-string">'string'</span> }] },
    { <span class="hljs-attr">name</span>: <span class="hljs-string">'content'</span>, <span class="hljs-attr">type</span>: <span class="hljs-string">'array'</span>, <span class="hljs-attr">of</span>: [{ <span class="hljs-attr">type</span>: <span class="hljs-string">'block'</span> }] } <span class="hljs-comment">// Rich text editor!</span>
  ]
}
</code></pre>
<p>Boom💥. Sanity instantly generated a UI where I could type in my project details, upload images, and format text. No manual form validation required.</p>
<h3 id="heading-step-2-fetching-the-data">Step 2: Fetching the Data</h3>
<p>Since I know JavaScript, learning their query language (GROQ) took about 15 minutes. It’s actually cleaner than my old Prisma queries.</p>
<p><strong>Old Way (Prisma):</strong></p>
<p>JavaScript</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> projects = <span class="hljs-keyword">await</span> prisma.project.findMany({
  <span class="hljs-attr">where</span>: { <span class="hljs-attr">featured</span>: <span class="hljs-literal">true</span> },
  <span class="hljs-attr">select</span>: { <span class="hljs-attr">title</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">slug</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">image</span>: <span class="hljs-literal">true</span> }
});
<span class="hljs-comment">// Then I had to manually serialize dates because Next.js hates Date objects</span>
</code></pre>
<p><strong>New Way (Sanity):</strong></p>
<p>JavaScript</p>
<pre><code class="lang-bash">const projects = await client.fetch(
  `*[_type == <span class="hljs-string">"project"</span> &amp;&amp; featured == <span class="hljs-literal">true</span>]{
    title,
    <span class="hljs-string">"slug"</span>: slug.current,
    <span class="hljs-string">"imageUrl"</span>: image.asset-&gt;url
  }`
);
</code></pre>
<h2 id="heading-the-verdict">The Verdict</h2>
<p>My portfolio is now a "mullet" setup: <strong>Business in the back, Party in the front.</strong></p>
<ul>
<li><p><strong>The Back:</strong> A boring, reliable, managed CMS (Sanity) that I don't have to maintain.</p>
</li>
<li><p><strong>The Front:</strong> A high-performance, completely custom Next.js application that looks exactly how I want it to.</p>
</li>
</ul>
<p>I get proper SEO (because Next.js renders everything server-side), I get a nice dashboard to write my blogs, and I deleted about 2,000 lines of boilerplate code from my repo.</p>
<p>I feel, If you’re sitting there maintaining a custom SQL database for a personal blog with 10 posts... stop it. Go get a headless CMS and get back to actually building cool stuff.  </p>
<p>Fin.✌🏼</p>
]]></content:encoded></item></channel></rss>