<?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: coolcorexix</title>
    <description>The latest articles on DEV Community by coolcorexix (@coolcorexix).</description>
    <link>https://dev.to/coolcorexix</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F585388%2F1fe78662-aeec-4285-9f3a-427688d99791.jpeg</url>
      <title>DEV Community: coolcorexix</title>
      <link>https://dev.to/coolcorexix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coolcorexix"/>
    <language>en</language>
    <item>
      <title>I had 1,063 Claude Code conversations and couldn't find anything — so I built claude-grep</title>
      <dc:creator>coolcorexix</dc:creator>
      <pubDate>Thu, 04 Jun 2026 14:24:13 +0000</pubDate>
      <link>https://dev.to/coolcorexix/i-had-1063-claude-code-conversations-and-couldnt-find-anything-so-i-built-claude-grep-45k2</link>
      <guid>https://dev.to/coolcorexix/i-had-1063-claude-code-conversations-and-couldnt-find-anything-so-i-built-claude-grep-45k2</guid>
      <description>&lt;p&gt;I use Claude Code a &lt;em&gt;lot&lt;/em&gt;. Enough that when I finally counted, I had &lt;strong&gt;1,063 conversations&lt;/strong&gt; sitting in &lt;code&gt;~/.claude/projects/&lt;/code&gt; — around 256 MB of JSONL transcripts.&lt;/p&gt;

&lt;p&gt;And I could never find the one I needed.&lt;/p&gt;

&lt;p&gt;You know the feeling: &lt;em&gt;"I definitely solved this exact bug a few weeks ago… in some conversation… somewhere."&lt;/em&gt; But Claude Code's built-in &lt;code&gt;--resume&lt;/code&gt; picker only matches on a session's &lt;strong&gt;title&lt;/strong&gt; (its first prompt). It has no idea what was actually &lt;em&gt;said&lt;/em&gt; inside. So the conversation where I'd figured out the gnarly thing was, in practice, gone.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://github.com/coolcorexix/claude-grep" rel="noopener noreferrer"&gt;claude-grep&lt;/a&gt;&lt;/strong&gt;: live search across your entire Claude Code history, with one keypress to jump back into any conversation.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You type, and results stream in as you go. Each row shows the matched snippet with your phrase highlighted, the conversation's working directory, and when it happened. Hit &lt;code&gt;Enter&lt;/code&gt; and it &lt;code&gt;cd&lt;/code&gt;s into that project and runs &lt;code&gt;claude --resume&lt;/code&gt; on the right session — you're back exactly where you left off.&lt;/p&gt;

&lt;p&gt;Under the hood it's deliberately boring and fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ripgrep&lt;/strong&gt; does the first pass, narrowing 1,000+ transcripts to candidates in milliseconds.&lt;/li&gt;
&lt;li&gt;A small &lt;strong&gt;Python&lt;/strong&gt; layer parses only those candidates to pull clean, highlighted snippets out of the JSONL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fzf&lt;/strong&gt; drives the UI using the &lt;code&gt;--disabled&lt;/code&gt; + &lt;code&gt;change:reload&lt;/code&gt; trick — fzf re-runs the search on every keystroke instead of fuzzy-filtering what's already on screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No index to build, nothing running in the background. It just reads the files Claude Code already writes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that nearly killed it: sub-agents
&lt;/h2&gt;

&lt;p&gt;When I first wired up "press Enter to resume," a bunch of conversations simply wouldn't open.&lt;/p&gt;

&lt;p&gt;It turns out &lt;strong&gt;940 of my 1,063 transcript files were sub-agent sessions&lt;/strong&gt; — the side conversations Claude Code spawns to handle sub-tasks. They live here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/projects/&amp;lt;project&amp;gt;/&amp;lt;PARENT-UUID&amp;gt;/subagents/agent-*.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and they are &lt;strong&gt;not resumable&lt;/strong&gt; on their own. &lt;code&gt;claude --resume agent-abc123&lt;/code&gt; does nothing.&lt;/p&gt;

&lt;p&gt;But the path gives it away: the parent session's UUID is &lt;em&gt;literally the directory name above&lt;/em&gt; &lt;code&gt;subagents/&lt;/code&gt;. (It's also stored in the file's &lt;code&gt;sessionId&lt;/code&gt; field, alongside &lt;code&gt;isSidechain: true&lt;/code&gt;.) So when a match lands inside a sub-agent transcript, claude-grep resolves it to the parent and resumes &lt;strong&gt;that&lt;/strong&gt; — using the parent's working directory, so it even survives sub-agents that ran in a since-deleted git worktree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resumable_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;parent_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subagents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# sub-agent transcript → resume the parent session instead
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent_dir&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.jsonl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results then get de-duplicated by resumable session, so you never see two rows that open the same conversation.&lt;/p&gt;

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

&lt;p&gt;You'll need &lt;code&gt;fzf&lt;/code&gt;, &lt;code&gt;ripgrep&lt;/code&gt;, Python 3, and the &lt;code&gt;claude&lt;/code&gt; CLI on your &lt;code&gt;PATH&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/coolcorexix/claude-grep.git
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/claude-grep/ccfind"&lt;/span&gt; ~/.local/bin/ccfind   &lt;span class="c"&gt;# ~/.local/bin must be on PATH&lt;/span&gt;
ccfind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's MIT-licensed and a single Python script — read it, fork it, rip out the parts you like.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/coolcorexix/claude-grep" rel="noopener noreferrer"&gt;github.com/coolcorexix/claude-grep&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you live in Claude Code as much as I do, I'd love to hear what you search for first — and if you hit a transcript shape it chokes on, open an issue. There are a &lt;em&gt;lot&lt;/em&gt; of edge cases hiding in those JSONL files.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Benefits of mouse-less habit</title>
      <dc:creator>coolcorexix</dc:creator>
      <pubDate>Wed, 24 Feb 2021 09:36:47 +0000</pubDate>
      <link>https://dev.to/coolcorexix/benefits-of-mouse-less-habit-16a0</link>
      <guid>https://dev.to/coolcorexix/benefits-of-mouse-less-habit-16a0</guid>
      <description>&lt;p&gt;Dashing through your keyboard from start to end of a task is no easy yet worth practicing skill for developers with several pluses that I figured out myself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zone in with your keyboard:&lt;/strong&gt;&lt;br&gt;
Using just the keyboard once you are used to it is both comfortable and stylish. Especially in the case of using mech keyboard, I am sure there is no better way to flex on a top keyboard than to do everything with it: browsing web, coding and formatting report, you tell me. After all, it made the developer feel distinguished among other jobs in the way we use computer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less eye movement , less redundant action&lt;/strong&gt;&lt;br&gt;
The eyes will immediately focus on where your action happen instead of tracking the mouse cursor from point A to point B. You also need to think on what you need to do next more mindfully rather than just move the mouse around mindlessly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;From “Do-Think-Redo” to “Think-Do-Rethink”&lt;/strong&gt;&lt;br&gt;
Whenever holding a mouse, it is normal that we move them around for a while before we know what to click next, and sometimes you just click where it is convenient not where necessary, and then after the click we move the cursor some more to figure out what to do next of next. This habit accumulatively cost us a lots of time between each action if ‘make the mouse move’ is the default first action — an action that is muscle-memorized, making you act as reflex rather than being rational. With only just the keyboard, you will have to think on what you want to do next before you press because it is not just a left/right mouse click — it has to be the exact shortcut you want to use or the location and name of the file your want to navigate to. Working with keyboard require you to get familiar with your IDE, file naming and folder structure, resorting more of brain-memory resource so that the action afterward can be effective and precise. And as an unexpected result, it will also improve your flow with mouse because you already reengineer to your &lt;strong&gt;“Do-Think-Redo”&lt;/strong&gt; to &lt;strong&gt;“Think-Do-Rethink’.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final words:
&lt;/h2&gt;

&lt;p&gt;Mouse-less habit might be counterintuitive when you first start adopting but when you can apply, even just partially, on your daily lives the experience is very rewarding — just like the keyboard is your new extended/ optimized just for using computer arm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus:
&lt;/h3&gt;

&lt;p&gt;Try out this plugin to use your browser more with keyboard &lt;a href="https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=en"&gt;here&lt;/a&gt;, I mean.. just keyboarding everything, seriously muahahaha&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
  </channel>
</rss>
