<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Udit Ramawat</title>
		<link>https://ramawat.fyi/</link>
		<description>Personal blog and portfolio of Udit Ramawat.</description>
		<language>en-us</language>
		<lastBuildDate>Sat, 06 Jun 2026 00:00:00 GMT</lastBuildDate>
		
		<item>
			<title>Watching Rafa</title>
			<link>https://ramawat.fyi/blog/watching-rafa/</link>
			<guid>https://ramawat.fyi/blog/watching-rafa/</guid>
			<description>On fandom, growing older and one last vamos</description>
			<content:encoded><![CDATA[<p>Netflix recently released <a href="https://www.netflix.com/title/81785900">Rafa</a>, and as any fanatical Nadal supporter, it was naturally on my list to watch. I finally caught up with it over a few nights and came away feeling extremely nostalgic. Having followed Nadal since 2007, it was a rush to relive his highest highs and lowest lows.</p>
<p>It also made me confront a slightly uncomfortable truth: I have spent nearly two decades arranging an unreasonable number of mornings, afternoons and late nights around one man&#39;s ability to hit a fuzzy yellow ball. There are probably worse ways to spend your time. I am conveniently choosing not to investigate.</p>
<h4 id="becoming-a-rafa-fan">Becoming a Rafa fan</h4>
<p>I started following Rafa in 2007. Federer was already the definition of effortless brilliance, which made Rafa feel like the complete opposite. Every point looked like it required every ounce of him. The sprinting, the sliding, the lasso forehand and, of course, the vamos after a ridiculous point.</p>
<p>There was something magnetic about watching someone compete as if every point mattered equally. Rafa could be playing a Grand Slam final or be up two sets in an early round, and he still carried himself like the next point was the only one that existed.</p>
<p>As someone whose own tennis game has always contained considerably more enthusiasm than technique, this was deeply inspiring. Unfortunately, inspiration does not add topspin to a forehand. Perhaps the same can be said of my bowling prowess, but I digress.</p>
<h4 id="the-ritual-of-watching">The ritual of watching</h4>
<p>Following an athlete for this long creates its own rhythm. There were the clay seasons where losing felt almost impossible, the injuries that made every comeback feel uncertain, and the matches where he somehow found another gear after looking completely spent.</p>
<p>Watching Rafa was rarely relaxing. Even when he was comfortably ahead, I maintained the emotional composure of someone diffusing a bomb. But that tension was part of the appeal. You never felt like he took the outcome for granted, so neither did you. Over time, the matches became markers for different periods of my own life. I can remember where I was for many of the big wins and some of the more painful losses. Jobs changed, cities changed and responsibilities grew, but for a couple of weeks every year, there was Rafa at Roland Garros.</p>
<h4 id="growing-older-together">Growing older together</h4>
<p>The documentary does a wonderful job of revisiting the trophies and rivalries, but the part that stayed with me was seeing the passage of time. The younger Rafa seemed indestructible. Later, every tournament carried a quiet question about how much longer his body would allow him to keep going.</p>
<p>There is a strange comfort in following a sporting career for so long. At first, you watch your hero grow into their prime. Then one day, without really noticing when it happened, you are both older and discussing knee pain with far more authority than either of you would prefer.</p>
<p>His career became less about whether he would win everything and more about appreciating that he was still there. Each comeback felt like a small refusal to let the story end before he was ready.</p>
<h4 id="what-made-rafa-different">What made Rafa different</h4>
<p>The obvious answer is the relentlessness. Nobody made suffering through a five-set match look quite as purposeful. But what I admired most was that the intensity never seemed to turn into entitlement.</p>
<p>He celebrated wins, accepted losses and returned to the work. That sounds simple, but it is incredibly difficult to do consistently, especially when the entire world expects greatness from you. For all the trophies and impossible shots, that might be the most enduring part of watching Rafa: effort was never beneath him. He made trying incredibly hard look like its own form of talent.</p>
<h4 id="one-last-vamos">One last vamos</h4>
<p>Watching the documentary felt less like revisiting a collection of tennis matches and more like going through a cherished flipbook. The matches were Rafa&#39;s, but the memories attached to them were mine.</p>
<p>I will miss the nervous energy of watching him compete. I will miss believing that no match was truly over while he was still on court. And I will miss yelling vamos maniacally at my tv screen, an activity that contributed absolutely nothing to the outcome but felt essential nonetheless.</p>
<p>Gracias, Rafa. What a privilege it was to watch.</p>]]></content:encoded>
			<pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
			<category>noodling</category><category>thoughts</category>
		</item>
		<item>
			<title>The More Interesting Leak Surface Is AI Agent Config</title>
			<link>https://ramawat.fyi/blog/agent-config-leak-surface/</link>
			<guid>https://ramawat.fyi/blog/agent-config-leak-surface/</guid>
			<description>Why helpfulGremlin is narrowing from generic secret scanning toward AI-agent-era local config leaks.</description>
			<content:encoded><![CDATA[<p>When I first built <a href="https://pypi.org/project/helpfulgremlin/">helpfulGremlin</a>, the pitch was simple: run a tiny CLI before pushing code and catch the obvious secrets that should not be in public.</p>
<p>That was useful, but it was also immediately obvious that I was walking into a crowded room. GitHub has <a href="https://docs.github.com/en/code-security/secret-scanning/introduction/about-push-protection">push protection</a>. Mature tools like Gitleaks, TruffleHog, GitGuardian, and detect-secrets already exist. There are also a growing number of small <code>uvx</code>-friendly scanners that do roughly the same thing.</p>
<p>So the question became less “can I build a secret scanner?” and more “what is the specific leak surface that feels newly weird because of how I actually build now?”</p>
<p>The answer, for me, is AI-agent config.</p>
<h4 id="the-local-repo-is-getting-stranger">The local repo is getting stranger</h4>
<p>AI-assisted development has changed what ends up near the codebase. It is not just app source files anymore. A working project can now include MCP configs, editor agent settings, generated scripts, copied setup snippets, auth headers from docs, notebook outputs, deployment glue, and half-finished local integrations.</p>
<p>Claude Code, for example, supports project-scoped MCP servers through <code>.mcp.json</code>, while Claude Desktop has its own <code>claude_desktop_config.json</code> path and behavior. The <a href="https://code.claude.com/docs/en/mcp">Claude Code MCP docs</a> explicitly describe project-scoped server configuration, and the <a href="https://code.claude.com/docs/en/desktop">Desktop docs</a> call out that Desktop and Claude Code MCP configs are separate.</p>
<p>That separation is powerful, but it also means there are more places for a tired developer to paste something sensitive.</p>
<h4 id="the-new-helpfulgremlin-direction">The new helpfulGremlin direction</h4>
<p>I do not want helpfulGremlin to become a sprawling security platform. That feels like the wrong game.</p>
<p>The better version is narrower:</p>
<blockquote>
<p>Catch the dumb, expensive mistakes before they leave my laptop.</p>
</blockquote>
<p>So the next iteration is defaulting toward agent-aware local scanning. It still looks for the usual API keys, private keys, database URLs, and high-entropy strings, but it now also pays special attention to files like:</p>
<ul>
<li><code>.mcp.json</code></li>
<li><code>mcp.json</code></li>
<li><code>.claude/settings.json</code></li>
<li><code>.cursor/mcp.json</code></li>
<li><code>claude_desktop_config.json</code></li>
<li><code>.env</code>, <code>.env.local</code>, <code>.env.*</code></li>
<li><code>.npmrc</code>, <code>.pypirc</code>, <code>.netrc</code></li>
<li>cloud credential JSON files</li>
</ul>
<p>For JSON-based agent configs, helpfulGremlin tries to parse the file and inspect values under fields like <code>mcpServers</code>, <code>env</code>, <code>headers</code>, <code>args</code>, <code>command</code>, and <code>url</code>. If it sees a literal token where an environment variable reference should be, it reports that as an agent-config finding.</p>
<p>It also warns when sensitive local config files are present at all. That is intentional. A <code>.env.local</code> file full of placeholders is not the same as a leaked production token, but it is still worth pausing on before a push.</p>
<h4 id="why-this-feels-more-useful-than-more-regexes">Why this feels more useful than “more regexes”</h4>
<p>The generic secret-scanner market rewards breadth. More providers, more token formats, more validation, more integrations.</p>
<p>That is not where this project is likely to be interesting.</p>
<p>The interesting part is context: a tiny local tool that understands the shapes created by AI-assisted development and gives a developer one more moment to notice something before it becomes permanent.</p>
<p>In the original post, I wrote about building helpfulGremlin quickly with agentic tools. This follow-up is the more honest second step: after shipping the obvious MVP, the useful product shape became clearer.</p>
<p>Not a better Gitleaks.</p>
<p>A small guardrail for the messier local workflows that AI tools are creating.</p>]]></content:encoded>
			<pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
			<category>experimenting</category><category>tools</category><category>ai</category><category>security</category>
		</item>
		<item>
			<title>When tracking with Google Sheets doesn&apos;t cut it</title>
			<link>https://ramawat.fyi/blog/sheetsupgrade/</link>
			<guid>https://ramawat.fyi/blog/sheetsupgrade/</guid>
			<description>Purpose Built Nanny Ledger to track mileage, days off etc.</description>
			<content:encoded><![CDATA[<p>My wife and I are very fortunate to have a wonderful caregiver for our son who dotes on him, plays with him, takes him to libraries, parks, etc. - and just keeps him engaged all day long.</p>
<p>All these trips mean driving around the bay area for her, which means we need a mechanism to track those miles for reimbursement. Enter trusty old Google Sheets - a couple of simple macros later, a simple sheet was up and we were on our way. Initially, this worked fine. But as the number of days entered in the sheet grew, the unwieldy nature of Google Sheets on mobile really came to the fore. Perhaps a separate sidebar for a different day on my feelings on that topic (I know Sheets can be so much better on mobile, but it&#39;s not at the moment).</p>
<h4 id="the-aha-moment">The AHA moment</h4>
<p>In parallel, the other tracking challenge was to ensure we could accurately account for time off based on hours outside of regularly scheduled vacation days for our Nanny. This is so that we could do accurate accounting and bookkeeping with the payroll service. Now trying to update information on this payroll website (HomePay) feels akin to swimming in quicksand. So once again, trusty old Google sheets came to the rescue initially, and once again very soon ran into similar usage limitations.</p>
<h4 id="stand-aside-google-sheets">Stand aside Google Sheets</h4>
<p>I thought I could probably build something quick, responsive, which eliminates the friction for data entry and makes the key tracking insights dead simple and prominently visible. And for sheer cheek, I asked Gemini <svg width="1em" height="1em" data-icon="tabler:sparkles">   <symbol id="ai:tabler:sparkles" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 18a2 2 0 0 1 2 2a2 2 0 0 1 2-2a2 2 0 0 1-2-2a2 2 0 0 1-2 2m0-12a2 2 0 0 1 2 2a2 2 0 0 1 2-2a2 2 0 0 1-2-2a2 2 0 0 1-2 2M9 18a6 6 0 0 1 6-6a6 6 0 0 1-6-6a6 6 0 0 1-6 6a6 6 0 0 1 6 6"/></symbol><use href="#ai:tabler:sparkles"></use>  </svg> to use Google themed branding for general look/feel.</p>
<p>Key details that made this work for us:</p>
<ul>
<li>Globally configured mileage reimbursement rate, number of holidays, number of sick days</li>
<li>Adding the agreed upon vacation days to see a holistic calendar view</li>
<li>Logic to handle round trips and reconciliation for paid v/s unpaid miles</li>
</ul>
<p>Overall results have worked out pretty well and my wife, the nanny and I are finding very good use out of this. I mean what else would I do when I have an un-used domain lying around.</p>
<p><img src="https://ramawat.fyi/thumbnails/dashboard.jpg" alt="Main Dashboard Pills"/></p>
<img src="https://ramawat.fyi/thumbnails/log.jpg" width="200px"/>
<p>All code and tech stack breakdown on <a href="https://github.com/uramawat/nanny-tracking-app"><svg width="1em" height="1em" data-icon="mdi:github">   <symbol id="ai:mdi:github" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></symbol><use href="#ai:mdi:github"></use>  </svg></a></p>]]></content:encoded>
			<pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
			<category>tools</category><category>experimenting</category>
		</item>
		<item>
			<title>Signs of Improvement</title>
			<link>https://ramawat.fyi/blog/learning_asl/</link>
			<guid>https://ramawat.fyi/blog/learning_asl/</guid>
			<description>Making learning ASL sticky as an adult</description>
			<content:encoded><![CDATA[<p>The sense of being able to role model habits/skills has never been higher for me since being a dad, and more so since my toddler is picking up new skills at quite the alarming pace (<em>insert proud dad moment</em>). Communication is so vital and little toddlers can pick up signs a lot faster than verbal language. My son started signs &#39;more&#39; quite fervently during dinner time so we know he&#39;s atleast getting the &#39;food&#39; part of our conversations. (<em>insert <em>another</em> proud dad moment</em>)</p>
<p>There&#39;s also another personal angle, my wife is fluent in ASL and as a multi-lingual household, we want to champion the languages (English, Hindi, ASL) for our son as he grows up as well. This is where the genesis of my problem starts.</p>
<blockquote>
<p>How can I build an ASL learning mechanism that&#39;s sticky enough for me to keep up with the learning curve without it feeling like a chore?</p>
</blockquote>
<p>A solution to this problem should:</p>
<ul>
<li>Give clear feedback</li>
<li>Actually tell me how the sign works</li>
<li>Be intuitive to use</li>
<li>Ideally free (<em>after some spirited fight, I relented on this</em>)</li>
</ul>
<p>In my head, I thought if I can build a simple app that can help me practice a sign and tell me how well am I signing it. Not just score me, but give some other kind of feedback as well in terms of how I&#39;m moving my hands when I&#39;m signing (ASL is heavily dependent on body language for grammar, but that&#39;s a more complex and nuanced problem to solve).</p>
<p>Enter <a href="https://bettersign.fyi">ASL Educator</a> - My personal learning assistant to help me navigate the nuances of ASL.</p>
<h4 id="evolution-of-asl-educator">Evolution of ASL Educator</h4>
<p>The idea was simple. I turn on my webcam, sign a word and get immediate feedback.</p>
<p>I was thinking with the power of <svg width="1em" height="1em" data-icon="tabler:sparkles-2">   <symbol id="ai:tabler:sparkles-2" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7a9.3 9.3 0 0 0 1.516-.546c.911-.438 1.494-1.015 1.937-1.932c.207-.428.382-.928.547-1.522c.165.595.34 1.095.547 1.521c.443.918 1.026 1.495 1.937 1.933c.426.205.925.38 1.516.546a9.3 9.3 0 0 0-1.516.547c-.911.438-1.494 1.015-1.937 1.932A9 9 0 0 0 17 11c-.165-.594-.34-1.095-.547-1.521c-.443-.918-1.026-1.494-1.937-1.932A9 9 0 0 0 13 7M3 14a21 21 0 0 0 1.652-.532c2.542-.953 3.853-2.238 4.816-4.806A20 20 0 0 0 10 7a20 20 0 0 0 .532 1.662c.963 2.567 2.275 3.853 4.816 4.806q.75.28 1.652.532a21 21 0 0 0-1.652.532c-2.542.953-3.854 2.238-4.816 4.806A20 20 0 0 0 10 21a20 20 0 0 0-.532-1.662c-.963-2.568-2.275-3.853-4.816-4.806A21 21 0 0 0 3 14"/></symbol><use href="#ai:tabler:sparkles-2"></use>  </svg>, I could knock this out in a weekend... oh how wrong was I. Nailing down the production deployment was a pro level game of whac-a-mole! A lot of it was self-inflicted as I was earlier trying to do this all of $0 using Render&#39;s free tier.</p>
<blockquote>
<p>How I thought the dev process would largely be?</p>
</blockquote>
<pre><code class="language-mermaid">graph TD
    A[Idea] --&gt; B[Local ML Pipeline]
    B --&gt; C[Deploy App]
    C --&gt; D[Productionize]
</code></pre>
<blockquote>
<p>How the dev process actually went?</p>
</blockquote>
<pre><code class="language-mermaid">flowchart TD
    Start((Start)) --&gt; ML[Local ML Pipeline]
    
    subgraph &quot;Phase 1: ML Pipeline&quot;
        ML --&gt; ML_Ch1[Dealing with large tensors &amp; OOM]
        ML --&gt; ML_Ch2[Debugging Similarity Math]
        ML_Ch1 &amp; ML_Ch2 --&gt; ML_Done{Accurate?}
        ML_Done --&gt;|No| ML
    end

    ML_Done --&gt;|Yes| Frontend[Frontend &amp; Web App]

    subgraph &quot;Phase 2: Frontend Debugging&quot;
        Frontend --&gt; FE_Ch1[Camera Access &amp; Stream]
        Frontend --&gt; FE_Ch2[Real-time Video Latency]
        Frontend --&gt; FE_Ch3[Syncing ML state to UI]
        FE_Ch1 &amp; FE_Ch2 &amp; FE_Ch3 --&gt; FE_Done{Responsive?}
        FE_Done --&gt;|No| Frontend
    end

    FE_Done --&gt;|Yes| Prod[Deploying to Prod]

    subgraph &quot;Phase 3: Production &amp; Infra&quot;
        Prod --&gt; Prod_Ch1[Git LFS overages &amp; Build sizes]
        Prod --&gt; Prod_Ch2[Serverless constraints for ML]
        Prod --&gt; Prod_Ch3[Need for persistent state]
        
        Prod_Ch1 --&gt; Sol1[Cloudflare R2 for Assets]
        Prod_Ch2 --&gt; Sol2[Render for ML Services]
        Prod_Ch3 --&gt; Sol3[Supabase for Postgres DB]
        
        Sol1 &amp; Sol2 &amp; Sol3 --&gt; Prod_Done{Stable?}
        Prod_Done --&gt;|No| Prod
    end
    
    Prod_Done --&gt;|Yes| Success(((Success!)))
</code></pre>
<p>I ended up spending <em>more time than I would have liked</em> on ensuring that the ML service and the backend gateway can wake up in time as a user goes onto the app and tries to practice. The cold start for the app kept winning this battle.</p>
<p>The things that didn&#39;t work for combating the free tier deployment:</p>
<ul>
<li>Adding a Github Action to send a ping to Render for the two services I had</li>
<li>Increasing timeout for ML Service loadup</li>
<li>Showing a waiting UI interstitial while the services woke up in the background</li>
<li>Lazy Loading ML Data from Cloudflare R2</li>
<li>Slimming down docker image</li>
</ul>
<h4 id="parting-thoughts">Parting Thoughts</h4>
<p>Ultimately, I had to bite the bullet and upgrade from the free tier to keep the ML inference snappy. The small monthly cost is absolutely worth it to avoid losing my momentum while staring at a loading spinner.</p>
<p>So, did I solve my original problem? Yes and no. The app is a solid start for nailing down the accuracy of individual signs, and I&#39;m definitely keeping pace with my toddler&#39;s growing vocabulary (we&#39;re moving way past just &quot;more&quot; and &quot;food&quot; now!).</p>
<p>But the journey doesn&#39;t stop here. To make this truly persistent long-term and habit forming, the next phase is moving from single-word recognition to full sentence-level processing. Oh, and adding some gamification—because nothing motivates quite like a 30-day streak! (gotta come up with an ASL-themed Duolingo pun). I should be getting some feedback from my relatives who happen to be in deaf education as well, so the MAU trend can climb a little bit as well (I&#39;m all about those metrics).</p>
<p>Until then, I&#39;ve got some signs to practice.</p>
<p>All code and tech stack breakdown on <a href="https://github.com/uramawat/ASLEducator"><svg width="1em" height="1em" data-icon="mdi:github">   <symbol id="ai:mdi:github" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></symbol><use href="#ai:mdi:github"></use>  </svg></a></p>]]></content:encoded>
			<pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
			<category>learning</category><category>asl</category><category>experimenting</category>
		</item>
		<item>
			<title>Building a PM for your AI - how meta</title>
			<link>https://ramawat.fyi/blog/pm-engine/</link>
			<guid>https://ramawat.fyi/blog/pm-engine/</guid>
			<description>Gemini CLI needs some love in the deluge of Claude workflows</description>
			<content:encoded><![CDATA[<p>As someone who loves automating things and appreciates structured thinking, when there&#39;s a clear problem and an opportunity, I know it&#39;s too good to pass.</p>
<p>I&#39;ve been using Claude Code and Gemini App heavily at work and its been truly incredible to have such capable agents at my disposal. I would be remiss if I didn&#39;t shout out to the open-source community for some amazing plugins and the patterns they champion:</p>
<ul>
<li><strong>Persona-driven friction:</strong> Heavily inspired by Garry Tan’s <a href="https://github.com/garrytan/gstack/tree/main">gstack</a>. AI agents shouldn’t just be blind coders. They should emulate senior technical roles that actively push back.</li>
<li><strong>File-based memory:</strong> Inspired by <a href="https://github.com/gsd-build/get-shit-done">get-shit-done</a>. Architectural context and phase logic must be explicitly tracked in rigid Markdown files (PRD and STATE) to serve as the ultimate source of truth.</li>
</ul>
<p>These patterns have been immensely helpful as I&#39;ve been building PoC to production-ready apps, but I felt there was a gap within the Gemini ecosystem.</p>
<p>That&#39;s why I built <a href="https://github.com/uramawat/pm-engine">PM-Engine</a>. I wanted to bring the same friction and discipline I value in real-world product teams to my AI workflow.</p>
<h4 id="focusing-on-the-why">Focusing on the why</h4>
<p>Instead of just telling the AI to &quot;build X,&quot; PM-Engine forces you through a structured discovery phase. Take a look at this <code>/discover</code> session for a quick macro tracking app I was playing with:</p>
<p><img src="https://ramawat.fyi/pm-engine-discover.png" alt="Lead PM Interrogation"/></p>
<p>The Lead PM persona doesn&#39;t write a single line of code. Instead, it hits you with &quot;brutal&quot; questions: <em>Who is this for? What is the one quantifiable pain point? What are we NOT building?</em></p>
<p>This friction is a feature, not a bug. By the time you get through these questions, you have a <code>PRD.md</code> that actually means something. It&#39;s the difference between a project that drifts into a mess of hallucinations and one that has a clear finish line.</p>
<h4 id="the-dual-brain-system">The Dual-Brain System</h4>
<p>The core of PM-Engine is simple: separate the <strong>Intent</strong> from the <strong>Execution</strong>.</p>
<ul>
<li><strong>The Product Engine (<code>PRD.md</code>)</strong>: The persistent memory of what we are building. It’s the boundary against scope creep.</li>
<li><strong>The Execution Engine (<code>STATE.md</code>)</strong>: A rigid state tracker that preserves context over long sessions.</li>
</ul>
<p>When you run <code>/plan</code>, a Staff Engineer takes the PRD and breaks it into a checklist. When you <code>/execute</code>, the agent is locked into only the active phase. It&#39;s physically unable to hallucinate future features because it doesn&#39;t &quot;see&quot; them yet.</p>
<h4 id="moving-with-intention">Moving with Intention</h4>
<p>Ultimately, I just wanted to build a framework that can be broadly consumed by anyone using Gemini-cli. I&#39;ve been using it for everything from scaffolding fast Astro sites to heavier backend work with inference layers, etc. (more on that coming soon), and it&#39;s been the first time working with an agent where I felt in control of the architectural drift.</p>
<p>Available on <a href="https://www.npmjs.com/package/pm-engine"><svg width="1em" height="1em" data-icon="tabler:brand-npm">   <symbol id="ai:tabler:brand-npm" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M1 8h22v7H11v2H7v-2H1zm6 0v7m7-7v7m3-4v4M4 11v4m7-4v1m9-1v4"/></symbol><use href="#ai:tabler:brand-npm"></use>  </svg></a> and <a href="https://pypi.org/project/pm-engine/"><svg width="1em" height="1em" data-icon="tabler:brand-python">   <symbol id="ai:tabler:brand-python" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M12 9H5a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h3m4-2h7a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3"/><path d="M8 9V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2v-4m-5-9v.01M13 18v.01"/></g></symbol><use href="#ai:tabler:brand-python"></use>  </svg></a> now. GitHub repo with all the details on how to get started: <a href="https://github.com/uramawat/pm-engine"><svg width="1em" height="1em" data-icon="tabler:brand-github">   <symbol id="ai:tabler:brand-github" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2c2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2a4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6c-.6.6-.6 1.2-.5 2V21"/></symbol><use href="#ai:tabler:brand-github"></use>  </svg></a></p>
<p>This might be the most PM thing of all time I&#39;ve done. Giving my AI its own bespoke PM. <svg width="1em" height="1em" data-icon="tabler:robot">   <symbol id="ai:tabler:robot" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 6a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2zm6-4v2m-3 8v9m6-9v9M5 16l4-2m6 0l4 2M9 18h6M10 8v.01M14 8v.01"/></symbol><use href="#ai:tabler:robot"></use>  </svg></p>]]></content:encoded>
			<pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
			<category>tools</category><category>ai</category><category>experimenting</category>
		</item>
		<item>
			<title>Linear is very opinionated, and its a good thing</title>
			<link>https://ramawat.fyi/blog/linear/</link>
			<guid>https://ramawat.fyi/blog/linear/</guid>
			<description>Very clear and concise</description>
			<content:encoded><![CDATA[<blockquote>
<p>Diamonds are forever, but so is radar - Udit, 2019</p>
</blockquote>
<p>Very early on while working at Apple, it became evident to me that the company runs on Radar - quite figuratively and literally! If an issue wasn&#39;t a Radar, it wasn&#39;t going to be actioned on. I myself championed that ethos with quite a bit of vigor the more time I spent at <svg width="1em" height="1em" data-icon="tabler:brand-apple">   <symbol id="ai:tabler:brand-apple" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.286 7.008C5.07 7.008 4 10.238 4 12.928C4 16.157 6.143 21 8.286 21c1.165-.05 1.799-.538 3.214-.538c1.406 0 1.607.538 3.214.538S19 17.771 19 15.619c-.03-.011-2.649-.434-2.679-3.23c-.02-2.335 2.589-3.179 2.679-3.228c-1.096-1.606-3.162-2.113-3.75-2.153c-1.535-.12-3.032 1.077-3.75 1.077c-.729 0-2.036-1.077-3.214-1.077M12 4a2 2 0 0 0 2-2a2 2 0 0 0-2 2"/></symbol><use href="#ai:tabler:brand-apple"></use>  </svg>.</p>
<h4 id="radar-is-everywhere">Radar is everywhere</h4>
<p><a href="https://theapplewiki.com/wiki/Radar">Radar</a> is Apple&#39;s internal bug tracking system. Built by Apple, for Apple. I won&#39;t go into details around what it did, but it was the single source of truth for everything that needed to be done. What made it so incredibly effective wasn&#39;t necessarily its UI—it was the uncompromising enforcement of its use. Everyone used it - whether you were an engineer, manager, or a designer. There was no escaping it. Furthermore there was some very good role modeling from the senior leaders within the company, so A+ on that.</p>
<h4 id="enter-linear">Enter Linear</h4>
<p>When I left Apple in the summer of last year, I was naturally curious as to what the new normal was for task tracking at my new job. I had heard good things about Linear and been a fan of the work <a href="https://www.linkedin.com/in/karrisaarinen/">Karri</a> had done at Airbnb and Coinbase. So naturally I was itching to try Linear and see if it was as good as advertised.</p>
<h4 id="what-linear-does-better">What Linear does better</h4>
<ul>
<li>Triage Intelligence: This is pure magic. It automatically categorizes, routes, and groups issues, saving me and engineers hours of manual sorting.</li>
<li>Asks: Managing the chaotic influx of Slack requests has always been a nightmare. Linear&#39;s &quot;Asks&quot; feature seamlessly bridges ad-hoc communication with structured issue tracking.</li>
<li>Granularity per Team: Radar forced a monolithic structure. Linear allows incredible granularity with custom settings per team, allowing different pods to vibe safely with their own workflows while remaining connected to the broader org.</li>
<li>Seamless Integrations: It plugs into everything we use effortlessly, acting as a modern hub rather than an isolated silo. So from repos on Github, to Slack Channels, Figma, etc. you name it - and it&#39;s highly likely that the integration exists.</li>
</ul>
<p>Despite the aesthetic and experience differences, both tools succeed for the same fundamental reason: they are the absolute source of truth. Both require strong cultural buy-in. An empty Linear workspace is just as useless as a neglected Radar queue (I&#39;ve been at the receiving end, so I know the pain).</p>
<h4 id="room-for-improvement">Room for Improvement</h4>
<p>As much as I love Linear, it isn&#39;t perfect, especially when handling massive organizational oversight:</p>
<ul>
<li>Roadmaps and Initiatives: Building long-term roadmaps in Linear still feels like it&#39;s lacking the robustness needed for massive, multi-year, cross-functional bets.</li>
<li>The Transparency Trade-off: Initiatives in Linear are inherently public across the workspace. While this default-to-transparency is generally fantastic for startups, it can be tricky for organizations that require siloed visibility or strict need-to-know access control—something Radar handled implicitly due to Apple&#39;s internal operating model.</li>
</ul>
<h4 id="tldr">TLDR</h4>
<p>Linear is a fantastic, well-designed and intentional product that should be a must for all product teams looking to move with intention.</p>]]></content:encoded>
			<pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
			<category>tools</category>
		</item>
		<item>
			<title>Transcendent Experience</title>
			<link>https://ramawat.fyi/blog/gluttony/</link>
			<guid>https://ramawat.fyi/blog/gluttony/</guid>
			<description>Perks of being a gourmand</description>
			<content:encoded><![CDATA[<p>I&#39;ve been meaning to write about this for a while, but the hestitation has always held me back. I&#39;m not a professional food critic. In fact, I&#39;m not a professional food <em>anything</em>! Though, I might contest for a professional eater, but my prowess pales in comparison to legends like <a href="https://en.wikipedia.org/wiki/Joey_Chestnut">Joey Chestnut</a> or <a href="https://en.wikipedia.org/wiki/Takeru_Kobayashi">Tsunami Kobayashi</a>.</p>
<p>In my constant zest to explore everything the world of Food &amp; Beverage has to offer, I&#39;ve been lucky enough to dine at a few <svg width="1em" height="1em" data-icon="tabler:michelin-star">   <symbol id="ai:tabler:michelin-star" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14.792 17.063c0 .337.057.618.057.9c0 1.8-1.238 3.037-2.982 3.037c-1.8 0-2.98-1.238-2.98-3.206v-.731c-.957.675-1.576.9-2.42.9c-1.518 0-2.925-1.463-2.925-3.094c0-1.181.844-2.194 2.082-2.756l.28-.113c-1.574-.787-2.362-1.688-2.362-2.925c0-1.687 1.294-3.094 2.925-3.094c.675 0 1.52.338 2.138.788l.281.112c0-.337-.056-.619-.056-.844C8.83 4.237 10.067 3 11.81 3c1.8 0 2.981 1.237 2.981 3.206V6.6l-.056.281c.956-.675 1.575-.9 2.419-.9c1.519 0 2.925 1.463 2.925 3.094c0 1.181-.844 2.194-2.081 2.756l-.282.169c1.575.787 2.363 1.688 2.363 2.925c0 1.688-1.294 3.094-2.925 3.094c-.675 0-1.575-.281-2.138-.788z"/></symbol><use href="#ai:tabler:michelin-star"></use>  </svg>
restaurants and I feel like these small sojourns into high-end gastronomy always leave a profound impact.</p>
<p>My wife and I recently had an amazing dinner at <a href="https://www.instagram.com/birdsong_sf">Birdsong SF</a>. The whole evening was pretty incredible, but this one abalone dish left me speechless. We usually do one vegetarian and one regular tasting and I think we both came out on the upside with our selections and the reserve wine pairing. It was super fascinating to watch the orchestra of that immaculate kitchen play out in front of our eyes. We even had a quick discussion with Chef Bleidorn about the correct ratio of peanut butter to jelly in any good PB&amp;J sandwich!!</p>
<p>I think it was the sheer technique and skill of cookery of the abalone, which was beautifully accentuated by that warm salty broth, that did it for me. In that moment it made me realize why I was having such a visceral reaction to a bite of food - its&#39; the ability to evoke such emotions, transport you back to a moment in time, make you feel something you haven&#39;t felt in a long time, that&#39;s the magic of food. Being able to share that with someone you love and care about deeply, just elevates it even more.</p>
<p>There&#39;s definitely a few standout dishes and some incredible regulars, that immediately transport back to the moment. In no particular order:</p>
<ul>
<li>Gnochhi at <a href="https://eatatfig.com/">Fig</a></li>
<li>Ridged pasta at <a href="https://www.acquerellosf.com/seasonal-tasting-menu">Acquerello</a></li>
<li>Everthing Bagels at <a href="https://www.saratoga-bagels.com/">Saratoga Bagels</a></li>
<li>Slice of the original at <a href="https://www.scarrspizza.com/menus/">Scarr&#39;s Pizza</a></li>
<li>BBQ at <a href="https://www.micklethwaitcraftmeats.com/">Micklethwait Craft Meats</a> — Hard to pick one thing lol</li>
</ul>]]></content:encoded>
			<pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
			<category>food</category>
		</item>
		<item>
			<title>Ideation to Launch at Warpspeed</title>
			<link>https://ramawat.fyi/blog/helpfulgremlin/</link>
			<guid>https://ramawat.fyi/blog/helpfulgremlin/</guid>
			<description>Trying to vibe safely before you git push</description>
			<content:encoded><![CDATA[<p>This title doesn’t really stand out if you’re in tech. In this <em>all gas, no brakes</em> phase, it’s very easy to not being cognizant of if things are falling through the cracks.</p>
<p>With the <a href="https://github.com/moltbot/moltbot">recent</a> <a href="https://www.theregister.com/2026/01/27/clawdbot_moltbot_security_concerns/">storeis</a> about <del>ClawdBot</del> MoltBot, a very clear pattern has emerged - moving so fast comes with some apparent risks where tokens and credentials are left out in the wild. And that got the wheels churing in my head..</p>
<h4 id="problem-definition">Problem Definition</h4>
<ul>
<li>A clear and intuitive way to get confidence that the code being pushed to a repository won’t leak anything that shouldn’t be out in the world. Think API keys, tokens, etc.</li>
</ul>
<h4 id="key-requirements">Key Requirements</h4>
<ul>
<li>Should work with <a href="https://docs.astral.sh/uv/">uv</a></li>
<li>Ease of use in terms of instantiating the tool</li>
<li>Provide helpful descriptions for identitified issues</li>
<li>Distribute this package via pypi so it can be used by anybody. <a href="https://pypi.org/project/helpfulgremlin/"><code>helpfulGremlin</code></a> available now!</li>
</ul>
<h4 id="solution">Solution</h4>
<p>Using Antigravity + Gemini 3 has truly been really impactful for my personal workflows. After a few targeted prompts, I had a MVP up and running in no time.</p>
<blockquote>
<p>I would be remiss if I dind’t shout out to Claude, which I use very religiously at work. It’s fun to evaluate different agentic solutions to see how they’re both unique.</p>
</blockquote>
<ul>
<li>
<p><code>main.py</code>
— (The Conductor): The CLI entry point built with Typer and Rich. It orchestrates the entire process—spinning up a process pool to scan files in parallel, displaying a real-time progress bar, and rendering the final report table with remediation advice.</p>
</li>
<li>
<p><code>scanner.py</code>
— (The Navigator): Responsible for efficiently traversing the file system. It handles the gritty work of parsing</p>
</li>
<li>
<p><code>detector.py</code>
—(The Brain): The core detection engine. It loads regex signatures (specified in the <code>patterns.yaml</code> file) and implements a Shannon entropy algorithm to flag high-randomness strings (like generic passwords) that don’t match known patterns.</p>
</li>
</ul>
<p>Details of the package on <a href="https://github.com/uramawat/helpfulGremlin">Github</a> README</p>]]></content:encoded>
			<pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
			<category>experimenting</category><category>tools</category><category>ai</category>
		</item>
		<item>
			<title>Rabbithole of wanting to switch</title>
			<link>https://ramawat.fyi/blog/hosting-site/</link>
			<guid>https://ramawat.fyi/blog/hosting-site/</guid>
			<description>Different Hosting environments and evolving tech</description>
			<content:encoded><![CDATA[<p>I still remember when WordPress used to be all the rage. Those were <em>the days</em> as some would put it. The overall thought around having a website or a blog has changed a lot since then.</p>
<p>Having gone through this rite of passage of</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>Blogger --> Wordpress --> CSS/HTML hosted static site(s) --> Hugo on Firebase --> ... this?</span></span></code></pre>
<h4 id="why-have-your-own-website-in-the-first-place-whats-the-intrinsic-value-here">Why have your own website in the first place? What’s the intrinsic value here?</h4>
<p>I’m a big believer in an evidence of impact style of doing things. Having an outlet to comprehensively document, and reflect back like one would with a compendium, is something pretty neat.</p>
<p>And then there’s the tighter control over the content, layout and overall end result when I am managing the entire end-to-end deployment. There’s something about the utility of tinkering which has always been a big draw.  Not to say this is anything too drastic (simple Astro template with minor changes and hosted on Vercel)</p>
<h4 id="what-are-you-going-to-write-about">What are you going to write about?</h4>
<p>Mostly about things I’m experiementing with on my machine, learning recently or general observations over time. No specific theme per say.</p>]]></content:encoded>
			<pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate>
			<category>infrastructure</category>
		</item>
	</channel>
</rss>