{"_id":"@avcodes/skilled","_rev":"8-bce2238948db585d01ed9a0415172019","name":"@avcodes/skilled","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"@avcodes/skilled","version":"0.1.0","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.1.0","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"9f53e7e0dbf63d827bc2919d0761b5636dcf4734","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.1.0.tgz","fileCount":3,"integrity":"sha512-vSBlHihs/FsKy04shxQOkTc3zOwvwXo/v1Vc/qIQXPA+CVQJlu58smonmlVrpEM/Z8Lu057rdBf/1Ar+yr1+Pg==","signatures":[{"sig":"MEUCIQDucbyUbbcnVqrUGjmwnTZlA2ghbaWgWKN4EON9eG//RQIgfgjyocXlI2ptphlHyroGJQWojbXMoWQQMBqj6x+skHc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4073},"engines":{"node":">=14"},"gitHead":"dcb16dd82e928b830ddf96fc51b5f099add2752c","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"avcodes","email":"av@av.codes"},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"10.9.4","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"22.22.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.1.0_1778885572925_0.44197276378004924","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@avcodes/skilled","version":"0.2.0","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.2.0","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"b223eb67c1ec8f36e5ff283ccc6aee442d512f5f","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.2.0.tgz","fileCount":3,"integrity":"sha512-1I+WH+Hq4rGWdmzMHUq2cFThWbPPenGDFtGPE6I694oas7V7NPzTkhWikkdtxACkcVPYH8o1kAMww2QiiYGP+w==","signatures":[{"sig":"MEQCICtQwNfGyJU/E3y9GtVrmw6OKnHdaW4LgChO2cgLYuw4AiBpRylsEe/WrgCzAVWN2N94PDZVr9Ca/X0c/P/uOztL4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7280},"engines":{"node":">=14"},"gitHead":"39fa313ba003138c0ca5bbadb4de790bcd283e3a","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.12.1","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.2.0_1778962096644_0.3422777896771385","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@avcodes/skilled","version":"0.3.0","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.3.0","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"3cb40005e71ab34021cbddcbd33b4385e23ee563","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.3.0.tgz","fileCount":3,"integrity":"sha512-xeklqxoLIQrKsxFI5BGVhZ84BlqTeVBYvPCzwn4eozMhR5n9zWPhMbluSOoefzVCnN9480bXsrQzzncmoPu0FA==","signatures":[{"sig":"MEUCIEpazGFYi5abL2fROmDykklNg4mHZD2TseqpGJuuMVHRAiEAupM7OFg8MDX0ZA9tVQTuQCjo0n6gx89QDnrbNRUsbkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7612},"engines":{"node":">=14"},"gitHead":"da5d95c0e8b1b979025fbf85b5c25406e26d4b94","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.12.1","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.3.0_1778966594176_0.8198421598827517","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@avcodes/skilled","version":"0.3.1","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.3.1","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"46045d4cc4ef852c39910c500b188b4f8e4f35fc","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.3.1.tgz","fileCount":3,"integrity":"sha512-iv6O/cD9y7wFEJ+N0FoHS3/QxiUKoc9krd4R/6nN9dqW+k0cnYtx2gyI9y4V31UJYzAsfag/7V+y6LdO5Az15g==","signatures":[{"sig":"MEUCIE49tqG43BB7I63v42FRc18Vhix6Zmb/pJT2FIHPQ9DFAiEAnDmGctPO5NWp0CxtzdGvF3PAx6lkEmXYXBIxmxtk9H0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10173},"engines":{"node":">=14"},"gitHead":"8580e53fcbc6fd93d7dc989a7af465695bc42517","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.12.1","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.3.1_1779045132381_0.23149618133447736","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@avcodes/skilled","version":"0.3.2","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.3.2","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"bb8eb4ee212cdea2d445bc475cc0e966edd7d143","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.3.2.tgz","fileCount":3,"integrity":"sha512-bIOUcRZX9OtN5d9UL5MFxA2qQfcN1YhfTeFdR+s9ifmZANiudqdCupHJ1pe50AE+4gmQTNu/OZn7cXo13apZ0w==","signatures":[{"sig":"MEUCIQC5Ag5ZJTyg02gAd0NOzJ2tnLMfyv7JmzKEIaROjNA0fAIgYRG5f2HP5k3MW251BqA00o7e0EIqV7k5hNHRw5g5h98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10721},"engines":{"node":">=14"},"gitHead":"60159b35d451fb37098ba8643650e6d4fb8430c2","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.12.1","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.3.2_1779110250589_0.34585815006977194","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@avcodes/skilled","version":"0.3.3","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.3.3","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"b509f3a582e0be6c3e703a390fbb2af90d7ee218","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.3.3.tgz","fileCount":3,"integrity":"sha512-Z2yEdR1xH2T5Qt92zzyF4oF+n6f1DuddZGDVORHSRgibm7GWesrzozYKclhbEY9ULGi1LFHIf7puW3SfKB+QSg==","signatures":[{"sig":"MEYCIQCieG2BccHxEElj5nVJrRKQ60HYzhhQ/xqa8LH9/UGGBwIhAJRslFbe7rr9CR9MVF8DBhhz5/aav/xhi57T7MHOZMnD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":11021},"engines":{"node":">=14"},"gitHead":"6b2d1419a69636fed94dc81d3d7d73611ee22841","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.19.0","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.3.3_1789295240974_0.9805086028290972","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@avcodes/skilled","version":"0.4.0","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"license":"MIT","_id":"@avcodes/skilled@0.4.0","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"homepage":"https://github.com/av/skilled","bugs":{"url":"https://github.com/av/skilled/issues"},"os":["darwin","linux","win32"],"bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"dist":{"shasum":"52d066b2dedef7c5d6ac95a3a3715b57c0297fd8","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.4.0.tgz","fileCount":3,"integrity":"sha512-xdEyvv4ICeQBL1c0RpZsul8cRhy7s41eAyP0FOEtmn/yqk0HMAXsejExXvhpRzJqunpwIJ6/dTPkYTWiJoBl4Q==","signatures":[{"sig":"MEUCIQCkWltRDL0dS3KOTTVgMWArJzTMN0wF80WhAg4BRmMeHwIgWJly1L7TeNYZP6D29bPfbVcrsTbCN2Drzrp9nFaQlPU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHevgSQwIgGTZP/rBSXM0LmqzXAOZqDBKZ6PnY+NeDbvAiAotvro7oyEeM72OgcwPRrCQ7oXPI9sUdmX8bvKp3YdGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13701},"engines":{"node":">=14"},"gitHead":"0bbc9028738876f902fceef73a9ef63b8a23aa15","scripts":{"postinstall":"node install.js"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.19.0","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/skilled_0.4.0_1789938090242_0.6054732741509752","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"os":["darwin","linux","win32"],"_id":"@avcodes/skilled@0.4.1","bin":{"skilled":"bin/skilled"},"cpu":["x64","arm64"],"bugs":{"url":"https://github.com/av/skilled/issues"},"dist":{"shasum":"37fbdc963b5eec3eff9dd64da92197b3c41f3f9a","tarball":"https://registry.npmjs.org/@avcodes/skilled/-/skilled-0.4.1.tgz","fileCount":3,"integrity":"sha512-dTqUwfg7FwgYLb6dcXwzKe5WlrXiHZULnQq90b7ZnEYldqxWnQ3YLvXMGG761+cozK/Ftie7Q6uD9REeEePGVQ==","signatures":[{"sig":"MEQCIQDFpHlm7QfMXYZOcA/qHkaEUP+Qurh3nOLI8FL11m/IQwIfezASQ1m//6erpxk96qi57i8A4y0r2n9lF8S5KLtVBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBX17KCdg3WNvPB63WKwRiBLp3QjHXQ42ZOMIolFKXvlAiA458XArPCklxmEIGv15FlxaQRuzVTXH+JSi9gdjrpGmA=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avcodes%2fskilled@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":13701},"name":"@avcodes/skilled","engines":{"node":">=14"},"gitHead":"c39bd4c5b8b28d8f984b5ce960439c24c85361af","license":"MIT","scripts":{"postinstall":"node install.js"},"version":"0.4.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:931a0e50-a3d5-40cf-b57d-2881f4703793"}},"homepage":"https://github.com/av/skilled","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"_npmVersion":"11.19.0","description":"TUI dashboard for skill usage stats across AI coding tools","directories":{},"maintainers":[{"name":"avcodes","email":"av@av.codes"}],"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/skilled_0.4.1_1789981233393_0.5731127864485159"}}},"time":{"created":"2026-05-15T22:52:52.858Z","modified":"2026-09-21T09:00:33.898Z","0.1.0":"2026-05-15T22:52:53.070Z","0.2.0":"2026-05-16T20:08:16.776Z","0.3.0":"2026-05-16T21:23:14.312Z","0.3.1":"2026-05-17T19:12:12.521Z","0.3.2":"2026-05-18T13:17:30.740Z","0.3.3":"2026-09-13T10:27:21.124Z","0.4.0":"2026-09-20T21:01:30.316Z","0.4.1":"2026-09-21T09:00:33.481Z"},"bugs":{"url":"https://github.com/av/skilled/issues"},"license":"MIT","homepage":"https://github.com/av/skilled","keywords":["skilled","tui","cli","coding-agents","skill-usage","dashboard"],"repository":{"url":"git+https://github.com/av/skilled.git","type":"git"},"description":"TUI dashboard for skill usage stats across AI coding tools","maintainers":[{"name":"avcodes","email":"av@av.codes"}],"readme":"[![screenshot](./assets/screenshot.png)](https://www.youtube.com/watch?v=Lmq8A9R49ZI)\n\n[![release](https://shieldcn.dev/github/release/av/skilled.png?variant=secondary)](https://github.com/av/skilled/releases)\n[![npm](https://shieldcn.dev/npm/@avcodes/skilled.png?variant=secondary)](https://www.npmjs.com/package/@avcodes/skilled)\n[![pypi](https://shieldcn.dev/pypi/skilled.png?variant=secondary)](https://pypi.org/project/skilled/)\n[![license](https://shieldcn.dev/npm/license/@avcodes/skilled.png?variant=secondary)](https://github.com/av/skilled/blob/main/LICENSE)\n[![TypeScript + Rust](https://shieldcn.dev/badge/TypeScript%20%2B%20Rust-blue.png?variant=secondary)](https://github.com/av/skilled)\n\nYour AI coding tools keep traces. Skilled reads them.\n\nLive TUI dashboard that aggregates skill usage across Claude Code, OpenCode, Codex, Grok, and Droid. Reads local history files only. Zero network, zero telemetry.\n\n## What you get\n\n- 30 fps terminal dashboard: bar charts, 16-week activity heatmap, hourly histogram, recent activity feed\n- Skill audit: heavy hitters, rising/declining trends, stale skills, one-offs, cross-project patterns\n- CLI with JSON output: `skilled list`, `skilled audit`, `skilled detail <skill>`. Filter by source or project.\n\n## Install\n\nShell (Linux / macOS):\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/av/skilled/main/install.sh | sh\n```\n\nnpm:\n\n```sh\nnpm install -g @avcodes/skilled\n```\n\npip:\n\n```sh\npip install skilled\n```\n\nThen run `skilled`.\n\n## Usage\n\n```\nskilled                          Interactive dashboard\nskilled list                     All skills ranked by usage\nskilled list --sort recent       Sorted by last used\nskilled detail review            Deep dive on one skill\nskilled audit                    Health report across all skills\nskilled calls --source codex     Raw invocations from a specific tool\nskilled providers                Which tools are detected\n```\n\nAdd `--json` to any command for machine-readable output. Filter with `--source <tool>` and `--project <path>`.\n\n### TUI keys\n\n| Key | Action |\n|-----|--------|\n| `s` | Cycle sort: count → alphabetical → recent |\n| `Tab` | Toggle sort direction |\n| `j` / `k` | Scroll |\n| `Enter` | Toggle skill detail (replaces right panel) |\n| `/` / `f` | Open filter bar (source, project, skill name) |\n| `a` | Toggle audit view |\n| `r` | Refresh data |\n| `Esc` | Close detail/audit/filter, or quit |\n| `q` | Quit |\n\n## Supported tools\n\n| Tool | What it reads |\n|------|--------------|\n| **Claude Code** | `~/.claude/history.jsonl` + session JSONL files |\n| **OpenCode** | Local session history |\n| **Codex** | Local session history |\n| **Grok** | Local session history, including `read_file` of `skills/<name>/SKILL.md` |\n| **Droid** | Local session history |\n\nSkilled auto-detects which tools are installed. No configuration needed. If the history files exist, they show up.\n\n## How it works\n\nEach tool writes session traces to predictable local paths. Skilled has a provider for each one that parses those files and extracts skill invocations (slash commands, tool calls, skill triggers, and Grok `read_file` loads of `skills/<name>/SKILL.md`) into a common format: skill name, timestamp, project, session, source.\n\nFrom there: frequency counts, weekly trends, hourly distribution, per-project breakdowns, and audit heuristics (rising = 50%+ increase over 4 weeks, stale = unused 28+ days, etc.).\n\nThe TUI renders at 30 fps using [@opentui/core](https://github.com/nicholasgasior/opentui). Bar charts use 8-level Unicode block elements for sub-character precision. The heatmap uses a 5-level green intensity ramp.\n\nNo data leaves your machine. No accounts, no config files, no API keys.\n\n## Desktop\n\nThe same data model as the TUI, as a native window: Tauri v2 shell, Rust index linked in-process, React UI. macOS (universal `.dmg`), Linux (`.AppImage`, `.deb`, `.rpm`) and Windows (`.msi`, NSIS installer) bundles are built by the [Desktop workflow](.github/workflows/desktop.yml).\n\n![desktop dashboard](./desktop/docs/dashboard.png)\n\n- Dashboard, skill detail, raw activity, audit, providers and settings views with the TUI filter syntax (`source:codex p:myapp review`) and the same sort modes and keyboard shortcuts (`s`, `Tab`, `j/k`, `/`, `a`, `r`, `Esc`, `q`, `Ctrl/Cmd+1…5`).\n- Native extras: system tray with live counts, live refresh when a provider writes a new session, JSON/CSV export through the save dialog, open/reveal the session file behind any call, OS light/dark appearance, restored window position.\n- Offline by construction: CSP forbids network, no http plugin, no telemetry.\n\nScreenshots of every view and a recording of the app running live in [`desktop/docs`](./desktop/docs) (`tour.mp4` / `tour.gif`, regenerated by `desktop/scripts/capture.sh --record`).\n\n```\n┌──────────────────────────── Skilled.app ─────────────────────────────┐\n│  React UI (desktop/ui)  ──── src/view.ts, src/data.ts (shared w/ TUI) │\n│        │ invoke(\"snapshot\")                                           │\n│  Tauri v2 shell (desktop/src-tauri)                                   │\n│        ├─ skilled_index (index/, in-process)  → ~/.skilled/index.db   │\n│        ├─ fallback: `skilled --no-index --json` (TS providers)        │\n│        └─ notify watcher on provider dirs → live refresh + tray       │\n└───────────────────────────────────────────────────────────────────────┘\n```\n\nDevelop and build (requires Bun, Rust and the [Tauri prerequisites](https://tauri.app/start/prerequisites/)):\n\n```sh\ncd desktop\nbun install\nbun run dev              # tauri dev with UI rebuild-on-change\nbun run test             # unit tests: view models + the snapshot → views data path (headless React)\ncd src-tauri && cargo test && cd ..   # Tauri commands invoked over IPC on the mock runtime, index, settings, watcher\nsh scripts/dev-check.sh  # typecheck + debug binary\nbun run test:e2e         # launches the debug binary against tests/fixtures/home, incl. a live history update\nbun run build            # release bundles in src-tauri/target/release/bundle\n```\n\n## Build from source\n\nRequires [Bun](https://bun.sh):\n\n```sh\ngit clone https://github.com/av/skilled.git\ncd skilled\nbun install\nbun run start\n```\n\nCompile to a standalone binary:\n\n```sh\nbun run build    # outputs ./skilled\n```\n\n### Optional: Rust index\n\nFor faster re-scanning of large history files:\n\n```sh\ncd index\ncargo build --release\n```\n\nThe TUI will use the index automatically when available.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}