<?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[Amplitude - An Engineer's Newsletter]]></title><description><![CDATA[Welcome to Amplitude, this is a journal and weblog for a busy engineer. This is where I put my Development Journals, Programming logs and general thought about ]]></description><link>https://blog.srthk.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1591329774550/eOaZgBj2o.png</url><title>Amplitude - An Engineer&apos;s Newsletter</title><link>https://blog.srthk.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 19:03:38 GMT</lastBuildDate><atom:link href="https://blog.srthk.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Hell hath no fury like a software engineer scorned.]]></title><description><![CDATA[AI has been moving at the speed of light. What's regular now was rocket science a mere 6 months ago. Some 20 months ago, I was on X which was popping off about this popular indie developer who had made an AI startup which acted like a mental health c...]]></description><link>https://blog.srthk.com/hell-hath-no-fury-like-a-software-engineer-scorned</link><guid isPermaLink="true">https://blog.srthk.com/hell-hath-no-fury-like-a-software-engineer-scorned</guid><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Mon, 17 Nov 2025 04:17:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/OvLXbURo9Wo/upload/713a7ecc986f2594a35efe84c4e54f8e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>AI has been moving at the speed of light. What's regular now was rocket science a mere 6 months ago. Some 20 months ago, I was on X which was popping off about this popular indie developer who had made an AI startup which acted like a mental health counsellor for people in need. It was a paid service and was being marketed as a cheaper alternative to mental health services.</p>
<p>The discourse was... heated, to say the least.</p>
<p>On one side, people rightfully pointed out that calling something "TherapistAI" when therapy is a licensed, regulated profession requiring years of specialized training was, at best, misleading. At worst? Potentially exploitative of vulnerable people who might genuinely need professional help but couldn't afford it.</p>
<p>On the other side, the tech optimists argued that the creator had put in time and effort, built something functional, and deserved to be compensated like any other product builder. Fair point, honestly.</p>
<p>Me? I sat somewhere in the middle, but leaning skeptical. The whole thing felt a bit grifty—marketing to people in need with promises a chatbot fundamentally couldn't deliver. But I'll admit, I was also curious. <strong>How hard could it actually be to build something like this?</strong></p>
<p>Turns out: not hard at all.</p>
<p>And that's how <a target="_blank" href="http://www.GrifterAI.com">www.GrifterAI.com</a> was born over a single weekend. Yes, the name was intentional. Yes, I'm aware of the irony.</p>
<hr />
<h2 id="heading-the-36-hour-sprint">The 36-Hour Sprint</h2>
<p>I started on a Saturday morning with a simple goal: build a functional AI life coach that people could actually use, and do it fast enough to prove this wasn't some revolutionary technical achievement worthy of the hype it was getting.</p>
<p>The clock was ticking. I gave myself the weekend.</p>
<h3 id="heading-finding-the-right-model">Finding the Right Model</h3>
<p>The first step was finding and deploying the right large language model. I turned to <strong>Google's Model Garden</strong> and <strong>Vertex AI</strong>—honestly one of the better decisions I made. Model Garden gave me access to a variety of pre-trained models, and after some experimentation, I settled on <strong>Llama 70B</strong>.</p>
<p>Here's some context: at the time, Llama 70B was <em>the</em> largest open-source model available. It was the bleeding edge. If you wanted something more powerful, you were looking at proprietary models with hefty API costs or academic research models that were a nightmare to deploy.</p>
<p>Fast forward to today? The landscape is unrecognizable. We've got Llama 3.1 405B, Mistral models at various sizes, Qwen, Phi, Gemma, Claude, GPT-4—an absolutely dizzying array of options at every scale and specialization. Back then, the choice was simpler because there simply weren't that many options. You picked Llama 70B and you were working with the best open-source had to offer.</p>
<p>It really drives home just how fast AI has been moving. What was cutting-edge 20 months ago is now just... normal. Entry-level, even.</p>
<p>Vertex AI made the deployment process surprisingly smooth. Within a few hours, I had the model spun up and accessible via an API. The real work, though, was in the fine-tuning.</p>
<h3 id="heading-fine-tuning-for-the-use-case">Fine-Tuning for the Use Case</h3>
<p>Out of the box, large language models are generalists. They're great at answering questions about medieval history or debugging Python, but for something like life coaching—where tone, empathy, and conversational flow matter—you need to fine-tune.</p>
<p>I spent a good chunk of Saturday afternoon curating a dataset from Kaggle and running fine-tuning jobs. The goal was to make the model sound less like a corporate FAQ bot and more like someone you'd actually want to talk to when you're having a rough day. Empathetic but not patronizing. Thoughtful but not preachy.</p>
<h3 id="heading-securing-the-inference-api">Securing the Inference API</h3>
<p>When you're running a 70B model on cloud infrastructure, inference isn't cheap. The last thing I wanted was some random person stumbling onto my API endpoint and racking up thousands in GPU costs.</p>
<p>I used Google's built-in security protocols as a baseline, locking down incoming requests to just my IP. But I didn't stop there, I built additional custom security layers on top; Token-based authentication, rate limiting, request validation. If you somehow got the API endpoint, you still weren't getting through without the right credentials.</p>
<p>GPUs are expensive, and I wasn't about to fund someone else's experimentation.</p>
<hr />
<h2 id="heading-architecture-why-telegram">Architecture: Why Telegram?</h2>
<p>By Sunday morning, I had a working model and a secure API. Now I needed to make it accessible to users. This is where most people would start building a fancy web app with React, authentication flows, responsive design, the whole nine yards.</p>
<p>I went a different route: <strong>Telegram</strong>.</p>
<h3 id="heading-the-case-for-telegram">The Case for Telegram</h3>
<p>Telegram has over 900 million active users. Many people already have it installed and already know how to use it. There's zero friction to getting started: click a link, send a message, done.</p>
<p>Compare that to building a standalone web app where users need to:</p>
<ul>
<li><p>Create an account</p>
</li>
<li><p>Verify their email</p>
</li>
<li><p>Remember yet another password</p>
</li>
<li><p>Navigate a new interface</p>
</li>
<li><p>Probably download a mobile app if they want it on their phone</p>
</li>
</ul>
<p>Telegram eliminated all of that. It's unobtrusive, familiar, and just works. Plus, the Telegram Bot API is incredibly well-documented and easy to integrate.</p>
<p>So I built <a target="_blank" href="http://www.GrifterAI.com">www.GrifterAI.com</a> as an entry point—clean landing page, quick explanation—but it redirects straight to the Telegram bot. The website exists for discovery and SEO; the actual experience lives in Telegram.</p>
<h3 id="heading-the-technical-stack">The Technical Stack</h3>
<p>For the backend, I used <strong>Node.js</strong> to handle the Telegram Bot API integration. Node's async nature made it perfect for managing multiple concurrent conversations and API calls to Vertex AI for inference.</p>
<p>For the database, I went with <strong>SQLite</strong>: Was it scalable at enterprise scales? Eh. Not like I cared, tbh - for a project at this scale, SQLite is <em>fast</em>. No network latency, no connection pooling headaches, no overhead from running a separate database server. It's a single file, it's blazingly quick for reads and writes, and it was exactly what I needed. I would love to be in a position where I would have to worry about database scaling. For now, this worked.</p>
<p>The flow was simple:</p>
<ol>
<li><p>User sends a message via Telegram</p>
</li>
<li><p>Node backend receives the message via webhook</p>
</li>
<li><p>Backend sends the full context to Vertex AI inference API</p>
</li>
<li><p>Model generates a response</p>
</li>
<li><p>Backend sends response back to user via Telegram</p>
</li>
</ol>
<p>Clean. Efficient. Worked like a charm.</p>
<h3 id="heading-the-marketing-advantage">The Marketing Advantage</h3>
<p>Here's the underrated part: by using Telegram, I completely offloaded user acquisition and marketing. Telegram has built-in virality—users can share bots with a single tap, add them to groups, forward messages.</p>
<p>This meant I could focus on what I actually enjoy: the technical side. Model performance, API optimization, security hardening, conversation quality. Let Telegram handle the rest.</p>
<hr />
<h2 id="heading-the-hardest-part-spoiler-it-wasnt-the-tech">The Hardest Part (Spoiler: It Wasn't the Tech)</h2>
<p>You know what took the longest? Coming up with a name.</p>
<p>I'm not joking. The technical implementation—deploying a 70B model, fine-tuning it, building a Telegram bot, securing an API—took about 36 hours of focused work. Naming it? That was at least 3 of those hours.</p>
<p>Finally, I landed on <strong>GrifterAI</strong>. It was cheeky, self-aware, and perfectly captured the spirit of the project: calling out the grift by becoming the grift. The domain was available. Done.</p>
<hr />
<h2 id="heading-the-reality-check-economics-of-ai">The Reality Check: Economics of AI</h2>
<p>I launched GrifterAI with a simple plan: offer the first 5 messages free, then redirect people to my socials for more. The idea was to give people a taste, build an audience, figure out monetization later.</p>
<p>That lasted exactly one day.</p>
<p>Running a 70B model isn't like hosting a static website for $5/month. Every single inference call costs real money. Fine-tuning? Even more expensive. GPU time on Vertex AI adds up <em>fast</em>, and I quickly realized that "free tier + audience building" wasn't sustainable unless I wanted to hemorrhage money.</p>
<p>So I made GrifterAI paid-only. Still haven't figured out payment processing yet (Stripe integration is on my TODO list, lmao), but the principle stands: if you're running infrastructure this expensive, you need a revenue model that isn't "hope people like me enough to donate.". Eventually, with no want to market it or profit off of it, I shut the inference down cuz the deployment costs were piling up.</p>
<hr />
<h2 id="heading-why-im-posting-this-now-and-why-i-didnt-before">Why I'm Posting This Now (And Why I Didn't Before)</h2>
<p>Here's the thing: I actually wrote a LinkedIn post about all of this when I first built GrifterAI. Got all fired up, drafted the whole thing, added screenshots, the works. It's still sitting in my LinkedIn drafts, unpublished.</p>
<p>Why didn't I post it? A couple of reasons.</p>
<p>First, dunking on someone, even someone whose business model I found questionable didn't feel like a positive use of my energy. Yeah, I built the thing to prove a point, but publicly calling someone out? That's just adding negativity to the internet, and we have enough of that already.</p>
<p>Second, and honestly more importantly, I didn't want to contribute to the AI noise. If you've been on LinkedIn in the past year, you know what I'm talking about. Everyone and their dog was posting about AI. "10 ways ChatGPT will revolutionize your workflow!" "AI is coming for your job!" "I used AI to write this post about AI!" Most of it was just recycled takes and copy-pasta content that added nothing to the conversation.</p>
<p>The signal-to-noise ratio around AI was already terrible, and I didn't want to make it worse. I decided I'd only post when I had something genuinely useful to share—actual learnings, technical insights, something that moved the conversation forward instead of just adding to the echo chamber.</p>
<p>Look, I'm not interested in playing the algorithm game or chasing engagement metrics. I share things because they matter to me—deep dives into software architecture, interesting problems in distributed systems, what it's actually like working as an engineer. This blog exists as much as a personal archive as it does for anyone else. Years from now, I want to be able to look back and remember how I solved this problem or what I was thinking about at this point in my career. If other people find it useful along the way, that's a bonus.</p>
<p>So why now? Because I do have something to share. Real technical implementation details. Honest reflections on what worked and what didn't. Lessons about infrastructure costs, architecture decisions, and the actual barriers (or lack thereof) to building AI products. And yeah, as social proof that I actually built the thing and learned from it.</p>
<p>This isn't a hot take or a thought leadership piece. It's just documentation of a weekend project and what came out of it. That felt worth sharing.</p>
<hr />
<h2 id="heading-what-i-learned">What I Learned</h2>
<p>This whole project reinforced something I've long suspected: <strong>the technical barrier to entry for AI products is lower than ever</strong>. What once required a PhD and a research lab can now be done by a single developer over a weekend with the right tools.</p>
<p>That's both exciting and a little terrifying.</p>
<p><strong>On the technical side</strong>, I learned a ton about:</p>
<ul>
<li><p>Large language model deployment and fine-tuning at scale</p>
</li>
<li><p>Managing inference costs and API security</p>
</li>
<li><p>Real-time conversational AI architecture</p>
</li>
<li><p>The trade-offs between different deployment platforms</p>
</li>
</ul>
<p><strong>On the product side</strong>, I learned that sometimes the best UX decision is to <em>not</em> build a custom interface. Telegram's ubiquity and simplicity beat a bespoke web app for reach and accessibility.</p>
<p><strong>On the ethical side?</strong> Look, I still think marketing an AI as a replacement for mental health services is sketchy. But I also gained a deeper appreciation for the infrastructure and thought that goes into building these things—even if I fundamentally disagree with how they're positioned.</p>
<hr />
<h2 id="heading-the-point">The Point</h2>
<p>So did I prove my point? Yeah, I think so.</p>
<p>Building an AI startup in 2025 isn't rocket science. The tools are accessible, the models are available, and the infrastructure exists. What separates a weekend project from a "real" startup isn't technical complexity—it's positioning, marketing, and ethics.</p>
<p>GrifterAI still exists at <a target="_blank" href="http://www.GrifterAI.com">www.GrifterAI.com</a> (well, it still has the link to Telegram too. Pop in and say Hi on the channel :P). It's functional, it works, and people have used it. I'm proud of the technical achievement, even if the whole thing started as a slightly petty "I could do that" moment.</p>
<p>Because honestly? Sometimes spite is the best motivator.</p>
<p>And if you ever find yourself thinking "that doesn't seem that hard"—try building it. You might surprise yourself.</p>
<hr />
<p><strong>TL;DR:</strong> Saw an overhyped AI startup on Twitter, built my own version in 36 hours using Google Vertex AI, Llama 70B , Telegram, and Node.js. Learned a lot about LLM deployment, API security, and the economics of running AI at scale. Named it GrifterAI because irony is delicious and I like to think I cooked.</p>
]]></content:encoded></item><item><title><![CDATA[Stop Wrestling with Relative Imports: Master Absolute Imports in React + TypeScript + Vite]]></title><description><![CDATA[Why Absolute Imports Matter
The difference is immediately clear.
Before (Relative Imports):
TypeScript
import Button from '../../../components/ui/Button'
import { useAuth } from '../../../../hooks/useAuth'
import logo from '../../assets/images/logo.s...]]></description><link>https://blog.srthk.com/stop-wrestling-with-relative-imports-master-absolute-imports-in-react-typescript-vite</link><guid isPermaLink="true">https://blog.srthk.com/stop-wrestling-with-relative-imports-master-absolute-imports-in-react-typescript-vite</guid><category><![CDATA[React]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[vite]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[clean code]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[absolute-path]]></category><category><![CDATA[absolute-import]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Thu, 31 Jul 2025 06:04:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753941647356/51d5b0b8-ee4e-49d3-b62b-7bd69b271d3a.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<h2 id="heading-why-absolute-imports-matter">Why Absolute Imports Matter</h2>
<p>The difference is immediately clear.</p>
<p><strong>Before (Relative Imports):</strong></p>
<p>TypeScript</p>
<pre><code class="lang-plaintext">import Button from '../../../components/ui/Button'
import { useAuth } from '../../../../hooks/useAuth'
import logo from '../../assets/images/logo.svg'
</code></pre>
<p><strong>After (Absolute Imports):</strong></p>
<p>TypeScript</p>
<pre><code class="lang-plaintext">import Button from '@/components/ui/Button'
import { useAuth } from '@/hooks/useAuth'
import logo from '@/assets/images/logo.svg'
</code></pre>
<h3 id="heading-benefits">Benefits</h3>
<ul>
<li><p><strong>No more path confusion</strong> when moving files.</p>
</li>
<li><p>Cleaner, more <strong>readable</strong> import statements.</p>
</li>
<li><p>Easier <strong>refactoring</strong> and file organization.</p>
</li>
<li><p><strong>Consistent</strong> imports across your entire project.</p>
</li>
</ul>
<hr />
<h2 id="heading-the-complete-setup">The Complete Setup</h2>
<p>To get absolute imports working, you need to tell both TypeScript (for type checking and autocompletion) and Vite (your bundler) how to resolve these new paths.</p>
<h3 id="heading-1-tsconfigjson">1. <code>tsconfig.json</code></h3>
<p>This is the root TypeScript config. We just need to ensure it references our other TypeScript configurations. The key settings for path aliases will go in <a target="_blank" href="http://tsconfig.app"><code>tsconfig.app</code></a><code>.json</code>.</p>
<p>JSON</p>
<pre><code class="lang-plaintext">{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ]
}
</code></pre>
<h3 id="heading-2-tsconfigapphttptsconfigappjson">2. <a target="_blank" href="http://tsconfig.app"><code>tsconfig.app</code></a><code>.json</code></h3>
<p>This file configures TypeScript for your application code. Here we define the <code>baseUrl</code> and <code>paths</code> so that TypeScript understands the <code>@</code> alias.</p>
<p>JSON</p>
<pre><code class="lang-plaintext">{
  "compilerOptions": {
    "composite": true,
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
    "target": "ES2022",
    "useDefineForClassFields": true,
    "lib": ["ES2022", "DOM", "DOM.Iterable"],
    "module": "ESNext",
    "skipLibCheck": true,

    /* Path Alias Configuration */
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    },

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "react-jsx",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["src"]
}
</code></pre>
<h3 id="heading-3-viteconfigts">3. <code>vite.config.ts</code></h3>
<p>Finally, update your Vite configuration to resolve the path aliases during the build and development process.</p>
<p>TypeScript</p>
<pre><code class="lang-plaintext">import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
    }
  }
})
</code></pre>
<hr />
<h2 id="heading-quick-setup-steps">Quick Setup Steps</h2>
<ol>
<li><p><strong>Install</strong> <code>@types/node</code> (required for using <code>path</code> and <code>__dirname</code> in <code>vite.config.ts</code>):</p>
<p> Bash</p>
<pre><code class="lang-plaintext"> npm install -D @types/node
</code></pre>
</li>
<li><p><strong>Copy the configurations</strong> above into your respective files (<code>tsconfig.json</code>, <a target="_blank" href="http://tsconfig.app"><code>tsconfig.app</code></a><code>.json</code>, and <code>vite.config.ts</code>).</p>
</li>
<li><p><strong>Restart your development server</strong>:</p>
<p> Bash</p>
<pre><code class="lang-plaintext"> npm run dev
</code></pre>
</li>
<li><p><strong>Restart the TypeScript server</strong> in your IDE (In VS Code: <code>Cmd + Shift + P</code> → "TypeScript: Restart TS Server").</p>
</li>
</ol>
<hr />
<h2 id="heading-usage-examples">Usage Examples</h2>
<p>Now you can use clean, absolute paths everywhere in your project.</p>
<p>TypeScript</p>
<pre><code class="lang-plaintext">// Components
import Header from '@/components/Header'
import Button from '@/components/ui/Button'

// Assets
import logo from '@/assets/logo.svg'
import heroImage from '@/assets/images/hero.jpg'

// Utils &amp; Hooks
import { formatDate } from '@/utils/date'
import { useAuth } from '@/hooks/useAuth'
</code></pre>
<hr />
<h2 id="heading-key-configuration-details">Key Configuration Details</h2>
<ul>
<li><p><code>"baseUrl": "."</code>: This tells the TypeScript compiler that the root for path resolution is the project's root directory (where <code>tsconfig.json</code> is located).</p>
</li>
<li><p><code>"@/*": ["src/*"]</code>: This is the path mapping. It tells TypeScript that any import starting with <code>@/</code> should be mapped to the <code>src/</code> directory.</p>
</li>
<li><p><code>path.resolve(__dirname, './src')</code>: This is used in <code>vite.config.ts</code> to create a reliable, absolute file path to your <code>src</code> directory, ensuring Vite can find the files correctly regardless of the operating system.</p>
</li>
</ul>
<p>Your imports are now cleaner, your code is more maintainable, and file reorganization is effortless. No more counting <code>../</code> levels!</p>
]]></content:encoded></item><item><title><![CDATA[Communicate effectively in a remote-first company.]]></title><description><![CDATA[Working remote offers so many advantages but one major disadvantage that comes with it is that it silos every individual employee. I've been working in a remote environment since 4 years now, and over the years, I've formed myself a way of communicat...]]></description><link>https://blog.srthk.com/communicate-effectively-in-a-remote-first-company</link><guid isPermaLink="true">https://blog.srthk.com/communicate-effectively-in-a-remote-first-company</guid><category><![CDATA[remote]]></category><category><![CDATA[remote work]]></category><category><![CDATA[communicate]]></category><category><![CDATA[communication skills]]></category><category><![CDATA[communication]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Wed, 05 Jun 2024 07:15:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/V5vqWC9gyEU/upload/b95e62d038c72ae8ca15360998343c99.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Working remote offers so many advantages but one major disadvantage that comes with it is that it silos every individual employee. I've been working in a remote environment since 4 years now, and over the years, I've formed myself a way of communication that works effectively. I'll summaries it here briefly:</p>
<ol>
<li><p><a target="_blank" href="https://nohello.net/en/">NoHello</a> : &lt;-- Click the link. Essentially, it says, when you message someone, do NOT just say hello and wait for the other person to respond. Instead, start with the message you wanna communicate already. I have made improvements on this formula. The way I send messages is</p>
<p> <strong>"Hi &lt;recipient&gt;, This is &lt;significance of message ie, urgent or important, or both&gt;, I need &lt;expected time in minutes to explain the task&gt; minutes of your time. It is because &lt;briefly explain the issue&gt;. Can we get on a call?"</strong></p>
</li>
<li><p>Over Communicate: No harm has ever come from telling your colleagues more than they need to know. A LOT of harm has come from not telling your colleagues what you <em>assume</em> they know already. All of this in an appropriate and relevant context of course. You're facing a problem and you're already solving it, drop a message to your reporting manager anyway. Your dog is getting his vaccine shots, probably refrain from telling your manager.</p>
</li>
<li><p>Pictures help: We are all children at heart 🤣. When describing a problem, attach relevant screenshots/pictures for better understanding. They will always fetch quicker results and less confusion.</p>
</li>
<li><p>Listicles: Nobody has the time to read a paragraph. Break relevant things down in a bullet/numbered list. This blog is an example.</p>
</li>
</ol>
<p>Over the many years that I have worked remotely, I've literally set the culture for high performing teams that have worked on products like Dream11 and Hotstar and this is the method of communication that has worked for me - I hope it works for you too.</p>
]]></content:encoded></item><item><title><![CDATA[Set an image saved locally as background with Tailwind in a NextJS project]]></title><description><![CDATA[Dear Diary,
Today, I acted like a total dumbfuck!
I just struggled 10 minutes to setup a locally saved image as a background in a NextJS component using tailwind.  
I am writing this so that if you're in the same position, you don't get frustrated as...]]></description><link>https://blog.srthk.com/set-an-image-saved-locally-as-background-with-tailwind-in-a-nextjs-project</link><guid isPermaLink="true">https://blog.srthk.com/set-an-image-saved-locally-as-background-with-tailwind-in-a-nextjs-project</guid><category><![CDATA[Next.js]]></category><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[Background Image]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Thu, 25 Apr 2024 08:14:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/0zmOsxwArPk/upload/9de6bc9571ec80902303d5f5b7d4464f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Dear Diary,</p>
<p>Today, I acted like a total dumbfuck!</p>
<p>I just struggled 10 minutes to setup a locally saved image as a background in a NextJS component using tailwind.  </p>
<p>I am writing this so that if you're in the same position, you don't get frustrated as I did.</p>
<pre><code class="lang-javascript">      #Component where you want to add the image
      #Save the image <span class="hljs-keyword">in</span> the nextjs public folder.

      &lt;div
        className={<span class="hljs-string">`h-screen bg-no-repeat bg-cover`</span>}
        style={{ <span class="hljs-attr">backgroundImage</span>: <span class="hljs-string">`url('/awesome-bg.png')`</span> }}
      &gt;
            Text inside the component
      &lt;/div&gt;
</code></pre>
<p>Remember to refer back to this if you forget again, you dumbfuck!</p>
]]></content:encoded></item><item><title><![CDATA[Modern tsconfig template  [2024]]]></title><description><![CDATA[In this blog, I am keeping a draft example of the modern tsconfig file that works for me in the projects that I am making.
{
  "compilerOptions": {
    "target": "ESNext",
    "experimentalDecorators": false,
    "module": "commonjs",
    "rootDir": ...]]></description><link>https://blog.srthk.com/modern-tsconfig-template-2024</link><guid isPermaLink="true">https://blog.srthk.com/modern-tsconfig-template-2024</guid><category><![CDATA[rapidcoding]]></category><category><![CDATA[nobsallcs]]></category><category><![CDATA[tsconfig]]></category><category><![CDATA[tsconfig.json]]></category><category><![CDATA[TypeScript Tutorial]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Thu, 18 Apr 2024 19:06:06 GMT</pubDate><content:encoded><![CDATA[<p>In this blog, I am keeping a draft example of the modern tsconfig file that works for me in the projects that I am making.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"compilerOptions"</span>: {
    <span class="hljs-attr">"target"</span>: <span class="hljs-string">"ESNext"</span>,
    <span class="hljs-attr">"experimentalDecorators"</span>: <span class="hljs-literal">false</span>,
    <span class="hljs-attr">"module"</span>: <span class="hljs-string">"commonjs"</span>,
    <span class="hljs-attr">"rootDir"</span>: <span class="hljs-string">"./src"</span>,
    <span class="hljs-attr">"outDir"</span>: <span class="hljs-string">"./dist"</span>,
    <span class="hljs-attr">"esModuleInterop"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">"forceConsistentCasingInFileNames"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">"strict"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">"noImplicitAny"</span>: <span class="hljs-literal">false</span>,
    <span class="hljs-attr">"skipLibCheck"</span>: <span class="hljs-literal">true</span>
  },
      <span class="hljs-attr">"exclude"</span>: [<span class="hljs-string">"node_modules/"</span>],
      <span class="hljs-attr">"include"</span>: [<span class="hljs-string">"src/**/*.ts"</span>]
}
</code></pre>
<p>I can come back to it when I need help.</p>
<p>You can use it in your projects too.  </p>
<p>Cheers!</p>
]]></content:encoded></item><item><title><![CDATA[Create a mongodb container with docker and connect with mongodb compass]]></title><description><![CDATA[This a very quick walkthrough of spinning up a mongodb server inside a docker container and connecting with it through the mongodb compass gui.
Why would you wanna do this?

You wanna get rid of MongoDB Atlas

You want a FREE solution

You want auton...]]></description><link>https://blog.srthk.com/create-a-mongodb-container-with-docker-and-connect-with-mongodb-compass</link><guid isPermaLink="true">https://blog.srthk.com/create-a-mongodb-container-with-docker-and-connect-with-mongodb-compass</guid><category><![CDATA[Docker]]></category><category><![CDATA[MongoDB]]></category><category><![CDATA[mongo]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Fri, 15 Mar 2024 14:00:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710511189108/440914ae-fca1-47d8-b69c-584a2fd9fc60.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This a very quick walkthrough of spinning up a mongodb server inside a docker container and connecting with it through the mongodb compass gui.</p>
<h2 id="heading-why-would-you-wanna-do-this">Why would you wanna do this?</h2>
<ul>
<li><p>You wanna get rid of MongoDB Atlas</p>
</li>
<li><p>You want a FREE solution</p>
</li>
<li><p>You want autonomy over how to manage and deploy your server</p>
</li>
</ul>
<h2 id="heading-pre-requisites">Pre-requisites:</h2>
<ul>
<li><p>Basic understanding of how to run a docker image</p>
</li>
<li><p>Basic understanding of what MongoDB is.</p>
</li>
</ul>
<p>For when you just need to spin up a quick MongoDB server don't want to spin up a MongoDB Atlas instance (Ugh, sign up, login, spin up a server and wait for it to get ready. It's a hassle)</p>
<p>Docker allows to quickly spin up a server <em>ad-hoc</em> without needing to sign up on any service and pay for any service. All you need is to have docker installed on your machine and internet connection (to download the mongodb image from the doker registry).</p>
<h3 id="heading-how-to-run-docker-inside-a-container">How to run docker inside a container</h3>
<p>Once you have both, here's how you set it up. Firstly, open up the terminal and type the following command</p>
<pre><code class="lang-powershell">docker run -<span class="hljs-literal">-name</span> mongodbcontainer <span class="hljs-literal">-p</span> <span class="hljs-number">27017</span>:<span class="hljs-number">27017</span> <span class="hljs-literal">-e</span> MONGO_INITDB_ROOT_USERNAME=mongodbrootusername <span class="hljs-literal">-e</span> MONGO_INITDB_ROOT_PASSWORD=mongodbrootpassword <span class="hljs-literal">-d</span> mongo
</code></pre>
<p>In the above command,<br />1. "-p" denotes port. Left side denotes the port on YOUR COMPUTER and right side denotes port to listen to INSIDE DOCKER CONTAINER</p>
<p>2. "-e" denotes environment variables</p>
<p>3. "-d" denotes daemon mode, ie the process will run in the background and not take up your terminal</p>
<p>4. "--name" denotes the name that you can assign to the container</p>
<h3 id="heading-connect-mongodb-inside-container-to-your-app">Connect MongoDB inside container to your app</h3>
<p>Once you've run this command, it will spin up a mongodb server inside a docker container. To connect to that container from a (for example, nodejs) app, here's the connection string you must enter.</p>
<pre><code class="lang-powershell">mongodb://mongodbrootusername:mongodbrootpassword@localhost:<span class="hljs-number">27017</span>/?retryWrites=true&amp;w=majority
</code></pre>
<p>And that's that. You are now conneted to an instance of MongoDB running inside a container on your machine.</p>
]]></content:encoded></item><item><title><![CDATA[Setup Postgres docker container quick!!]]></title><description><![CDATA[Docker remains the quickest way of setting up a Postgres database server. Here's how to do so.

Sometimes, we just need to set up a postgres database server, and if you have docker - spinning up a container is always the quickest and cleanest way of ...]]></description><link>https://blog.srthk.com/setup-postgres-docker-container-quick</link><guid isPermaLink="true">https://blog.srthk.com/setup-postgres-docker-container-quick</guid><category><![CDATA[PostgreSQL]]></category><category><![CDATA[postgres]]></category><category><![CDATA[Docker]]></category><category><![CDATA[docker images]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Tue, 21 Dec 2021 05:48:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1640065414878/20IwMqWps.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>Docker remains the quickest way of setting up a Postgres database server. Here's how to do so.</p>
</blockquote>
<p>Sometimes, we just need to set up a postgres database server, and if you have docker - spinning up a container is always the quickest and cleanest way of setting up a Postgres server</p>
<p>For example, when you need to quickly setup a Express Rest API server using PostGres with Prisma, like I need to do today. Here's how you do it. </p>
<pre><code>docker run <span class="hljs-operator">-</span><span class="hljs-operator">-</span>rm <span class="hljs-operator">-</span><span class="hljs-operator">-</span>name postgres<span class="hljs-operator">-</span>db <span class="hljs-operator">-</span>p <span class="hljs-number">5433</span>:<span class="hljs-number">5432</span> <span class="hljs-operator">-</span>e POSTGRES_PASSWORD<span class="hljs-operator">=</span>mysecretpassword <span class="hljs-operator">-</span>d postgres:<span class="hljs-number">13</span><span class="hljs-operator">-</span>alpine
</code></pre><p><strong><em>Please Note:</em></strong> we're mapping port <em>5432</em> of the container to port <em>5433</em> of your local machine/system/computer on which you are writing code. This is intentional and serves to drive understanding of how ports works. The explanation is below: </p>
<ul>
<li><code>postgres-db</code> is the name of the container you spin up. </li>
<li><code>5432</code> is the default port at which postgres runs. You can, if you so wish, map your system's port to container's port. In this case, <code>5433</code> is the port at which you will find the server on your local machine. </li>
<li><code>mysecretpassword</code> is the <strong>password</strong> to log in to the db server</li>
<li><code>postgres</code>  is the <strong>default user AND default Database</strong>. It is not mentioned in the docker command posted above.</li>
<li><code>postgres:13-alpine</code> is the image we're pulling. </li>
</ul>
<p>Assuming everything runs without an error, you can connect to the server using the connection string in the following format: <code>postgresql://default_user:password@localhost:5432/default_db?schema=public</code></p>
<p>Therefore, your string becomes</p>
<pre><code><span class="hljs-attribute">postgresql</span>:<span class="hljs-comment">//postgres:mysecretpassword@localhost:5433/postgres?schema=quotes</span>
</code></pre><p>And that's it. </p>
<p>If you'd like to know how to connect to this (or any) postgres server using Shell/Terminal, you can find it in an upcoming blog. </p>
]]></content:encoded></item><item><title><![CDATA[Run Mysql docker container on Apple M1 macs.]]></title><description><![CDATA[Apple's M1 chip has a different architecture than Intel or AMD and as such, not all containers run on it smoothly. One such docker container is MySQL. If you try to create and run a docker container on M1 mac, the platform it looks for are linux/arm6...]]></description><link>https://blog.srthk.com/run-mysql-docker-container-on-apple-m1-macs</link><guid isPermaLink="true">https://blog.srthk.com/run-mysql-docker-container-on-apple-m1-macs</guid><category><![CDATA[Apple]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[Docker]]></category><category><![CDATA[docker images]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Thu, 09 Dec 2021 10:09:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/fPkvU7RDmCo/upload/v1639044472033/h_XggH97B.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Apple's M1 chip has a different architecture than Intel or AMD and as such, not all containers run on it smoothly. One such docker container is MySQL. If you try to create and run a docker container on M1 mac, the platform it looks for are <code>linux/arm64/v8</code>
And you get the following error: <code>docker: no matching manifest for linux/arm64/v8 in the manifest list entries.</code></p>
<p>You can still run the docker container by explicitly stating the platform, such that your run command becomes </p>
<pre><code>docker run <span class="hljs-operator">-</span><span class="hljs-operator">-</span>name some<span class="hljs-operator">-</span>mysql <span class="hljs-operator">-</span>e MYSQL_ROOT_PASSWORD<span class="hljs-operator">=</span>admin <span class="hljs-operator">-</span><span class="hljs-operator">-</span>platform<span class="hljs-operator">=</span>linux<span class="hljs-operator">/</span>x86_64 <span class="hljs-operator">-</span>d mysql
</code></pre><p>And now your container should form and run smoothly. </p>
<p>Caveats --&gt; 
This is not an ideal approach. This is essentially using an emulation of the host machine to run the container and that causes its own issues like poor performance. If you'd like me to discuss problems with this approach and ideal solutions, let me know and I'll write another blog about it. </p>
]]></content:encoded></item><item><title><![CDATA[ES6 imports in NodeJS]]></title><description><![CDATA[This is going to be a short, simple and targeted blog. Solution First, explanation later. 
TL:DR

Make sure your Node version is above v13 (if it is not, update your version of node)
In the package.json file, paste the following before dependencies 
...]]></description><link>https://blog.srthk.com/es6-imports-in-nodejs</link><guid isPermaLink="true">https://blog.srthk.com/es6-imports-in-nodejs</guid><category><![CDATA[Node.js]]></category><category><![CDATA[ES6]]></category><category><![CDATA[es2015]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Tue, 16 Feb 2021 08:12:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1616588839779/xeqbUK4R2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is going to be a short, simple and targeted blog. <strong>Solution First, explanation later. </strong></p>
<h4 id="tldr">TL:DR</h4>
<ol>
<li>Make sure your Node version is above v13 (if it is not, update your version of node)</li>
<li>In the package.json file, paste the following before dependencies </li>
</ol>
<pre><code>  <span class="hljs-string">"type"</span>: <span class="hljs-string">"module"</span>
</code></pre><p>Such that your package.json loos something like below</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1616588704378/WWndvcfOb.png" alt="es6_module_example.png" /></p>
<p>Et Voila. </p>
<p><strong>Still here? Looking for explanation. Read on.</strong> </p>
<h2 id="compatibility">Compatibility</h2>
<p>Since Node v13 and above, NodeJS has an experimental support for ES Modules by default as declared <a target="_blank" href="https://nodejs.org/docs/latest-v13.x/api/esm.html#esm_enabling">here</a>, ie, Node will treat the following as ES modules when passed to node as the initial input, or when referenced by import statements within ES module code :- </p>
<p>  --&gt;   Files ending in <code>.mjs</code>.</p>
<p>  --&gt;   Files ending in <code>.js</code> when the nearest parent <code>package.json</code> file contains a top-level field <code>"type"</code> with a value of <code>"module"</code>.</p>
<p>--&gt;    Strings passed in as an argument to <code>--eval</code> or <code>--print</code>, or piped to node via <code>STDIN</code>, with the flag <code>--input-type=module</code>.</p>
<h2 id="difference-bw-commonjs-vs-es6-module-syntax">Difference b/w CommonJS vs ES6 module syntax</h2>
<table>
<thead>
<tr>
<td></td><td>REQUIRE</td><td>ES6 IMPORT AND EXPORT</td></tr>
</thead>
<tbody>
<tr>
<td></td><td>Require is Non-lexical, it stays where they have put the file.</td><td>Import is lexical, it gets sorted to the top of the file.</td><td></td></tr>
<tr>
<td></td><td>It can be called at any time and place in the program.</td><td>It can’t be called conditionally, it always run in the beginning of the file.</td><td></td></tr>
<tr>
<td></td><td>You can directly run the code with require statement.</td><td>To run a program containing import statement you have to use experimental module feature flag.</td><td></td></tr>
<tr>
<td></td><td>If you want to use require module then you have to save file with ‘.js’ extension.</td><td>If you want to use import module then you have to save file with ‘.mjs’ extension.</td><td></td></tr>
</tbody>
</table>
<h2 id="support">Support</h2>
<p>As of April 2021, an overwhelming majority of browsers support ES6 modules so you don't have to worry about the support</p>
<p>If you found this helpful, consider subscribing to my social channels? 
Cheers! </p>
]]></content:encoded></item><item><title><![CDATA[How I got C# to work with Godot! (GameDev Stories)]]></title><description><![CDATA[I am a hobbyist game developer. While researching for an appropriate game engine, I finalized a few for production, namely Unity, Unreal (ps, you need to make an epic ID and login with it to download) and  Godot, of which I chose to make with Godot, ...]]></description><link>https://blog.srthk.com/how-i-got-c-to-work-with-godot-gamedev-stories</link><guid isPermaLink="true">https://blog.srthk.com/how-i-got-c-to-work-with-godot-gamedev-stories</guid><category><![CDATA[Godot]]></category><category><![CDATA[C#]]></category><category><![CDATA[Game Development]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Sun, 20 Sep 2020 08:06:24 GMT</pubDate><content:encoded><![CDATA[<p>I am a hobbyist game developer. While researching for an appropriate game engine, I finalized a few for production, namely <a target="_blank" href="https://unity3d.com/get-unity/download">Unity</a>, <a target="_blank" href="https://www.unrealengine.com/en-US/auth?state=https://www.unrealengine.com/en-US/eulacheck/publishing">Unreal</a> <em>(ps, you need to make an epic ID and login with it to download)</em> and  <a target="_blank" href="https://godotengine.org/">Godot</a>, of which I chose to make with Godot, for more reasons than one. </p>
<p>I'll talk about my reasons to choose Godot over other engines, its positives and its negatives in another blog, right now, this blog about is <strong>only</strong> about how did I get C# to work with Godot. <em>I assume you already know how to code in C# and what how to code in GDScript in Godot and now want to combine both.</em> I'll keep it short and crisp so that you can follow along easily and get set up and coding quickly. </p>
<ol>
<li><p>Download Godot <a target="_blank" href="https://godotengine.org/">here</a></p>
</li>
<li><p>Download Visual Studio Code <a target="_blank" href="https://code.visualstudio.com/Download">here</a></p>
</li>
<li><p><strong>(Important)</strong> On Visual Studio Code, go to extensions and install the following extensions, namely <strong>C#</strong> by microsoft and <strong>C# Extensions</strong> by jchannon</p>
</li>
<li><p><strong>(Also important)</strong> Set these in Vscode C# Extension settings for intellisense ;</p>
<pre><code>  <span class="hljs-string">"omnisharp.monoPath"</span>: ***(path to your mono installation. For my mac, it<span class="hljs-symbol">'s</span> located at)***<span class="hljs-string">"/Library/Frameworks/Mono.framework/Versions/Current/Commands/mono"</span>, 
  <span class="hljs-string">"omnisharp.useGlobalMono"</span>: <span class="hljs-string">"always"</span>,
</code></pre></li>
<li><p>Open Godot</p>
</li>
<li><p>Create a new project, pick a name, empty directory and choose OpenGL ES 3.0</p>
</li>
<li><p>Go to Editor (top bar) &gt; Editor Settings &gt; Mono, choose external editor</p>
</li>
<li><p>There's a "Create Root Node" in scene on top-left, choose 3D Scene</p>
</li>
<li><p>Right click newly created Spatial, choose "Attach Script"</p>
</li>
<li><p>Change language to C# and hit "Create" (it should open it in VS Code)</p>
</li>
<li><p>Open <code>&lt;ProjectName&gt;.csproj</code> 
file from VS Code file explorer and add <code>&lt;ItemGroup&gt;&lt;Compile Include="**\*.cs" /&gt;&lt;/ItemGroup&gt;</code> between <code>&lt;Project&gt;</code> tags, this tells the compiler to compile all your C# files (otherwise have to add 1 file at a time)</p>
</li>
</ol>
<p>Et voila. Now any script that you attach in your godot project, as long as it is a C# script, it will work with Godot. </p>
<hr />
<p>Hello, I am <strong><em>Sarthak Batra</em></strong>. I have been a software engineer for over 6 years now but I've only just began blogging about it, so I <em>am</em> prone to errors by making it unclear or confusing. If you think this blog does NOT sufficiently explains the subject it says, reach out to me on my twitter at www.twitter.com/sarthakbatra and I'll be more than happy to help. After all, when we learn together and help each other, we all grow! </p>
]]></content:encoded></item><item><title><![CDATA[Hello, World]]></title><description><![CDATA[Who am I? 
Hi, I am Sarthak. 
Some of you know me, most of you don't, which is what I intend to change with what I am starting today.
Well, let me give you a quick heads up about myself - I'm a Full Stack (meaning I work on FrontEnd and Backend both)...]]></description><link>https://blog.srthk.com/hello-world</link><guid isPermaLink="true">https://blog.srthk.com/hello-world</guid><category><![CDATA[Hello World]]></category><category><![CDATA[programmer]]></category><category><![CDATA[first post]]></category><category><![CDATA[social media]]></category><category><![CDATA[introduction]]></category><dc:creator><![CDATA[Sarthak Batra]]></dc:creator><pubDate>Tue, 11 Aug 2020 08:10:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1594799748537/-s_Q5-EeL.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="-who-am-i-"><strong>Who am I? </strong></h2>
<p>Hi, I am <strong>Sarthak</strong>. 
Some of you know me, most of you don&#39;t, which is what I intend to change with what I am starting today.</p>
<p>Well, let me give you a quick heads up about myself - I&#39;m a Full Stack (meaning I work on FrontEnd and Backend both) Web/Mobile/DevOps engineer and a hobbyist game developer. I have been doing this for over six years now, in which I have done a bunch of important projects, some of which you&#39;ll find on my  <a target='_blank' rel='noopener'  href="https://srthk.com/">website</a> - which, to be fair, is still a work in progress, so all of y&#39;all are invited to send feedback and suggestion. </p>
<p>So, why am I writing this blog? To let y&#39;all know and to hold myself accountable by committing socially to improving myself as a developer and showcase my work! 
I intend to do that by means of LiveStreaming coding, so that you can code along while having a peek into my way of implementing solutions and taking your questions, solving problems basically. I&#39;m also committing to documenting my journey, despite how much my engineer instinct tell me to avoid documentations! </p>
<p>With that being said, I&#39;ll leave y&#39;all with links to my various channels and ask y&#39;all to see me there, to feed me encouragement and suggestions and I&#39;ll put my best efforts to make it worth your time. </p>
<h1 id="keep-an-eye-out-for-these-">Keep an eye out for these:</h1>
<p><strong>NewsLetter</strong> - Where I write my engineering observations, tip  and tricks. I take interviews with people in tech and give you updates about job openings and resources. If you want all this goodness, subscribe to it  <a target='_blank' rel='noopener'  href="https://buttondown.email/SarthakBatra">here</a> </p>
<p><strong>Twitch Channel</strong> - Where I take coding challenges, take up and build projects, solve problems and interview questions - all on livestream. Subscribe if you are interested in seeing the process, in its entirety, of solving engineering problems. I also build projects in real time so you can see the problems I encounter and how I arrive at their solutions. You also get to be a part of a helpful and close knit community of developers(over discord). Subscribe and become a follower <a target='_blank' rel='noopener'  href="https://www.twitch.tv/batrasarthak">here</a></p>
<p><strong>YouTube Channel</strong> - A place where I put abridged versions of interview question solutions, tutorials, and general tech content. Follow if you want tech tutorials, abridged versions of what we do on the live stream and become a part of a close knit community of developers - subscribe to it  <a target='_blank' rel='noopener'  href="https://www.youtube.com/channel/UCSppitClTvgot89fBdRxXoA">here</a> </p>
<p>Say you&#39;re more of a fun-loving who breathes social media, y&#39;know what, so do I. Don&#39;t believe me? Check out my <strong><a target='_blank' rel='noopener'  href="www.instagram.com/_batrasarthak">Instagram</a></strong>  and  <strong><a target='_blank' rel='noopener'  href="www.twitter.com/sarthakbatra">Twitter</a></strong>  to see for yourself. </p>
<p>And that&#39;s it from my side for now. I&#39;ll see you on the other side of this blog.</p>
]]></content:encoded></item></channel></rss>