<?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: Stanley</title>
    <description>The latest articles on DEV Community by Stanley (@stanley_f57ec6c939e0e82db).</description>
    <link>https://dev.to/stanley_f57ec6c939e0e82db</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%2F1607706%2F61536554-2c03-4c01-8d1f-512da766f4f2.png</url>
      <title>DEV Community: Stanley</title>
      <link>https://dev.to/stanley_f57ec6c939e0e82db</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stanley_f57ec6c939e0e82db"/>
    <language>en</language>
    <item>
      <title>How to Recover a Lost Claude Code Session When --continue Fails</title>
      <dc:creator>Stanley</dc:creator>
      <pubDate>Wed, 23 Sep 2026 05:45:20 +0000</pubDate>
      <link>https://dev.to/stanley_f57ec6c939e0e82db/how-to-recover-a-lost-claude-code-session-when-continue-fails-35h5</link>
      <guid>https://dev.to/stanley_f57ec6c939e0e82db/how-to-recover-a-lost-claude-code-session-when-continue-fails-35h5</guid>
      <description>&lt;p&gt;I ran &lt;code&gt;claude --continue&lt;/code&gt; to pick up where I left off, and it opened the wrong session. Here's why that happens, how to find the session by hand, and the small &lt;code&gt;resume&lt;/code&gt; command I now use instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why --continue misses sessions
&lt;/h2&gt;

&lt;p&gt;Claude Code saves each session as a &lt;code&gt;.jsonl&lt;/code&gt; file under &lt;code&gt;~/.claude/projects/&lt;/code&gt;. Each project gets a subfolder named after the full path where you launched &lt;code&gt;claude&lt;/code&gt;, with slashes and underscores turned into dashes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;~/Documents/github/my_app  →  ~/.claude/projects/-Users-yourname-Documents-github-my-app/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--continue&lt;/code&gt; only opens the &lt;strong&gt;most recent&lt;/strong&gt; session in your current folder. So it picks the wrong one, or finds nothing, if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you started a newer session in the same folder since then,&lt;/li&gt;
&lt;li&gt;the original session was launched from a different folder (a parent or a subfolder),&lt;/li&gt;
&lt;li&gt;you &lt;strong&gt;renamed or moved&lt;/strong&gt; the project. Old sessions stay in a folder named after the old path, or&lt;/li&gt;
&lt;li&gt;the session &lt;strong&gt;&lt;code&gt;cd&lt;/code&gt;'d into a subfolder&lt;/strong&gt; partway through. Every message records its working directory (&lt;code&gt;cwd&lt;/code&gt;), so the session's latest folder may no longer be the one you started in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  First, try the built-in picker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--resume&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With no ID, this lists the current folder's sessions. The search box matches session &lt;strong&gt;titles&lt;/strong&gt;, not IDs, so type a topic ("login bug") rather than pasting an ID. If your session isn't there, it probably lives under a different folder. Read on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a session by hand
&lt;/h2&gt;

&lt;h3&gt;
  
  
  See which sessions were used most recently, across all projects
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;*/*.jsonl&lt;/code&gt; rather than &lt;code&gt;ls -lt ~/.claude/projects/&lt;/code&gt;. A folder's timestamp only changes when a session file is created, not when you keep chatting in one, so sorting the folders is misleading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search for a word from the lost conversation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lt&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;-l&lt;/span&gt; &lt;span class="s2"&gt;"webCorsOriginList"&lt;/span&gt; ~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;grep -l&lt;/code&gt; lists the files containing the word, and &lt;code&gt;ls -lt&lt;/code&gt; sorts them newest first. Two gotchas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a word from &lt;strong&gt;your&lt;/strong&gt; conversation, like a filename, config key or error message. Don't use the example word above.&lt;/li&gt;
&lt;li&gt;The session you're in right now matches anything you've typed or pasted into it. If the top hit is your current session, look at the next one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If zsh says &lt;code&gt;no matches found&lt;/code&gt;, that folder has no &lt;code&gt;.jsonl&lt;/code&gt; files. That happened to me with a leftover folder from before I renamed my project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resume it from the matching folder
&lt;/h3&gt;

&lt;p&gt;The filename (minus &lt;code&gt;.jsonl&lt;/code&gt;) is the session ID. To see which folder a session last worked in:&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="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'"cwd":"[^"]*"'&lt;/span&gt; &amp;lt;session-file&amp;gt;.jsonl | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&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="nb"&gt;cd&lt;/span&gt; /path/to/that/folder
claude &lt;span class="nt"&gt;--resume&lt;/span&gt; aaa6d99e-356e-4148-982e-e6e7a3133939
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automating it: a &lt;code&gt;resume&lt;/code&gt; picker
&lt;/h2&gt;

&lt;p&gt;After doing that a few times, I wrote two zsh functions that do all of the above. They show a numbered list of recent sessions with the date, the folder and &lt;strong&gt;the first message you typed&lt;/strong&gt;, which is usually enough to recognize the conversation. Pick a number, and it &lt;code&gt;cd&lt;/code&gt;s to the right folder and runs &lt;code&gt;claude --resume&lt;/code&gt; for you:&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="nv"&gt;$ &lt;/span&gt;resume
 1&lt;span class="o"&gt;)&lt;/span&gt; Sep 23 13:21  my_app          how &lt;span class="k"&gt;do &lt;/span&gt;I add a password to the streamlit secrets?
    &lt;span class="nb"&gt;cd&lt;/span&gt; /Users/yourname/Documents/github/my_app
    claude &lt;span class="nt"&gt;--resume&lt;/span&gt; cf39dcc2-7aa3-497e-85f5-81366bd7ca7f
 2&lt;span class="o"&gt;)&lt;/span&gt; Sep 23 13:12  nfl_data        given SRS rating, what about defensive EPA?
    &lt;span class="nb"&gt;cd&lt;/span&gt; /Users/yourname/Documents/github/nfl_data
    claude &lt;span class="nt"&gt;--resume&lt;/span&gt; f7f54e6c-0a52-4123-93f8-8459b3e28de9
 3&lt;span class="o"&gt;)&lt;/span&gt; Sep 23 12:29  anki-skill      is there a way to connect to my anki through Vercel?
    &lt;span class="nb"&gt;cd&lt;/span&gt; /Users/yourname/Documents/claude_skills/anki-skill
    claude &lt;span class="nt"&gt;--resume&lt;/span&gt; aaa6d99e-356e-4148-982e-e6e7a3133939
Session &lt;span class="c"&gt;# (Enter to cancel): 2&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /Users/yourname/Documents/github/nfl_data &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; claude &lt;span class="nt"&gt;--resume&lt;/span&gt; f7f54e6c-...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row also prints the full &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;claude --resume&lt;/code&gt; commands, so you can copy them into another tab.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resume&lt;/code&gt; shows your 15 most recent sessions from any project, and &lt;code&gt;resume 30&lt;/code&gt; shows 30.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resumehere&lt;/code&gt; shows only sessions from the current folder (&lt;code&gt;$PWD&lt;/code&gt;) or its subfolders, and &lt;code&gt;resumehere 30&lt;/code&gt; shows 30.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Paste this into &lt;code&gt;~/.zshrc&lt;/code&gt;, then run &lt;code&gt;source ~/.zshrc&lt;/code&gt;. It needs zsh and &lt;code&gt;python3&lt;/code&gt;, and I've only tested it on macOS.&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;# Usage: resume          -&amp;gt; numbered list of your 15 most recent sessions,&lt;/span&gt;
&lt;span class="c"&gt;#                           showing each one's folder and first message.&lt;/span&gt;
&lt;span class="c"&gt;#                           Type a number, and it cd's there and resumes it.&lt;/span&gt;
&lt;span class="c"&gt;#        resume 30       -&amp;gt; show 30 instead&lt;/span&gt;
&lt;span class="c"&gt;#        resumehere      -&amp;gt; same, but only sessions from this folder ($PWD)&lt;/span&gt;
&lt;span class="c"&gt;#                           or its subfolders&lt;/span&gt;
&lt;span class="c"&gt;#        resumehere 30   -&amp;gt; show 30 instead&lt;/span&gt;
resume&lt;span class="o"&gt;()&lt;/span&gt;     &lt;span class="o"&gt;{&lt;/span&gt; _resume_pick &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;15&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
resumehere&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; _resume_pick &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;15&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&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;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

_resume_pick&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="nv"&gt;here&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt; choice i d &lt;span class="nb"&gt;id dir &lt;/span&gt;snip
  &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; rows
  &lt;span class="nv"&gt;rows&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="p"&gt;(@f)&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;python3 - &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;$here&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PY&lt;/span&gt;&lt;span class="sh"&gt;'
import glob, json, os, re, sys, time
n, here = int(sys.argv[1]), sys.argv[2]
files = sorted(glob.glob(os.path.expanduser("~/.claude/projects/*/*.jsonl")),
               key=os.path.getmtime, reverse=True)
shown = 0
for f in files:
    if shown &amp;gt;= n:
        break
    with open(f, errors="replace") as fh:
        text = fh.read()
    cwds = re.findall(r'"cwd":"([^"]*)"', text)
    cwd = cwds[-1] if cwds else ""
    if here and not any(c == here or c.startswith(here + "/") for c in set(cwds)):
        continue
    first = ""
    for line in text.splitlines():
        if '"type":"user"' not in line:
            continue
        try:
            o = json.loads(line)
        except ValueError:
            continue
        if o.get("type") != "user" or o.get("isMeta"):
            continue
        c = (o.get("message") or {}).get("content")
        if isinstance(c, list):
            c = " ".join(b.get("text", "") for b in c
                         if isinstance(b, dict) and b.get("type") == "text")
        if isinstance(c, str):
            t = " ".join(c.split())
            if t and not t.startswith("&amp;lt;"):
                first = t
                break
    when = time.strftime("%b %d %H:%M", time.localtime(os.path.getmtime(f)))
    print("&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="sh"&gt;".join([when, os.path.basename(f)[:-6], cwd, first or "(no message)"]))
    shown += 1
&lt;/span&gt;&lt;span class="no"&gt;PY
&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rows&lt;/span&gt;:#&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$#rows&lt;/span&gt; &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No sessions found&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;here&lt;/span&gt;:+&lt;span class="p"&gt; for &lt;/span&gt;&lt;span class="nv"&gt;$here&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..&lt;span class="nv"&gt;$#rows&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;$'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; d &lt;span class="nb"&gt;id dir &lt;/span&gt;snip &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$rows&lt;/span&gt;&lt;span class="s2"&gt;[i]"&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%2d) %s  %-28s %s\n'&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$d&lt;/span&gt;&lt;span class="s2"&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;dir&lt;/span&gt;:t&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$snip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"    cd %s&lt;/span&gt;&lt;span class="se"&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;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"    claude --resume %s&lt;/span&gt;&lt;span class="se"&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;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;done
  &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="s2"&gt;"choice?Session # (Enter to cancel): "&lt;/span&gt;
  &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="nv"&gt;$choice&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="k"&gt;return
  if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$choice&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &amp;lt;-&amp;gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; choice &amp;lt; 1 &lt;span class="o"&gt;||&lt;/span&gt; choice &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$#rows&lt;/span&gt; &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No session #&lt;/span&gt;&lt;span class="nv"&gt;$choice&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;$'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; d &lt;span class="nb"&gt;id dir &lt;/span&gt;snip &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$rows&lt;/span&gt;&lt;span class="s2"&gt;[choice]"&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;$dir&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Folder no longer exists: &lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cd &lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; claude --resume &lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; claude &lt;span class="nt"&gt;--resume&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How it works: Python sorts the session files by last modified time. For each one it takes the last recorded &lt;code&gt;cwd&lt;/code&gt; and the first real user message, skipping system and command messages that start with &lt;code&gt;&amp;lt;&lt;/code&gt;. zsh prints the list, reads your choice, then runs &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;claude --resume&lt;/code&gt;. After you quit Claude, your shell stays in that folder, so run &lt;code&gt;cd -&lt;/code&gt; to go back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking up a session by ID: &lt;code&gt;sessions&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Sometimes you already have a session ID, from an old terminal tab, a note, or the &lt;code&gt;resume&lt;/code&gt; list, and just need to know which folder to resume it from. The built-in picker can't help there, since its search box doesn't match IDs. This smaller function lists recent sessions, or looks one up by the first few characters of its ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sessions b235b
&lt;span class="go"&gt;Sep 24 11:05  b235b276-c4e1-4cc4-b940-66aa2e9981e8  /Users/yourname/Documents/claude_skills/anki-skill
cd /Users/yourname/Documents/claude_skills/anki-skill &amp;amp;&amp;amp; claude --resume b235b276-c4e1-4cc4-b940-66aa2e9981e8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sessions&lt;/code&gt; shows your 10 most recent sessions (time, ID and last folder), and &lt;code&gt;sessions 25&lt;/code&gt; shows 25.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sessions b235b&lt;/code&gt; shows sessions whose ID starts with &lt;code&gt;b235b&lt;/code&gt;. If exactly one matches, it also prints the &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;claude --resume&lt;/code&gt; command to copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A number is read as a count and anything else as an ID prefix, so if your prefix happens to be all digits, type one more character. Add it to &lt;code&gt;~/.zshrc&lt;/code&gt; alongside &lt;code&gt;resume&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;# Usage: sessions          -&amp;gt; 10 most recent Claude Code sessions&lt;/span&gt;
&lt;span class="c"&gt;#        sessions 25       -&amp;gt; 25 most recent&lt;/span&gt;
&lt;span class="c"&gt;#        sessions b235b    -&amp;gt; sessions whose ID starts with b235b&lt;/span&gt;
sessions&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="o"&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; f cwd
  &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; files
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$arg&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &amp;lt;-&amp;gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nv"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.jsonl&lt;span class="o"&gt;(&lt;/span&gt;N.om&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="nv"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nv"&gt;$files&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;1,&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nv"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;~/.claude/projects/&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;arg&lt;/span&gt;&lt;span class="k"&gt;}*&lt;/span&gt;.jsonl&lt;span class="o"&gt;(&lt;/span&gt;N.om&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$#files&lt;/span&gt; &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No session ID starting with &lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;1
    &lt;span class="k"&gt;fi
  fi
  for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$files&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&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;-o&lt;/span&gt; &lt;span class="s1"&gt;'"cwd":"[^"]*"'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt; &lt;span class="nt"&gt;-f4&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s  %s  %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'+%b %d %H:%M'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&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;f&lt;/span&gt;:t:r&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$cwd&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;done
  if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$arg&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &amp;lt;-&amp;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="nv"&gt;$#files&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; 1 &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cd &lt;/span&gt;&lt;span class="nv"&gt;$cwd&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; claude --resume &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;:t:r&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's pure zsh with no Python. &lt;code&gt;(N.om)&lt;/code&gt; lists the session files newest first without erroring when nothing matches, and &lt;code&gt;${f:t:r}&lt;/code&gt; turns the file path into the session ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on multiple tabs
&lt;/h2&gt;

&lt;p&gt;It's fine to resume a session while a &lt;em&gt;different&lt;/em&gt; session is open in another terminal tab. Just don't resume the &lt;em&gt;same&lt;/em&gt; session in two tabs at once, since both would write to the same transcript. Also avoid having two sessions edit the same files at the same time. Only one tab should be using a session at a time, because Claude Code doesn't know that two sessions are open writing to the same .jsonl file. &lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;claude --resume&lt;/code&gt; and search by topic.&lt;/li&gt;
&lt;li&gt;Not there? Run &lt;code&gt;resume&lt;/code&gt; (or &lt;code&gt;resumehere&lt;/code&gt;) from the function above and pick by number.&lt;/li&gt;
&lt;li&gt;Have an ID but not the folder? Run &lt;code&gt;sessions &amp;lt;first few characters of the ID&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No functions? Run &lt;code&gt;ls -lt $(grep -l "some_word" ~/.claude/projects/*/*.jsonl)&lt;/code&gt;. The top hit's filename is the ID, and its &lt;code&gt;cwd&lt;/code&gt; is the folder to &lt;code&gt;cd&lt;/code&gt; into before &lt;code&gt;claude --resume &amp;lt;id&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Prototype and Port: The Best Way to Use Claude for Personal Projects</title>
      <dc:creator>Stanley</dc:creator>
      <pubDate>Fri, 28 Aug 2026 06:34:25 +0000</pubDate>
      <link>https://dev.to/stanley_f57ec6c939e0e82db/prototype-and-port-the-best-way-to-use-claude-for-personal-projects-3ceb</link>
      <guid>https://dev.to/stanley_f57ec6c939e0e82db/prototype-and-port-the-best-way-to-use-claude-for-personal-projects-3ceb</guid>
      <description>&lt;p&gt;I was building a beat-maker web app and needed to add a feature that let me replace or append presets in a JSON array — wired up to a dropdown in a modal inside a 1500-line HTML file.&lt;/p&gt;

&lt;p&gt;I didn't start there. Here's what I did instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Going Straight to the Complex Project
&lt;/h2&gt;

&lt;p&gt;When you drop a big file in front of Claude, there's a lot of noise — styles, event listeners, utility functions — that can pull the logic in unexpected directions.&lt;/p&gt;

&lt;p&gt;See the live project at &lt;a href="https://vercel-youtubeviewer.vercel.app/famous-beats-maker_1.html" rel="noopener noreferrer"&gt;famous-beats-maker&lt;/a&gt; — specifically the "Edit JSON" modal. The goal was to be able to change and swap out any beat in the dropdown, like "Four-on-the-floor (house)".&lt;/p&gt;

&lt;p&gt;The fix: &lt;strong&gt;prototype the concept first in the simplest possible environment, then port it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Ask Claude about the data first
&lt;/h2&gt;

&lt;p&gt;I had a &lt;code&gt;beats.json&lt;/code&gt; file — a JSON array of preset drum patterns. Before writing anything, I just asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"in beats.json for example how do I access with python the first item in the json"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;beats.json&lt;/code&gt; is an array of objects, each one a full drum preset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Four-on-the-floor (house)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bpm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"desc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Steady kick on every beat with off-beat hi-hats — the backbone of house and disco."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kick"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"snare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"crash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;presets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;total)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I needed a way to access this JSON because I'd eventually be replacing items in it. Once Claude explained it, I followed up with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"write this out as access_beats.py please"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gave me a 10-line Python script. One file in, print to terminal, done. I could run it against real data immediately and see exactly what I was working with.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Add just enough to prove the concept
&lt;/h2&gt;

&lt;p&gt;Once I could read the data, I added an argument so I could pick which item to access:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"great add an argument so I can choose — I will use notation 0 instead of 1"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now I had:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python access_beats.py 0   &lt;span class="c"&gt;# first preset&lt;/span&gt;
python access_beats.py 3   &lt;span class="c"&gt;# fourth preset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Short prompt, small change. I understood every line.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Write the operation as a standalone script
&lt;/h2&gt;

&lt;p&gt;I had a &lt;code&gt;replacement.json&lt;/code&gt; file — a single preset object I wanted to swap in. I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"great see I got replacement.json and if I want to replace can you give script replace_beat.py with argument (0-based) pls"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;replacement.json&lt;/code&gt; is just one object from the array — the same shape as any item in &lt;code&gt;beats.json&lt;/code&gt;. Claude gave me a script that opens &lt;code&gt;beats.json&lt;/code&gt;, swaps in &lt;code&gt;replacement.json&lt;/code&gt; at the given index, and writes it back. I tested it. It worked. The logic was proven in about 15 lines.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Map the archetype to the real project
&lt;/h2&gt;

&lt;p&gt;This is the key step. Before touching the big file, I mapped what each piece of the prototype was equivalent to in the web app:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prototype&lt;/th&gt;
&lt;th&gt;Web App&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;beats.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;presets[]&lt;/code&gt; array in memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;replacement.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current board state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sys.argv[1]&lt;/code&gt; index&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; dropdown in the modal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Append (new name)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; field in the modal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write back to file&lt;/td&gt;
&lt;td&gt;Save to Dropbox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 5 — Give Claude the full context for the port
&lt;/h2&gt;

&lt;p&gt;Once the map was clear, I wrote one bigger prompt that described exactly what I wanted in the real project — referencing the elements by their HTML IDs, explaining the replace vs. append distinction, and specifying the 0-based index format:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"so json-schema will be replacement.json and then instead of the textarea I get a dropdown that I can select which I want to replace... and I can choose dropdown to add and how would if I wanted to append a new one I guess let me have an input where if I write something in the input will append to object +1 to the array"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the concept was already clean and proven, Claude could focus entirely on finding the right hooks in the existing code — the event listeners, the state variables, the UI elements — and slot the logic in accurately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Small files = better context.&lt;/strong&gt; Claude reads a 10-line script cleanly. The concept lands without distraction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You stay in control.&lt;/strong&gt; You understand the logic before it touches your real project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Errors are cheap.&lt;/strong&gt; Breaking a standalone script costs nothing. Breaking a 1500-line file costs debugging time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude can mirror the pattern.&lt;/strong&gt; Once the archetype is proven, Claude knows exactly what shape the solution should take in any environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Ask about the data         — understand the shape before writing anything
2. Build the archetype        — smallest standalone version in Python, one operation
3. Add arguments              — make it flexible enough to test properly
4. Map to the real project    — identify what plays each role
5. Port with full context     — one prompt that references the real hooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Use this any time you're adding logic to an existing complex file. You don't need it for small edits — a colour change or a typo fix doesn't need a prototype. But for anything involving data flow, state, or multi-step logic, the archetype step pays for itself every time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
