{"id":51560031,"url":"https://github.com/seolsnow/toolytics","last_synced_at":"2026-07-10T09:34:21.918Z","repository":{"id":366963591,"uuid":"1278581673","full_name":"seolsnow/toolytics","owner":"seolsnow","description":"Local dashboard of your Claude Code \u0026 Codex tool usage — which tools, skills, and MCP methods you actually use, plus a daily collector that preserves history past transcript cleanup.","archived":false,"fork":false,"pushed_at":"2026-06-25T17:27:27.000Z","size":684,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-10T09:34:17.411Z","etag":null,"topics":["claude-code","cli","codex","dashboard","developer-tools","usage-analytics"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seolsnow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-23T23:49:29.000Z","updated_at":"2026-06-26T07:01:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/seolsnow/toolytics","commit_stats":null,"previous_names":["seolsnow/toolytics"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/seolsnow/toolytics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seolsnow%2Ftoolytics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seolsnow%2Ftoolytics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seolsnow%2Ftoolytics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seolsnow%2Ftoolytics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seolsnow","download_url":"https://codeload.github.com/seolsnow/toolytics/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seolsnow%2Ftoolytics/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35328278,"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-07-10T02:00:06.465Z","response_time":60,"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","cli","codex","dashboard","developer-tools","usage-analytics"],"created_at":"2026-07-10T09:34:17.883Z","updated_at":"2026-07-10T09:34:21.889Z","avatar_url":"https://github.com/seolsnow.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# toolytics\n\nA self-contained dashboard for **your own Claude Code and Codex usage** — which\ntools and MCP methods you actually reach for, and how often.\n\n![toolytics dashboard — skills and MCP tools](assets/dashboard-skills.png)\n\n## What it does (and why you'd want it)\n\nClaude Code and Codex log sessions locally, but neither shows you the\naggregate. toolytics reads `~/.claude/projects/**/*.jsonl` and\n`~/.codex/sessions/**/*.jsonl` and answers questions you otherwise can't:\n\n- **What do I actually use?** Every tool, `skill:\u003cname\u003e` invocation, and\n  `mcp__server__method` call, ranked by count across *all* your projects.\n- **What's a workhorse vs. dead weight?** Because everything is ranked by count,\n  the tools you lean on rise to the top and the ones you barely (or never) reach\n  for sink to the bottom — easy to spot what to keep, prune, or reconsider.\n- **Claude vs. Codex, direct vs. delegated.** Filter the two runtimes, then\n  split main-session calls from calls your subagents/workflows made for you.\n- **Which skills auto-fire?** Real counts of SessionStart hook injections\n  (the skills/guidance silently prepended to your sessions), so you can see\n  what's actually running vs. just installed.\n- **Skills you never use.** The roster includes every installed skill, so\n  zero-count ones still show up.\n\nEverything is filterable in the browser (by runtime, direct/delegated, project,\ndate range, tool search) — the dashboard is one self-contained HTML file with\nthe data inlined, so you can open or archive it offline. If you share that file,\ntreat it as local usage metadata: project labels and tool/skill/plugin counts\nare embedded in the HTML.\n\nIt also **outlives log cleanup.** Claude Code deletes transcripts after\n~30 days; toolytics keeps a cumulative CSV and (optionally) runs a daily\nbackground daemon so your history keeps growing even after the raw logs are gone.\nInstalling as either the Claude Code or Codex plugin registers that daemon for\nyou; a standalone setup registers it by running `./install-daemon.sh` once\n(see below).\n\n## Quick start\nRequires `bash` and `python3`.\n\n```sh\n./build.sh               # scan everything → update cumulative DBs → build dashboard → open browser\n./build.sh 7             # default view to last 7 days (full history is still kept)\n./build.sh --selfcheck   # regression guard for the merge \u0026 attribution logic\n```\nOutput goes to `~/.toolytics/` (override with `TOOLYTICS_HOME`):\n`history.csv` / `injects.csv` (cumulative DBs) + `dashboard.html`.\nScans are incremental: unchanged transcripts are reused from a per-file cache\n(`scan-state.json`), so re-runs only reparse changed files. That cache is purely\na speed-up — delete it any time and the next run full-scans and rebuilds it.\n\n## Platform support\n- macOS: full support, including the launchd daily collector.\n- Linux: full support, including a systemd user timer or cron fallback.\n- WSL: use the Linux path. Data, daemon registration, and `~/.toolytics` live\n  inside WSL.\n- Native Windows: supported from Git Bash/MSYS/Cygwin. `build.sh` scans the\n  Windows home transcript roots, opens the dashboard via `cmd start`, and\n  `install-daemon.sh` registers a per-user Windows Scheduled Task with\n  `schtasks`. `bash`, `python3`, and `schtasks` must be available from that\n  shell. Note: `python3` must resolve to a real Python — the Microsoft Store\n  stub at `WindowsApps\\python3.exe` opens the Store instead. If your install\n  ships only `python.exe` (the winget `Python.Python.3.x` package does), make\n  `python3.exe` a one-time hardlink to it in the Python install dir.\n\nNative Windows support is intentionally the Git Bash path, not a PowerShell or\n`cmd.exe` installer. WSL remains separate: running toolytics inside WSL scans\nWSL's home directory and registers the Linux daemon there, not the Windows host\nlogs or Windows Task Scheduler.\n\nVS Code does not need special integration. toolytics scans the transcript roots\nvisible from the process that runs it. In local VS Code terminals that means the\nlocal home directory; in WSL, Remote SSH, dev containers, or Codespaces it means\nthe remote/container home directory, not your host machine's logs.\n\n## Known limitations\n- The native Windows scheduler path requires Git Bash/MSYS/Cygwin. There is no\n  PowerShell or `cmd.exe` installer.\n- WSL, Remote SSH, dev containers, and Codespaces scan their own home directory,\n  not the host machine's transcript roots.\n- Injection counts and the installed-skill roster come from Claude Code\n  transcripts and disk layout. Codex tool calls are counted, but Codex native\n  skill loading does not expose the same skill-inventory/injection records.\n- Skills are keyed by leaf name. If two installed skills share the same leaf\n  name, their `skill:\u003cname\u003e` counts are merged.\n\n## Install\ntoolytics scans both `~/.claude/projects` and `~/.codex/sessions`, so one install\ncovers Claude Code, Codex, or both. Pick the path that fits your setup.\n\n### Standalone (any runtime — Claude Code, Codex, or both)\nClone the repo and run the build; it collects every runtime it finds on disk:\n```sh\n./build.sh               # scan → update cumulative DBs → build dashboard → open browser\n./install-daemon.sh      # (optional) register the daily collector so history survives log cleanup\n```\n`install-daemon.sh` is idempotent — re-running just refreshes the registration.\nThe daily collector installer supports macOS launchd, Linux systemd/cron, and\nnative Windows Scheduled Tasks from Git Bash/MSYS/Cygwin. Remove it any time\nwith `./install-daemon.sh --remove`.\n\n### As a Codex plugin (auto-registers the daemon)\n\nFrom a local clone, register the repository marketplace and install the plugin:\n\n```sh\ncodex plugin marketplace add .\ncodex plugin add toolytics@toolytics\n```\n\nFor GitHub, replace `.` with `seolsnow/toolytics`. Start a new Codex thread,\nrun `/hooks`, and trust the `toolytics` SessionStart hook. The hook calls\n`install-daemon.sh ensure`, so the daily collector registers or repairs itself\nbefore dashboard use. Then ask Codex to open the toolytics dashboard or invoke\n`$toolytics`.\n\n### As a Claude Code plugin (auto-registers the daemon)\nThis repo is itself the plugin **and** the marketplace (`marketplace.json` with\n`source: \"./\"`).\n\nInside Claude Code (interactive):\n```\n/plugin marketplace add seolsnow/toolytics    # or a local clone path\n/plugin install toolytics@toolytics\n```\nFrom a terminal (non-interactive):\n```sh\nclaude plugin marketplace add seolsnow/toolytics\nclaude plugin install toolytics@toolytics --scope user\n```\nOnce installed, a SessionStart hook self-installs the daily collector daemon\n(macOS launchd / Linux systemd·cron / Windows Scheduled Task), which gathers\ndata before transcript cleanup (default 30 days) so past history is preserved.\nThis auto-registration also applies to the Codex plugin above. The daemon\noutlives the plugin, so to stop it run `install-daemon.sh --remove` **before**\nuninstalling the plugin (while the script is still on disk); otherwise its daily\nrun just fails harmlessly once the script path is gone.\n\n## Permissions — prompts depend on your client configuration\n\n`/toolytics` runs a local Bash script, and the plugin has a SessionStart hook\nthat registers the daily collector. Claude Code may ask for one-time approval\nof either action, depending on your client and permission settings:\n\n1. **Trust the plugin hook**, if Claude Code asks. The hook only ensures the\n   per-user daily collector is registered.\n2. **Allow the build**, if `/toolytics` prompts before running Bash. Choose\n   **\"Yes, and don't ask again\"** to persist that approval. The script only\n   reads local transcripts and writes to `~/.toolytics`.\n\nA configuration such as `\"permissions\": { \"defaultMode\": \"auto\" }` can\nallow the build without showing the Bash prompt. Hook trust is controlled\nseparately, so do not infer one prompt from the presence or absence of the\nother.\n\nIn Codex, review and trust the `toolytics` hook through `/hooks`. That trust is\nseparate from normal Bash-command approvals.\n\nThe daily collector runs outside Claude Code after registration. It rebuilds\n`~/.toolytics/dashboard.html` daily, so bookmarking\n`file://$HOME/.toolytics/dashboard.html` opens the latest completed build.\n\nRather pre-authorize than click? Add this once to `~/.claude/settings.json`:\n```json\n\"permissions\": { \"allow\": [\"Bash(bash *toolytics*build.sh*)\"] }\n```\n\n## Environment variables\n- `TOOLYTICS_HOME` — output directory (default `~/.toolytics`)\n- `TOOLYTICS_OPEN=0` — skip auto-opening the browser\n- `TOOLYTICS_TRIM=\"a,b\"` — strip leading path segments from project labels (cosmetic)\n- `TOOLYTICS_INJECT_ALIAS=\"check-setup.sh=superpowers\"` — relabel an inject source\n  whose plugin can't be auto-resolved (a hook script deleted across versions before\n  it was ever scanned). One run seeds the persistent attribution cache. Empty by default.\n\nFor the design and rationale, see [AGENTS.md](AGENTS.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseolsnow%2Ftoolytics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseolsnow%2Ftoolytics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseolsnow%2Ftoolytics/lists"}