<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kandeepa Sundaram</title>
    <description>The latest articles on DEV Community by Kandeepa Sundaram (@kandeepa_sundaram).</description>
    <link>https://dev.to/kandeepa_sundaram</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3997112%2Fcef20e04-b62e-4291-b18a-24f4436e8df0.jpg</url>
      <title>DEV Community: Kandeepa Sundaram</title>
      <link>https://dev.to/kandeepa_sundaram</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kandeepa_sundaram"/>
    <language>en</language>
    <item>
      <title>Who Am I?</title>
      <dc:creator>Kandeepa Sundaram</dc:creator>
      <pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/kandeepa_sundaram/who-am-i-4iao</link>
      <guid>https://dev.to/kandeepa_sundaram/who-am-i-4iao</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The cognitive tax of Git identity management — and how I fixed it&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I still ask myself this question before every commit: &lt;em&gt;Who am I right now?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That hesitation. The finger pause. Not philosophy. Just &lt;del&gt;Gut&lt;/del&gt; Git feeling.&lt;/p&gt;

&lt;p&gt;I've pushed personal commits to client repos. I've also done the reverse — work identity on open-source PRs. Nothing broke immediately. But in regulated environments, that wrong name starts an audit conversation nobody wants to have.&lt;/p&gt;

&lt;p&gt;After nearly two decades of this, I've realised the most expensive bugs aren't in the code. They're in the seams &lt;em&gt;around&lt;/em&gt; it. Git identity is one of those seams. And almost nobody talks about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Flavours of This Pain
&lt;/h2&gt;

&lt;p&gt;Here's the thing: I don't work under a single identity anymore. Neither do you.&lt;/p&gt;

&lt;p&gt;One hour I'm pushing to my company's GitHub org. Next, I'm debugging a freelance client's GitLab repo. Then I'm patching an open-source project I maintain. Each one expects a different email, a different SSH key, maybe a GPG signature if the org requires signed commits.&lt;/p&gt;

&lt;p&gt;Git is brilliant at tracking changes. It's terrible at tracking &lt;em&gt;intent&lt;/em&gt;. It doesn't know who I meant to be — it just uses whatever profile happened to be active last. That gap? That's where the friction lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The wrong name on a commit.&lt;/strong&gt; You write an hour of code, push, and someone pings you: "Hey, this came from your personal account." Now you're amending, force-pushing, and explaining yourself to someone who doesn't care about Git — they just want the fix. The code was fine. The identity wasn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The endless shuffle.&lt;/strong&gt; &lt;code&gt;git config user.email "work@company.com"&lt;/code&gt;. Later: &lt;code&gt;git config user.email "me@gmail.com"&lt;/code&gt;. Each switch takes ten seconds. Over a year, that's hours. And one forgotten switch undoes all of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key chaos.&lt;/strong&gt; Separate SSH keys per account. Signed-commit requirements per org. Pick the wrong one, and your ten-second commit turns into a debugging session or a rejected pipeline. You're not writing code anymore — you're playing key-ring roulette.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cognitive tax.&lt;/strong&gt; This is the one that hurts most. It's not the time. It's the interruption — that fraction of a second where your brain leaves the problem you were solving and asks: &lt;em&gt;am I the right person right now?&lt;/em&gt; That fracture in flow state is more expensive than any of the others. Because you don't just lose the seconds. You lose the immersion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The DIY Rabbit Hole
&lt;/h2&gt;

&lt;p&gt;I did the math one week. By Wednesday, I'd already lost count.&lt;/p&gt;

&lt;p&gt;Not because I'm disorganised. Because every repo, every client, every org has its own rules — and Git, for all its brilliance, has no mechanism to say &lt;em&gt;"you're in the work directory, here's your work hat."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I tried to fix it the way any engineer would. Aliases. Shell scripts. A half-baked &lt;code&gt;direnv&lt;/code&gt; setup that worked 80% of the time and failed catastrophically the other 20. Each time, I'd patch one hole, and a new context would open up — different SSH key, stricter GPG policy, a client who wanted commits signed with their specific subkey.&lt;/p&gt;

&lt;p&gt;I even tried the obvious shortcut: &lt;code&gt;gh auth switch&lt;/code&gt;. It's a toggle. You flip it, it changes your GitHub context, but it doesn't touch your global Git config. It doesn't remember that this directory needs a specific SSH agent. It doesn't manage GPG signatures. It's a solution for bouncing between GitHub accounts — but it doesn't solve the core cognitive problem: the decision-making. A manual light switch when I needed a motion sensor.&lt;/p&gt;

&lt;p&gt;But the real WTF? It wasn't any of that. It was realising I'd just accepted this as normal. Like pausing before every push to mentally run a checklist was just... part of the job.&lt;/p&gt;

&lt;p&gt;That's when I stopped blaming myself and started looking at the seam.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Organizational Paper-Cut
&lt;/h2&gt;

&lt;p&gt;And I'm not alone in this. What's a paper-cut for me is a process cost at scale.&lt;/p&gt;

&lt;p&gt;Senior engineers burn time on other people's auth failures. New hires lose their first hour to Git setup instead of shipping code. In regulated environments, a mis-attributed commit isn't just embarrassing — it's an audit flag. The individual friction becomes organizational drag.&lt;/p&gt;

&lt;p&gt;The code is almost never the problem. The identity attached to it is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Grit
&lt;/h2&gt;

&lt;p&gt;So I built something that sits exactly at that seam.&lt;/p&gt;

&lt;p&gt;Not another wrapper. Not a custom Git command you have to remember. A background daemon that watches where you're working and applies the right identity &lt;em&gt;before&lt;/em&gt; you commit. Automatically.&lt;/p&gt;

&lt;p&gt;I called it Grit.&lt;/p&gt;

&lt;p&gt;The design was simple: &lt;strong&gt;make the decision once, then forget it exists.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of switching configs manually, Grit remembers which identity belongs to which context. You tell it once — "this directory is work, this remote is my open-source account, this repo needs a signed commit" — and it handles the rest.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Actually Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Detection rules.&lt;/strong&gt; Define patterns once — directory paths, remote URLs, even repo names. Grit matches where you are and applies the right profile. No commands, no toggles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/work/bank-client/*     → Work Profile (SSH: work-key, GPG: on)
~/oss/*                  → Personal Profile (SSH: personal-key, GPG: off)
github.com/my-company/*  → Corporate Profile (signed commits required)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pre-commit protection.&lt;/strong&gt; This is the part I'm most proud of. A Git hook that verifies your identity &lt;em&gt;before&lt;/em&gt; the commit is created, not after you've already pushed and someone points out the mistake. It's defense-in-depth — the daemon handles the happy path, the hook guards the edge cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-profile keys.&lt;/strong&gt; Each identity carries its own SSH key and GPG signing config. No more debugging which agent loaded which key. No more rejected pipelines because you used the wrong signature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session memory.&lt;/strong&gt; Grit restores the right identity when you return to a repo. Open a project you haven't touched in months — it picks up where you left off.&lt;/p&gt;

&lt;p&gt;And it runs quietly in the background. Windows, Linux, macOS. Offline-first. No cloud, no telemetry, no account required.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hard Part
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't the switching. That's one shell command. The challenge was building a decision engine that handles ambiguity gracefully.&lt;/p&gt;

&lt;p&gt;What happens when a path matches two rules? What if there's no rule? What if the remote URL doesn't match anything I've defined?&lt;/p&gt;

&lt;p&gt;I built a fallback chain: explicit &lt;code&gt;.grit&lt;/code&gt; file in the repo → directory rules → remote patterns → explicit session override → global config. There's always a fallback, and you always know which one applied.&lt;/p&gt;

&lt;p&gt;That's the architectural muscle I've spent two decades building — pointed at a paper-cut I lived with every single day.&lt;/p&gt;




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

&lt;p&gt;It's on PyPI if you want to give it a shot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;grit-cli

grit setup            &lt;span class="c"&gt;# one-time init&lt;/span&gt;
grit profile add      &lt;span class="c"&gt;# add your identities&lt;/span&gt;
grit session &lt;span class="nb"&gt;set &lt;/span&gt;work &lt;span class="c"&gt;# set context for this repo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once your detection rules are in place, you stop running these commands. Grit just... works.&lt;/p&gt;

&lt;p&gt;The best developer tools are the ones you stop noticing. Software is complex enough; the right Git identity should just be applied, every time, without costing you a single thought.&lt;/p&gt;

&lt;p&gt;Grit is MIT-licensed and open source. Try it on your messiest repo today. If it breaks, open an issue — I'm fixing things within 24 hours right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Kandeepasundaram/Grit" rel="noopener noreferrer"&gt;See the code on GitHub →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you've ever force-pushed to fix a wrong-identity commit — what happened? I'd genuinely love to hear it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>productivity</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
