{"id":50913168,"url":"https://github.com/splitbrain/wdid","last_synced_at":"2026-06-16T12:02:19.607Z","repository":{"id":355776619,"uuid":"1229261674","full_name":"splitbrain/wdid","owner":"splitbrain","description":"what did i do? claude remembers","archived":false,"fork":false,"pushed_at":"2026-05-05T06:57:59.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-05T08:34:51.724Z","etag":null,"topics":["claude-code","vibe-coded"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/splitbrain.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-04T21:36:57.000Z","updated_at":"2026-05-05T06:58:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/splitbrain/wdid","commit_stats":null,"previous_names":["splitbrain/wdid"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/splitbrain/wdid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitbrain%2Fwdid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitbrain%2Fwdid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitbrain%2Fwdid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitbrain%2Fwdid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/splitbrain","download_url":"https://codeload.github.com/splitbrain/wdid/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitbrain%2Fwdid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34404748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","vibe-coded"],"created_at":"2026-06-16T12:02:18.933Z","updated_at":"2026-06-16T12:02:19.602Z","avatar_url":"https://github.com/splitbrain.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wdid — what did I do?\n\nA small CLI that reports your Claude Code activity for a given day, derived\nfrom the JSONL session logs under `~/.claude/projects/`.\n\n## Usage\n\n```\n./wdid                  # today\n./wdid yesterday\n./wdid 2026-04-30\n./wdid --no-summarize   # skip Haiku-based descriptions\n```\n\nOutput:\n\n```\nSTART  END    DUR    PROJECT  DESC\n-----------------------------------------------------------------------------------\n09:12  10:04  00:48  api      Add rate limiting middleware and integration tests\n10:20  11:35  01:11  webapp   Migrate user settings page to new component library\n13:30  14:02  00:31  scripts  Investigate slow nightly backup job\n-----------------------------------------------------------------------------------\n       total  02:30  (3 sessions)\n```\n\n## How it figures out engagement\n\nA single Claude Code session log can span many real working sessions\n(`claude --resume` reattaches to old logs hours or days later). `wdid`\nwalks each log, sorts events by timestamp, and splits into engagement\nsessions wherever the gap between consecutive events exceeds 30 minutes.\n\nEngagement time per session is the sum of consecutive in-session gaps\n(naturally capped at 30 min by the splitting rule), plus a 3-minute\ntrailing read buffer when the session ends on an assistant message — the\nlogs have no close/exit signal, so we credit roughly the same idle window\nthat triggers Claude's own `away_summary`.\n\nSubagent logs (`.../subagents/...`) are skipped — they overlap with their\nparent session and would double-count time.\n\n## Session descriptions\n\nThe `DESC` column comes from, in order of preference:\n\n1. A Haiku-generated summary (cached at `~/.cache/wdid/titles-YYYY-MM-DD.json`).\n   The summary is built from your prompts, the tool actions Claude took\n   (file edits, shell commands), and the last few assistant replies, so it\n   tends to reflect what was actually done rather than just the opening\n   prompt.\n2. Claude's own `ai-title` entry, if Haiku is disabled or fails.\n3. The first non-slash user prompt.\n\n## Requirements\n\n- Python 3.9+ (standard library only)\n- Optional: `ANTHROPIC_API_KEY` environment variable for Haiku-based\n  summaries. Without it, `wdid` falls back to `ai-title` / first prompt.\n\nThe summarizer uses `claude-haiku-4-5-20251001` via the Anthropic\nMessages API, called directly through `urllib`. Each title is cached, so\nsubsequent runs make zero API calls.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsplitbrain%2Fwdid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsplitbrain%2Fwdid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsplitbrain%2Fwdid/lists"}