Shabash
Blog · Claude Code guides

How do I track my Claude Code work across projects?

Short answer

Save a /left-open skill: Claude reads yesterday's transcripts in ~/.claude/projects and lists each unfinished session with its ID and what's still open. Keep transcripts past 30 days with cleanupPeriodDays, and count hours per project from ~/.claude/history.jsonl.

By Robin Mehta · September 25, 2026

From September 20 to 27, I made over 600 commits in about ten repos. That's a lot to piece together when someone asks what shipped.

Loose ends in session transcripts

A session that stops halfway is the only place its loose end is written down: Claude's last question, the test that failed, the step it planned next. Close the tab and it's out of sight, and 30 days later Claude Code deletes a terminal session's transcript too.

The checklist in the session won't hold it for you either: Claude Code's todo list stopped showing up on Opus 4.8 and every model since, so unless you turned it back on there's nothing in it to read.

Setup: a setting, two skills and a git log command

Nobody keeps a project list up to date by hand for long, so everything below has Claude read what's already on your machine. You set it up once, and after that it's one command a day and two a week.

1. Keep transcripts longer than 30 days

If ~/.claude/settings.json doesn't exist yet, create it with this:

{
  "cleanupPeriodDays": 3650
}

If it already has settings, ask Claude Code to add this one for you. Claude Code deletes transcripts after 30 days by default, and this keeps them for about ten years. (On v2.1.248 or later, sessions you started or last continued in the Claude desktop app or Cowork are kept at any age, unless you set desktopSessionCleanupPeriodDays or your company's managed settings set cleanupPeriodDays.) Why did my Claude Code sessions disappear? covers what else the cleanup deletes.

2. Save a /left-open skill

Save this as ~/.claude/skills/left-open/SKILL.md:

---
description: Lists my Claude Code sessions that were left unfinished or waiting on me.
---
Look at my Claude Code sessions since yesterday morning (on a Monday, since Friday morning): one .jsonl file per session under ~/.claude/projects. For each session that ended with work unfinished or a question waiting on me, give one line: the project, the session ID, and what was left open. Skip sessions that finished their work. List sessions from my top-priority project, my-main-repo, first.

Swap my-main-repo for your own top project. Now each morning you type /left-open in Claude Code and say yes when it asks to read ~/.claude/projects. It reads the transcripts after the fact, so a session you closed halfway, with nothing written down, still shows up.

Reopen the ones at the top first. Each line has a session ID, and this reopens it from any folder on Claude Code v2.1.223 or later (on older versions, run it from the project's folder):

claude --resume <session-id>

If you run several sessions at once in one repo, how to manage multiple Claude Code sessions covers keeping their changes apart.

3. Count your hours per project

Claude Code saves every prompt you type in the terminal, with its time and project, in ~/.claude/history.jsonl. The 30-day cleanup doesn't touch this file.

Save this as a second skill, ~/.claude/skills/hours/SKILL.md, and run /hours once a week:

---
description: Adds up my Claude Code hands-on hours per project for the last 7 days.
---
Read ~/.claude/history.jsonl. For the last 7 days, add up my hands-on time per project. Give each prompt the time until my next prompt in any project. If that gap is over 15 minutes, or there is no next prompt, give it 4 minutes instead. Show a table of projects by hours, biggest first. Then ask me which project was meant to come first this week, and tell me what share of the hours it got.

Say you prompt in repo A at 10:00 and in repo B at 10:05: repo A gets 5 minutes, so two sessions running at once don't count twice. If your next prompt is at 11:30, the 85-minute gap is a break, and repo B gets 4 minutes, not 85.

If you'd rather not set up a skill, open your history.jsonl in Claude Code stats, a free page on my own site. It does the same math in your browser over all your history, and the file never leaves your machine.

4. Write the Friday update from git log

When someone asks what you shipped this week, your commits already have the answer. From the folder that holds your repos (swap ~/code for yours):

cd ~/code
for d in */; do git -C "$d" log --all --since="7 days ago" --author="$(git config user.email)" --format="${d%/}: %s" 2>/dev/null; done \
  | claude -p "Turn these commits into up to 5 plain bullets for a Slack update. Say what each change does for users, not how."

claude -p runs one prompt, prints the answer and exits, so you can paste it straight into Slack.

If a repo also has a worktree or a second clone in that folder, the loop sends its commits twice. In my run, a worktree of one repo sent almost 300 commits twice.

Desktop, web and deleted sessions

Sessions on claude.ai/code run in the cloud, so /left-open won't find them on your Mac.

The VS Code extension and the Claude desktop app are likely covered. The VS Code docs say "The extension and CLI share the same conversation history", and Claude Code keeps the transcripts of desktop-app sessions in ~/.claude/projects. But the sessions docs also say the desktop app, claude.ai/code and the VS Code extension "each maintain their own session history", so check on your own Mac.

/left-open reads the files, so look for the file. Copy a few words you typed in that app and search for them:

grep -rl "a few words you typed in the app" ~/.claude/projects

If a .jsonl file comes back, /left-open can read that conversation. Don't check with the claude --resume list: it leaves out some sessions whose files are still there.

Transcripts deleted before you raised cleanupPeriodDays are gone for good. Only the prompts you typed are left, in history.jsonl.

/left-open and /hours are manual versions of what I'm building Shabash to do. It's a Mac app that lists what each of your sessions left open, with one button to open Claude Code on it, and shows where your hours went.

Questions

What is Claude Code project management?

People mean two things by it. One is using Claude Code to plan your work, such as writing specs and tickets. The other is keeping track of the work Claude Code does for you across many sessions and projects. This guide is about the second.

How do I keep track of unfinished work across Claude Code sessions?

Each session is saved as a transcript in ~/.claude/projects. Ask Claude to read the last day's transcripts and list every session that ended with work unfinished or a question waiting on you, with its session ID. Then claude --resume <session-id> reopens it from any folder.

How do I see where my Claude Code time went?

Every prompt you type in the Claude Code terminal is saved with its time and project in ~/.claude/history.jsonl, and Claude Code's 30-day cleanup doesn't delete that file. Ask Claude to add up your time per project from it, or drop the file into the free Claude Code stats page on shabash.dev.

Can I resume a Claude Code session from a different folder?

Yes, by session ID, since v2.1.223. claude --resume <session-id> looks in the current project and its git worktrees first, then in every other project on the machine. If more than one other project holds a copy of that session, it reports the session as not found instead of picking one. Resuming by name only looks in the current repository and its worktrees.