<?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: Echo</title>
    <description>The latest articles on DEV Community by Echo (@uzoma_uche_3ec83974b4a8a5).</description>
    <link>https://dev.to/uzoma_uche_3ec83974b4a8a5</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%2F3963184%2F38df0f24-e679-46cb-8291-42e8b896586c.png</url>
      <title>DEV Community: Echo</title>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uzoma_uche_3ec83974b4a8a5"/>
    <language>en</language>
    <item>
      <title>Why I built a small desktop app to stop losing my Claude Code sessions</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Wed, 03 Jun 2026 05:00:22 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/why-i-built-a-small-desktop-app-to-stop-losing-my-claude-code-sessions-2i86</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/why-i-built-a-small-desktop-app-to-stop-losing-my-claude-code-sessions-2i86</guid>
      <description>&lt;p&gt;This is a builder note, not a launch post. I am writing it because the project is now at v0.2.18, and the question I keep getting asked in private is: why a desktop app, why Tauri, why not just a web app?&lt;/p&gt;

&lt;p&gt;Here is the honest answer.&lt;/p&gt;

&lt;p&gt;The trigger was small. I had twelve repos I was actively using Claude Code on. One afternoon I wanted to recover a session from three weeks ago, in a repo I had not touched in a month. I knew what I had asked the model to do. I did not know which of the twelve project folders under &lt;code&gt;~/.claude/projects/&lt;/code&gt; the session lived in, and I did not remember the timestamp.&lt;/p&gt;

&lt;p&gt;The session was technically on disk. I just could not find it. That gap (the data exists, but the index is missing) is what I wanted to close.&lt;/p&gt;

&lt;p&gt;The first version of &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;Shelf&lt;/a&gt; was 200 lines of Python and a SQLite table. It just listed every session in every project, sorted by mtime. I could grep the table. That alone was useful.&lt;/p&gt;

&lt;p&gt;The current version is a Tauri app (Rust + WebView). The reason I switched from a CLI to a desktop app was not aesthetics. It was because the actual use case has three sub-tasks that are awkward on a terminal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scan, then &lt;em&gt;show&lt;/em&gt; the result in a way that surfaces "this is the session that touched file X" without me having to open the JSONL.&lt;/li&gt;
&lt;li&gt;One click to resume the session. Claude Code's CLI resume is fine if you know the id, but you never know the id.&lt;/li&gt;
&lt;li&gt;Work on more than one project at once. The terminal is great for one project. It is bad at three.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Local, not cloud, was a deliberate choice. The session files contain everything I have ever typed into a model, including private notes about my own work. I do not want a server roundtrip just to read my own data. Tauri was the smallest path to a real desktop app I could ship and maintain myself.&lt;/p&gt;

&lt;p&gt;If you have ever grepped &lt;code&gt;~/.claude/projects/*/*.jsonl&lt;/code&gt; and felt like that should not be the answer, the project is here: &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt;. Pull it apart, tell me what is wrong, fork it, do not use it, all of the above.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>tauri</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Found a tool that finally organizes my Claude Code chaos</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:03:17 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/found-a-tool-that-finally-organizes-my-claude-code-chaos-1672</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/found-a-tool-that-finally-organizes-my-claude-code-chaos-1672</guid>
      <description>&lt;p&gt;I have been using Claude Code for about ten months. The session organization story went something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Month 1: I closed a long session by accident. Lost 40 minutes of context.&lt;/li&gt;
&lt;li&gt;Month 3: I learned about &lt;code&gt;/resume&lt;/code&gt; and &lt;code&gt;/rename&lt;/code&gt;. Renamed every session I cared about.&lt;/li&gt;
&lt;li&gt;Month 5: I had 60+ named sessions across 8 projects. I could not remember the names. &lt;code&gt;/resume&lt;/code&gt; was useless.&lt;/li&gt;
&lt;li&gt;Month 7: I started grepping &lt;code&gt;~/.claude/projects/*/*.jsonl&lt;/code&gt;. Worked, but I never knew which project folder to grep first.&lt;/li&gt;
&lt;li&gt;Month 9: I just gave up and re-ran the work, slower.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest summary: Claude Code &lt;em&gt;saves&lt;/em&gt; everything. The problem is it does not help me &lt;em&gt;find&lt;/em&gt; anything.&lt;/p&gt;

&lt;p&gt;I have tried the obvious things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;terminal scrollback (gone when I close the tab)&lt;/li&gt;
&lt;li&gt;copying key bits to a "prompts" notes file (low fidelity)&lt;/li&gt;
&lt;li&gt;search by project name in &lt;code&gt;~/.claude/projects/&lt;/code&gt; (works but slow)&lt;/li&gt;
&lt;li&gt;AGENTS.md and CLAUDE.md (good for &lt;em&gt;future&lt;/em&gt; sessions, useless for &lt;em&gt;past&lt;/em&gt; ones)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I actually wanted: an indexed view of every session I ever ran, searchable by keyword, grouped by project, with one click to resume.&lt;/p&gt;

&lt;p&gt;Two months ago I started using &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;Shelf&lt;/a&gt;. It is a small Tauri desktop app (local, not cloud) that does exactly this: it scans &lt;code&gt;~/.claude/projects/&lt;/code&gt; and &lt;code&gt;~/.codex/sessions/&lt;/code&gt;, shows you every session as a card, lets you search across them, and reopens the right one when you click. It also keeps a per-project view so I can see "what was I doing in repo X last week" without grepping.&lt;/p&gt;

&lt;p&gt;Is it perfect? No. The startup scan is slow if you have a lot of sessions. The UI is functional, not beautiful. But it is the first thing I have used that actually matches the mental model I had for "find me the conversation where I solved Y".&lt;/p&gt;

&lt;p&gt;If your Claude Code history is more than a handful of weeks deep, you have probably already felt the pain. I would be curious what other people are doing.&lt;/p&gt;

&lt;p&gt;Tags: claudecode, codex, productivity, devtools, opensource&lt;/p&gt;

</description>
      <category>codex</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Three Small CLI Tools I Built to Make Claude Code Feel Less Like a Black Box</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 15:10:53 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/three-small-cli-tools-i-built-to-make-claude-code-feel-less-like-a-black-box-19ii</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/three-small-cli-tools-i-built-to-make-claude-code-feel-less-like-a-black-box-19ii</guid>
      <description>&lt;h1&gt;
  
  
  Three Small CLI Tools I Built to Make Claude Code Feel Less Like a Black Box
&lt;/h1&gt;

&lt;p&gt;The most common complaint I hear from teammates trying Claude Code for the first time is not "the model is bad". It is "I do not know what the model is doing". The session is opaque — a long scrollback of edits, reads, and bash calls, with no way to skim it or to see at a glance where the last 30 minutes went.&lt;/p&gt;

&lt;p&gt;I built three small CLI tools to fix that. None of them are clever. All of them are under 200 lines. The first one I should have built years ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;code&gt;cc-tail&lt;/code&gt; — stream the last N tool calls
&lt;/h2&gt;

&lt;p&gt;The first thing every new Claude Code user wants is a way to see the recent activity. The scrollback is too long to read every time, and the inline UI does not give a summary view. So I wrote a 50-line script that tails the JSONL log under &lt;code&gt;~/.claude/projects/&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;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# cc-tail — show the last N tool calls from the active project&lt;/span&gt;
&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;LATEST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl 2&amp;gt;/dev/null | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LATEST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"no session log"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$N&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LATEST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'
import sys, json
for line in sys.stdin:
    try:
        e = json.loads(line)
        t = e.get("type", "")
        if t == "tool_use":
            name = e.get("name", "?")
            inp = e.get("input", {})
            arg = inp.get("file_path") or inp.get("command") or str(inp)[:60]
            print(f"[{e.get(\"timestamp\",\"\")[:19]}] {name}: {arg}")
        elif t == "user":
            content = e.get("message", {}).get("content", "")
            if isinstance(content, str):
                print(f"[{e.get(\"timestamp\",\"\")[:19]}] user: {content[:80]}")
    except Exception:
        pass
'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it as &lt;code&gt;cc-tail 20&lt;/code&gt; and you get a readable trace of the last 20 events. It is the difference between "I think the model is doing something weird" and "ah, it is grepping for the wrong path".&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;code&gt;cc-cost&lt;/code&gt; — session cost by project
&lt;/h2&gt;

&lt;p&gt;The Anthropic API returns token counts; the CLI shows them per turn. I wanted the &lt;em&gt;session&lt;/em&gt; total, grouped by project. So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# cc-cost — total cost of the current Claude Code session&lt;/span&gt;
&lt;span class="nv"&gt;LATEST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl 2&amp;gt;/dev/null | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import json
in_t = out_t = cache_r = cache_w = 0
with open('&lt;/span&gt;&lt;span class="nv"&gt;$LATEST&lt;/span&gt;&lt;span class="s2"&gt;') as f:
    for line in f:
        try: e = json.loads(line)
        except: continue
        u = e.get('message', {}).get('usage', {})
        in_t += u.get('input_tokens', 0)
        out_t += u.get('output_tokens', 0)
        cache_r += u.get('cache_read_input_tokens', 0)
        cache_w += u.get('cache_creation_input_tokens', 0)
# Sonnet 4.6 numbers as of writing
cost = in_t*3e-6 + out_t*15e-6 + cache_r*3e-7 + cache_w*3.75e-6
print(f'in: {in_t:,}  out: {out_t:,}  cache_r: {cache_r:,}  cache_w: {cache_w:,}')
print(f'approx cost: &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{cost:.2f}')
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is approximate. The point is that it is &lt;em&gt;honest&lt;/em&gt;. After running it once you stop guessing and start noticing which sessions are the expensive ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;code&gt;cc-where&lt;/code&gt; — where did the model touch the file system?
&lt;/h2&gt;

&lt;p&gt;Most regressions I have debugged were not "the model wrote the wrong code". They were "the model wrote the right code in the wrong place". A 30-line &lt;code&gt;cc-where&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;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# cc-where — list the unique file paths the latest session touched&lt;/span&gt;
&lt;span class="nv"&gt;LATEST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl 2&amp;gt;/dev/null | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s1"&gt;'"file_path":"[^"]+"'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LATEST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole tool. Pipe it through &lt;code&gt;wc -l&lt;/code&gt; and you get a number; pipe it through &lt;code&gt;xargs -I{} sh -c 'echo "$(git log -1 --format=%h {}) {}"'&lt;/code&gt; and you get a useful audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What these tools do not do
&lt;/h2&gt;

&lt;p&gt;They do not write to the session, do not change the model, do not require API keys. They are pure observers over the existing JSONL log. That is the point — most "Claude Code is opaque" complaints are really "I do not have a small read-only tool over the data that is already on disk". Once you have one, the opacity goes away.&lt;/p&gt;

&lt;p&gt;The hard part is the JSONL format is technically internal and changes between versions. These tools break once a quarter, and I rewrite them in 10 minutes when that happens. Worth it.&lt;/p&gt;

&lt;p&gt;Tags: claudecode, codex, cli, devtools, observability, ai&lt;/p&gt;

</description>
      <category>devtools</category>
    </item>
    <item>
      <title>Three PreToolUse Hooks I Stopped Using (and What Replaced Them)</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 13:38:11 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/three-pretooluse-hooks-i-stopped-using-and-what-replaced-them-5hg9</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/three-pretooluse-hooks-i-stopped-using-and-what-replaced-them-5hg9</guid>
      <description>&lt;h1&gt;
  
  
  Three PreToolUse Hooks I Stopped Using (and What Replaced Them)
&lt;/h1&gt;

&lt;p&gt;I have rolled out a lot of PreToolUse hooks over the last six months. Most of them were a mistake. Here are the three I removed and what I actually use now.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Don't edit files outside the project" hooks
&lt;/h2&gt;

&lt;p&gt;The hook would inspect &lt;code&gt;file_path&lt;/code&gt; in the Edit tool's arguments, check that it started with the project root, and short-circuit if it didn't. The intent was good — Claude Code does occasionally wander into &lt;code&gt;~/.zshrc&lt;/code&gt; if you let it — but the implementation was wrong.&lt;/p&gt;

&lt;p&gt;The cost was high: every single Edit, Read, Write, and Bash call paid the hook's regex + path check, even on the 99% of cases that were fine. The benefit was rare, and when it did fire, the model would just retry with a different path. The hook trained the model to be sneaky about file paths instead of being honest about wanting to touch them.&lt;/p&gt;

&lt;p&gt;What replaced it: a one-line rule in &lt;code&gt;CLAUDE.md&lt;/code&gt; that says "ask before editing anything outside this project's tree" and a SessionStart hook that prints the project root. The model has the rule, the session knows the boundary, and the per-call cost is zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. "Strip secrets from tool output" hooks
&lt;/h2&gt;

&lt;p&gt;This one looked important on paper. The PostToolUse hook would grep the tool result for &lt;code&gt;sk-&lt;/code&gt;, &lt;code&gt;AKIA&lt;/code&gt;, and other secret patterns and redact them. The model would then see &lt;code&gt;[REDACTED]&lt;/code&gt; and behave accordingly.&lt;/p&gt;

&lt;p&gt;The cost was even worse than the file-scope hook. A PostToolUse hook runs on every Bash, Read, and Edit result. The secret scanner did a regex over potentially huge outputs, and most of the work was wasted because no secret was actually there. When a real secret was in a log dump, the redaction usually happened on the wrong line — the secret was a few characters past where the regex stopped.&lt;/p&gt;

&lt;p&gt;What replaced it: a &lt;code&gt;.gitignore&lt;/code&gt; that includes &lt;code&gt;.env*&lt;/code&gt; plus a SessionStart hook that does a one-time &lt;code&gt;git log --diff-filter=A --name-only&lt;/code&gt; to make sure no &lt;code&gt;.env&lt;/code&gt; ever got committed in the first place. The model never sees the secret because it never tries to read it. The per-call cost is zero, and the redaction is correct because there is no redaction to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "Inject project context on every Read" hooks
&lt;/h2&gt;

&lt;p&gt;The intent was to give the model a per-file "this file is part of the auth module, treat it carefully" comment on every Read call. The hook would do a quick &lt;code&gt;git log&lt;/code&gt; and file-glob lookup and prepend a small context block to the tool output.&lt;/p&gt;

&lt;p&gt;The cost was the highest of the three. Reads are the most frequent tool call in a long session, and the &lt;code&gt;git log&lt;/code&gt; would itself trigger a Bash call on some setups, leading to recursive hook runs that I had to debug more than once. The benefit was marginal because the model rarely uses injected context when it appears in the middle of a file read — it focuses on the file content and ignores the prefix.&lt;/p&gt;

&lt;p&gt;What replaced it: a project-level &lt;code&gt;.claude/docs/&lt;/code&gt; directory of short canonical notes, and a &lt;code&gt;SessionStart&lt;/code&gt; hook that lists the available notes. The model reads the relevant note on demand, and the cost is one bash call per session, not one per Read.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I still use
&lt;/h2&gt;

&lt;p&gt;I kept two kinds of hooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SessionStart hooks&lt;/strong&gt; for environment checks (preflight, arch lint, dependency availability). They run once per session, the cost is amortized, and the failure mode is "session starts broken" instead of "model writes a bad line of code".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PreToolUse hooks for destructive Bash commands&lt;/strong&gt; — a tiny allowlist check for &lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;git push --force&lt;/code&gt;, &lt;code&gt;kubectl delete&lt;/code&gt;. The cost is one regex per Bash, the benefit is a hard stop on a class of mistakes that no prompt can reliably prevent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else I tried was a hook for a problem that was better solved with a &lt;code&gt;CLAUDE.md&lt;/code&gt; rule, a SessionStart script, or just letting the model do the work and trusting it.&lt;/p&gt;

&lt;p&gt;Tags: claudecode, codex, hooks, devtools, ai&lt;/p&gt;

</description>
      <category>devtools</category>
    </item>
    <item>
      <title>Why I Keep a Per-Project Investigation Log Outside Claude Code</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 12:30:08 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/why-i-keep-a-per-project-investigation-log-outside-claude-code-1ji6</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/why-i-keep-a-per-project-investigation-log-outside-claude-code-1ji6</guid>
      <description>&lt;h1&gt;
  
  
  Why I Keep a Per-Project Investigation Log Outside Claude Code
&lt;/h1&gt;

&lt;p&gt;After about six months of running Claude Code across multiple repos, I have stopped pretending that conversation history is enough.&lt;/p&gt;

&lt;p&gt;I still use Claude Code for almost everything. The in-conversation layer is excellent for "what should I do next" and "explain this error". The problem is what happens &lt;em&gt;after&lt;/em&gt; the conversation ends: I close the session, switch projects, come back two days later, and I cannot find the investigation I am sure I did.&lt;/p&gt;

&lt;p&gt;I tried three fixes, and the one that stuck is a per-project investigation log that lives outside the chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first attempt: rely on &lt;code&gt;/resume&lt;/code&gt; and session IDs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem was remembering the session ID. By the time I needed the old conversation, I had forgotten the project name, the date, the symptom, and the keyword that would distinguish it from the eleven other sessions I ran that week. &lt;code&gt;/resume&lt;/code&gt; works perfectly when you know what you are looking for. It does not help when the whole point of the search is "what was the keyword".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second attempt: dump important findings into &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem was that &lt;code&gt;CLAUDE.md&lt;/code&gt; is for behavior the model should follow &lt;em&gt;every run&lt;/em&gt;. A "we tried plan B, plan A was faster because of X" note does not belong in a file the model reads on every session start. The signal-to-noise ratio collapses within a month, and the file becomes a graveyard of one-off decisions. I had to admit that &lt;code&gt;CLAUDE.md&lt;/code&gt; is a constitution, not a journal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The third attempt: a per-project investigation log, written by hand, indexed by project.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The format is a single markdown file per project, with one short entry per "investigation": a problem, the path I took, the conclusion, and any links or commit hashes. I append to it from a tiny shell command, so writing an entry takes five seconds. I read it whenever I am about to start work on the project, the way I would read a colleague's handover note.&lt;/p&gt;

&lt;p&gt;The crucial detail is the &lt;em&gt;indexing&lt;/em&gt;. Entries are filed by project, not by tool. If I had used the "Claude Code session browser" route, the same investigation under Cursor or Codex would have been filed under a different tool, and the cross-tool lookups would still break. The project is the unit of search.&lt;/p&gt;

&lt;p&gt;What goes in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A one-line summary of the question.&lt;/li&gt;
&lt;li&gt;The decision I made and why.&lt;/li&gt;
&lt;li&gt;A link to the commit, the PR, or the conversation (if I remember it).&lt;/li&gt;
&lt;li&gt;Anything I want future-me to know — "don't redo this analysis, the bottleneck is in module X".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What stays out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anything that belongs in &lt;code&gt;CLAUDE.md&lt;/code&gt; (rules the model must follow every run).&lt;/li&gt;
&lt;li&gt;Long code excerpts. Paste a path and a line range instead.&lt;/li&gt;
&lt;li&gt;Anything private to one session. If it is not useful next month, it is not useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cheapest version of this is one markdown file per project, kept next to the code, with a short shell alias for appending. The richer version is a tool with a search box and a per-project filter. Both work. The richer one is what I am building as Shelf, because the manual approach broke down around eight projects.&lt;/p&gt;

&lt;p&gt;If you only have two or three projects, the manual approach is fine. The shell alias is two lines. The discipline is "write the entry the moment you decide", not "I will remember to do it later". You will not.&lt;/p&gt;

&lt;p&gt;Tags: claudecode, codex, devtools, productivity, workflow&lt;/p&gt;

&lt;p&gt;Shelf, the open-source desktop workspace we are building around Claude Code and Codex, is the project-level retrieval layer we use to find old investigations by project. The link is at&lt;br&gt;
&lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt; if you want to compare it to your current workflow.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>Subagents vs Hooks in Claude Code: Picking the Right Tool for the Right Job</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 11:29:00 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/subagents-vs-hooks-in-claude-code-picking-the-right-tool-for-the-right-job-29ke</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/subagents-vs-hooks-in-claude-code-picking-the-right-tool-for-the-right-job-29ke</guid>
      <description>&lt;h1&gt;
  
  
  Subagents vs Hooks in Claude Code: Picking the Right Tool for the Right Job
&lt;/h1&gt;

&lt;p&gt;The Claude Code subagent and the Claude Code hook look similar at a glance — both let you add "behavior the model should follow" — but they answer different questions, and using the wrong one is one of the most common ways teams end up with a sprawling &lt;code&gt;CLAUDE.md&lt;/code&gt; and a slow, leaky workflow.&lt;/p&gt;

&lt;p&gt;A short way to remember the difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subagent&lt;/strong&gt; = "do a separate scoped task and hand the result back." It is a worker with its own context, its own tool set, and a clean return path. It is good when the work is &lt;em&gt;parallelizable&lt;/em&gt; or &lt;em&gt;expensive to run inline&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hook&lt;/strong&gt; = "before/after this tool call, do something." It is a wrapper around the model's tool use. It is good when the work is &lt;em&gt;invariant enforcement&lt;/em&gt; — the same prep or cleanup every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Five questions to pick the right one for any new behavior you want to add:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does the work need a different context? If yes, subagent.&lt;/li&gt;
&lt;li&gt;Does the work need different tools (or sandboxing)? If yes, subagent.&lt;/li&gt;
&lt;li&gt;Is the trigger "the model called a tool"? If yes, hook.&lt;/li&gt;
&lt;li&gt;Is the work about enforcing a constraint the user can forget (formatting, file scope, secrets)? If yes, hook.&lt;/li&gt;
&lt;li&gt;Is the work about &lt;em&gt;producing something&lt;/em&gt; the main thread will use? If yes, subagent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Things that look like subagents but should be hooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Always run &lt;code&gt;pnpm format&lt;/code&gt; after every Edit." Hook.&lt;/li&gt;
&lt;li&gt;"Always run the test suite before declaring done." Hook.&lt;/li&gt;
&lt;li&gt;"Always run &lt;code&gt;git status&lt;/code&gt; before any commit." Hook.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Things that look like hooks but should be subagents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Summarize a long PDF and put the summary in the chat." Subagent — it needs different tools and its own context.&lt;/li&gt;
&lt;li&gt;"Run a 5-step research plan in parallel and combine the answers." Subagent.&lt;/li&gt;
&lt;li&gt;"Find every place in the repo that uses a deprecated API." Subagent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The place teams go wrong is using a hook to do a subagent's job. A "summarize this PDF" hook ends up reading the PDF inline in the main thread, blowing the context, and the user gets the &lt;em&gt;first&lt;/em&gt; part of the summary truncated. Move it to a subagent and the main thread gets a clean pointer, and the summary can be a 200k-token scratchpad without polluting the per-run context.&lt;/p&gt;

&lt;p&gt;The other way teams go wrong is using a subagent to do a hook's job. A "format the file after every edit" subagent that is invoked conditionally is the same job as a hook, but it is unreliable: the model can forget to invoke it, and the model can decide to skip the invocation. The hook runs deterministically, every time, on the tool event, not on the model's memory.&lt;/p&gt;

&lt;p&gt;A good rule of thumb: if you find yourself writing "always remember to …" in &lt;code&gt;CLAUDE.md&lt;/code&gt;, it is probably a hook. If you find yourself writing "sometimes ask X to do Y", it is probably a subagent.&lt;/p&gt;

&lt;p&gt;Both pieces are part of the same toolbox. The forcing function for picking the right one is: &lt;em&gt;what would happen if the model forgot?&lt;/em&gt; If the answer is "a small but consistent formatting bug", that's a hook's job. If the answer is "the model re-does an hour of work in the main thread", that's a subagent's job.&lt;/p&gt;

&lt;p&gt;Shelf, the open-source desktop workspace we are building around Claude Code and Codex, is the project-level retrieval layer we use to find old sessions by project. The link is at&lt;br&gt;
&lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt; if you want to compare it to your current workflow.&lt;/p&gt;

&lt;p&gt;Tags: claudecode, codex, devtools, subagents, hooks, ai&lt;/p&gt;

</description>
      <category>subagents</category>
    </item>
    <item>
      <title>CLAUDE.md as a Forcing Function: How Writing a Project Constitution Cleans Up Your Tooling</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 10:28:32 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/claudemd-as-a-forcing-function-how-writing-a-project-constitution-cleans-up-your-tooling-3bhk</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/claudemd-as-a-forcing-function-how-writing-a-project-constitution-cleans-up-your-tooling-3bhk</guid>
      <description>&lt;h1&gt;
  
  
  CLAUDE.md as a Forcing Function: How Writing a Project Constitution Cleans Up Your Tooling
&lt;/h1&gt;

&lt;p&gt;If you have been using Claude Code for a few months across multiple repos, the cheap, ongoing mistake is to keep&lt;br&gt;
adding rules to &lt;code&gt;CLAUDE.md&lt;/code&gt; every time the model does something wrong. The list grows, the file becomes a copy&lt;br&gt;
of a prompt template, and the model treats it like static noise.&lt;/p&gt;

&lt;p&gt;A more useful pattern that has worked for our team: write &lt;code&gt;CLAUDE.md&lt;/code&gt; as a &lt;em&gt;constitution&lt;/em&gt;, not a &lt;em&gt;prompt&lt;/em&gt;,&lt;br&gt;
and use the constraint itself as a forcing function for cleaning up the underlying tools.&lt;/p&gt;

&lt;p&gt;The mental shift is small but practical. Instead of "Claude keeps running the wrong test command, so add&lt;br&gt;
a paragraph explaining how to run tests", write "the test command for this repo is &lt;code&gt;pnpm test &amp;lt;name&amp;gt;&lt;/code&gt;",&lt;br&gt;
and ask yourself: &lt;em&gt;why is the test command even ambiguous?&lt;/em&gt; If the only way to explain it is a paragraph,&lt;br&gt;
the tooling is the problem, not the prompt.&lt;/p&gt;

&lt;p&gt;Three rules we follow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hard scope, positive form.&lt;/strong&gt; A line that says "only edit files inside &lt;code&gt;src/&amp;lt;module&amp;gt;/&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;tests/&amp;lt;module&amp;gt;/&lt;/code&gt;. Stop and ask if a change touches anything else" is more reliable than a list of&lt;br&gt;
"never touch X" rules. Negative-form rules invite the model to find creative workarounds; positive&lt;br&gt;
rules give it a default and an escalation path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Short or it is wrong.&lt;/strong&gt; A long &lt;code&gt;CLAUDE.md&lt;/code&gt; is a symptom that the team is not investing in&lt;br&gt;
&lt;code&gt;package.json&lt;/code&gt; scripts, internal CLIs, and clear conventions. We cap the file around 2-3KB of&lt;br&gt;
bullet points. Anything bigger is a hint that a tool needs to be wrapped in a script with a sane&lt;br&gt;
surface area, not explained in markdown.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memory and retrieval are not &lt;code&gt;CLAUDE.md&lt;/code&gt; jobs.&lt;/strong&gt; &lt;code&gt;CLAUDE.md&lt;/code&gt; is for behavior that should apply&lt;br&gt;
every run (build commands, lint scope, project layout). Past-decision context, code-archaeology&lt;br&gt;
notes, and "what did I do last week" questions belong to a separate layer — &lt;code&gt;git&lt;/code&gt;, a project&lt;br&gt;
notebook, or, in our case, a local session retrieval tool. Mixing them in &lt;code&gt;CLAUDE.md&lt;/code&gt; makes the&lt;br&gt;
file grow and pollutes the per-run context window.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We did not start out with these rules. We arrived at them after watching &lt;code&gt;CLAUDE.md&lt;/code&gt; files balloon&lt;br&gt;
to 30KB and watching Claude ignore half of what we wrote. The cleanest side effect is that the team&lt;br&gt;
also started writing better internal CLIs. When your constitution forces you to express a workflow&lt;br&gt;
in one bullet, you cannot hide behind prose.&lt;/p&gt;

&lt;p&gt;If you are just starting with Claude Code, my suggestion is to begin with a deliberately short&lt;br&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt;, watch what the model gets wrong, and let the file stay small. Long &lt;code&gt;CLAUDE.md&lt;/code&gt; files&lt;br&gt;
are a sign that the project itself needs more structure, not that the model needs more instructions.&lt;/p&gt;

&lt;p&gt;Shelf, the open-source desktop workspace we are building around Claude Code and Codex, is the&lt;br&gt;
project-level retrieval layer we use to find old sessions by project. The link is at&lt;br&gt;
&lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt; if you want to compare it to your current workflow.&lt;/p&gt;

&lt;p&gt;Tags: claudecode, codex, devtools, workflow, ai&lt;/p&gt;

</description>
      <category>workflow</category>
    </item>
    <item>
      <title>From Terminal Tabs to Project Workspaces: How I Organize Claude Code and Codex Sessions</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:22:58 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/from-terminal-tabs-to-project-workspaces-how-i-organize-claude-code-and-codex-sessions-4g6o</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/from-terminal-tabs-to-project-workspaces-how-i-organize-claude-code-and-codex-sessions-4g6o</guid>
      <description>&lt;h1&gt;
  
  
  From Terminal Tabs to Project Workspaces: How I Organize Claude Code and Codex Sessions
&lt;/h1&gt;

&lt;p&gt;I used to manage my AI coding sessions like browser tabs. Open Claude Code in a directory, chat for an hour, switch to another project, come back tomorrow, and... where was I?&lt;/p&gt;

&lt;p&gt;The built-in &lt;code&gt;/resume&lt;/code&gt; shows a flat list. &lt;code&gt;/continue&lt;/code&gt; only works if I remember the session ID. After three months of daily Claude Code and Codex use, I had thirty-plus sessions scattered across six repositories, and zero confidence that I could find the conversation where I debugged that auth issue last Tuesday.&lt;/p&gt;

&lt;p&gt;This isn't a Claude Code problem. It's a workspace problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually needed
&lt;/h2&gt;

&lt;p&gt;Not a better prompt. Not a bigger context window. I needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Project-level grouping&lt;/strong&gt; — All sessions for &lt;code&gt;backend-api&lt;/code&gt; in one place, all sessions for &lt;code&gt;mobile-app&lt;/code&gt; in another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session discovery&lt;/strong&gt; — A search that actually works across projects, not just within the current directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click recovery&lt;/strong&gt; — Open a previous session without typing &lt;code&gt;/resume&lt;/code&gt; and scrolling through a chronological dump.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I ended up writing a small desktop app called Shelf. It's a Tauri-based workspace manager that sits next to my terminal and tracks every Claude Code and Codex session by project.&lt;/p&gt;

&lt;p&gt;Key things it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scans&lt;/strong&gt; &lt;code&gt;~/.claude/projects/&lt;/code&gt; and &lt;code&gt;~/.codex/&lt;/code&gt; automatically and groups sessions by git repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lists&lt;/strong&gt; every conversation with a preview of the last few turns, so I can spot "the auth debugging session from Tuesday" without opening it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restores&lt;/strong&gt; any session in its original working directory with one click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded terminal&lt;/strong&gt; — I can open a PTY right inside the app if I just want to check a log without launching Claude Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not trying to replace Claude Code or Codex. It's just the missing workspace layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture notes (for the curious)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tauri v2 + Rust for the backend file scanning and session restoration.&lt;/li&gt;
&lt;li&gt;TypeScript + Vite for the UI.&lt;/li&gt;
&lt;li&gt;xterm.js for the embedded terminal.&lt;/li&gt;
&lt;li&gt;Cross-platform: macOS (Apple Silicon) and Linux.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The habit change
&lt;/h2&gt;

&lt;p&gt;The biggest shift wasn't technical. It was mental. I stopped treating each Claude Code session as disposable. Now I name my sessions intentionally, close them cleanly, and trust that I can get back to any project's state within ten seconds.&lt;/p&gt;

&lt;p&gt;If you're juggling multiple repos with Claude Code or Codex, the tool is at &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt;. It's open source, v0.2.18, and I'd genuinely appreciate feedback or PRs.&lt;/p&gt;




&lt;p&gt;What does your Claude Code workspace look like? Still using terminal tabs, or have you found something else that works?&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>codex</category>
      <category>sessionmanagement</category>
      <category>developerworkflow</category>
    </item>
    <item>
      <title>Five Claude Code habits that cost nothing and save hours</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 06:05:19 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/five-claude-code-habits-that-cost-nothing-and-save-hours-975</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/five-claude-code-habits-that-cost-nothing-and-save-hours-975</guid>
      <description>&lt;p&gt;I have been using Claude Code daily for about a year across multiple repos. These five habits are free, require no plugins, and have saved me more time than any model upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Name your sessions immediately
&lt;/h2&gt;

&lt;p&gt;The default session names are "task-abc123" or "fix-xyz". After three days you have no idea what was in there. The fix is trivial: start every session with a one-line summary.&lt;/p&gt;

&lt;p&gt;Bad: &lt;code&gt;claude&lt;/code&gt; -&amp;gt; default name &lt;code&gt;task-2026-06-02-abc123&lt;/code&gt;&lt;br&gt;
Good: &lt;code&gt;claude&lt;/code&gt; -&amp;gt; say "Refactor auth module token validation logic" -&amp;gt; session name is now descriptive&lt;/p&gt;

&lt;p&gt;When you run &lt;code&gt;/resume&lt;/code&gt; a week later, you will actually know which session to pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Treat CLAUDE.md as a correction log, not a spec
&lt;/h2&gt;

&lt;p&gt;Most people write CLAUDE.md once and forget it. The better approach is to append a rule every time Claude makes a repeatable mistake.&lt;/p&gt;

&lt;p&gt;Examples from my current project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Always use pnpm in this repo. Do not generate package-lock.json."&lt;/li&gt;
&lt;li&gt;"API response keys must be camelCase."&lt;/li&gt;
&lt;li&gt;"Integration tests need a local Redis instance."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each rule is a single sentence. The file grows organically and future sessions inherit it automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Know the difference between /continue and /resume
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/continue&lt;/code&gt; (or &lt;code&gt;claude --continue&lt;/code&gt;): reopens the most recent session in the current directory. Use this when you stopped working yesterday and want to pick up where you left off.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/resume&lt;/code&gt; (or &lt;code&gt;claude --resume&lt;/code&gt;): opens a picker of all historical sessions. Use this when you need a specific older conversation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trap is that &lt;code&gt;/resume&lt;/code&gt; only helps if you remember the session name or ID. After a few repos and dozens of sessions, the flat list becomes useless.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Export decisions before they disappear
&lt;/h2&gt;

&lt;p&gt;When a session contains a design decision, architectural choice, or complex debugging path, run &lt;code&gt;/export&lt;/code&gt; before closing it. The output is a markdown file you can drop into your project docs.&lt;/p&gt;

&lt;p&gt;The alternative is digging through &lt;code&gt;~/.claude/projects/&lt;/code&gt; raw JSONL files later. Those files contain everything, but they are not meant for human reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Separate memory from retrieval
&lt;/h2&gt;

&lt;p&gt;This is the habit that took me longest to learn.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; = reusable facts that future sessions need (CLAUDE.md, rules, conventions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval&lt;/strong&gt; = finding the old session that actually contained the decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CLAUDE.md handles memory well. Retrieval is harder because Claude Code's native tools are designed for exact-session continuation, not for browsing across projects.&lt;/p&gt;

&lt;p&gt;After I crossed four active repos, I built a small desktop workspace that groups Claude Code and Codex sessions by project. It reads the same local JSONL files — no cloud, no API keys — and presents them in a browsable project view. I use it to find the right session before I &lt;code&gt;/resume&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not a replacement for &lt;code&gt;/continue&lt;/code&gt;, &lt;code&gt;/resume&lt;/code&gt;, or &lt;code&gt;CLAUDE.md&lt;/code&gt;. It sits beside them as a retrieval layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Claude Code is already powerful. The marginal gain from naming sessions, maintaining a correction log, and knowing which command to use when is larger than the gain from most configuration tweaks. And when project count grows, having a way to browse old sessions before resuming them pays for itself quickly.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>productivity</category>
      <category>developerworkflow</category>
      <category>tips</category>
    </item>
    <item>
      <title>Claude Code memory, resume, and session retrieval are three different jobs</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Tue, 02 Jun 2026 05:27:25 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/claude-code-memory-resume-and-session-retrieval-are-three-different-jobs-1gd7</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/claude-code-memory-resume-and-session-retrieval-are-three-different-jobs-1gd7</guid>
      <description>&lt;p&gt;I used to think Claude Code's memory, &lt;code&gt;/resume&lt;/code&gt;, and session history were all solving the same problem. They are not. Once I separated them, my workflow got a lot less fragile.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Memory is for reusable facts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.claude/rules/&lt;/code&gt;, and auto memory are for information that should carry into &lt;em&gt;future&lt;/em&gt; sessions. This is where project conventions, build commands, debugging notes, and repeated corrections belong.&lt;/p&gt;

&lt;p&gt;Good use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Always use pnpm in this repo."&lt;/li&gt;
&lt;li&gt;"The integration tests need Redis."&lt;/li&gt;
&lt;li&gt;"API handlers live under this directory."&lt;/li&gt;
&lt;li&gt;"Claude keeps missing this convention, so write it down."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not the same as reopening an old conversation. It is a way to give the next conversation better starting context.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Resume is for a known session
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;claude --continue&lt;/code&gt; reopens the most recent conversation in the current directory.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;claude --resume&lt;/code&gt; reopens a specific session by ID or name, or lets you choose from a picker.&lt;/p&gt;

&lt;p&gt;This is the right layer when you &lt;em&gt;know&lt;/em&gt; which conversation you want to continue. Naming sessions helps a lot here.&lt;/p&gt;

&lt;p&gt;Good use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You stopped working on a PR yesterday and want to continue it.&lt;/li&gt;
&lt;li&gt;You named the session &lt;code&gt;auth-refactor&lt;/code&gt; and want to reopen it.&lt;/li&gt;
&lt;li&gt;You only need the most recent conversation in this repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Retrieval is for when you forgot which session it was
&lt;/h2&gt;

&lt;p&gt;The harder case is not "can Claude continue a known session?"&lt;/p&gt;

&lt;p&gt;The harder case is "which old session was that?"&lt;/p&gt;

&lt;p&gt;After a few repos, the ID, date, terminal tab, and exact session name blur together. You may remember the project, bug, or decision, but not the session handle. Digging through &lt;code&gt;~/.claude/projects/&lt;/code&gt; raw JSONL files is not a workflow.&lt;/p&gt;

&lt;p&gt;That is a separate retrieval problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browse old sessions by project&lt;/li&gt;
&lt;li&gt;find the relevant conversation before reopening it&lt;/li&gt;
&lt;li&gt;avoid guessing session IDs or scrolling through a flat picker&lt;/li&gt;
&lt;li&gt;keep Claude Code and Codex work visible across repos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the layer I built Shelf for: &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shelf is not a replacement for &lt;code&gt;--continue&lt;/code&gt;, &lt;code&gt;--resume&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, or auto memory. Those native layers are useful. Shelf is meant to sit beside them as a desktop workspace for browsing and reopening Claude Code and Codex sessions by project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Memory is for reusable facts.&lt;/li&gt;
&lt;li&gt;Resume is for a known session.&lt;/li&gt;
&lt;li&gt;Retrieval is for finding the old session when you do not remember the ID, name, tab, or date.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I keep the three layers separate now and it stopped most of the "where did that conversation go?" panic.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>codex</category>
      <category>sessionmanagement</category>
      <category>developerworkflow</category>
    </item>
    <item>
      <title>Treat AI coding sessions as project infrastructure</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Mon, 01 Jun 2026 22:36:35 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/treat-ai-coding-sessions-as-project-infrastructure-4o51</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/treat-ai-coding-sessions-as-project-infrastructure-4o51</guid>
      <description>&lt;p&gt;Most AI coding workflows treat the current session as the important part.&lt;/p&gt;

&lt;p&gt;That makes sense while you are in the loop. You ask Claude Code to inspect a tricky bug, or you queue Codex to write a PR, and the useful context is right there in front of you.&lt;/p&gt;

&lt;p&gt;The problem starts a week later.&lt;/p&gt;

&lt;p&gt;You remember that one session found the exact migration edge case. You remember another one explained why the quick fix was wrong. You might even remember the project. But you do not remember the session ID, the terminal tab, or the exact prompt that got you there.&lt;/p&gt;

&lt;p&gt;That is the point where AI coding sessions stop being conversations and start becoming project infrastructure.&lt;/p&gt;

&lt;p&gt;Here is the split that has worked best for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Keep durable rules in project files
&lt;/h2&gt;

&lt;p&gt;Files like &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;, or &lt;code&gt;.codex/rules&lt;/code&gt; are good for behavior that should apply every run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coding style&lt;/li&gt;
&lt;li&gt;test expectations&lt;/li&gt;
&lt;li&gt;release rules&lt;/li&gt;
&lt;li&gt;known architecture constraints&lt;/li&gt;
&lt;li&gt;commands that should or should not be used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not session history. It is the baseline contract for the project.&lt;/p&gt;

&lt;p&gt;If you correct the agent twice on the same pattern, that correction probably belongs in one of these files.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Keep active work in a handoff document
&lt;/h2&gt;

&lt;p&gt;For a feature or refactor, I like having a short &lt;code&gt;implementation.md&lt;/code&gt; or &lt;code&gt;handoff.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It should answer a few boring questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what are we changing?&lt;/li&gt;
&lt;li&gt;what phase are we in?&lt;/li&gt;
&lt;li&gt;what did the last agent already try?&lt;/li&gt;
&lt;li&gt;what still needs human review?&lt;/li&gt;
&lt;li&gt;what tests were run?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This works especially well when Claude Code and Codex are both touching the same repo. Claude Code can help explore and make decisions locally, while Codex can take a narrower task and return a PR. The handoff document keeps those runs from drifting apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Treat old sessions as searchable project records
&lt;/h2&gt;

&lt;p&gt;The raw transcripts usually exist somewhere. For Claude Code, that often means digging through local session files. For Codex, the useful context may be split across tasks, PR notes, and local terminal work.&lt;/p&gt;

&lt;p&gt;The hard part is not that the data is gone.&lt;/p&gt;

&lt;p&gt;The hard part is finding the right old conversation when you only remember the project and the decision.&lt;/p&gt;

&lt;p&gt;That is why I ended up building Shelf: a small open-source desktop app for browsing Claude Code and Codex sessions by project.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is simple: old AI coding sessions should be reopenable without remembering opaque session IDs or spelunking through terminal history.&lt;/p&gt;

&lt;p&gt;It is built with Tauri v2, Rust, TypeScript, Vite, and xterm.js, and currently targets macOS Apple Silicon and Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  My current rule of thumb
&lt;/h2&gt;

&lt;p&gt;If it affects every future run, put it in project rules.&lt;/p&gt;

&lt;p&gt;If it affects the current feature, put it in a handoff doc.&lt;/p&gt;

&lt;p&gt;If it explains why a past decision happened, make sure the old session is easy to find again.&lt;/p&gt;

&lt;p&gt;That third bucket is easy to ignore until you have twenty sessions across the same project. After that, retrieval becomes part of the workflow.&lt;/p&gt;

&lt;p&gt;AI coding sessions are not just chat logs. They are project history.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>codex</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A practical way to keep AI coding sessions from becoming disposable</title>
      <dc:creator>Echo</dc:creator>
      <pubDate>Mon, 01 Jun 2026 19:13:08 +0000</pubDate>
      <link>https://dev.to/uzoma_uche_3ec83974b4a8a5/a-practical-way-to-keep-ai-coding-sessions-from-becoming-disposable-nef</link>
      <guid>https://dev.to/uzoma_uche_3ec83974b4a8a5/a-practical-way-to-keep-ai-coding-sessions-from-becoming-disposable-nef</guid>
      <description>&lt;p&gt;AI coding tools make it easy to generate code, but they also create a quiet documentation problem: useful reasoning gets trapped inside sessions that are hard to find later.&lt;/p&gt;

&lt;p&gt;The most useful parts of an AI session are often not the final patch. They are the dead ends, assumptions, trade-offs, and test ideas that led to the patch.&lt;/p&gt;

&lt;p&gt;A few practices that help:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start sessions from the correct project folder.&lt;/li&gt;
&lt;li&gt;Name work around the task, not the model: &lt;code&gt;auth-timeout-fix&lt;/code&gt;, &lt;code&gt;migration-plan&lt;/code&gt;, &lt;code&gt;release-checklist&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep important prompts and decisions close to the repo.&lt;/li&gt;
&lt;li&gt;Review old sessions before asking the model to solve a similar bug again.&lt;/li&gt;
&lt;li&gt;Treat session recovery as part of your dev environment, like restoring editor tabs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have been building this workflow into an open-source desktop app called &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;Shelf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Shelf is not another coding model. It is a small Tauri desktop workspace manager for people who use Claude Code and Codex across multiple repos.&lt;/p&gt;

&lt;p&gt;The current version can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;organize sessions by project&lt;/li&gt;
&lt;li&gt;resume previous Claude Code and Codex sessions&lt;/li&gt;
&lt;li&gt;scan local AI conversation history&lt;/li&gt;
&lt;li&gt;restore workspace state after restart&lt;/li&gt;
&lt;li&gt;keep file tree + real PTY terminal in the same window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main idea is simple: AI coding history should be browsable, not disposable.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Harukaon/shelf" rel="noopener noreferrer"&gt;https://github.com/Harukaon/shelf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related: I also wrote a short workflow note on organizing Claude Code and Codex sessions across projects: &lt;a href="https://dev.to/uzoma_uche_3ec83974b4a8a5/organizing-claude-code-and-codex-sessions-across-projects-722"&gt;https://dev.to/uzoma_uche_3ec83974b4a8a5/organizing-claude-code-and-codex-sessions-across-projects-722&lt;/a&gt;&lt;/p&gt;

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