{"_id":"@darshanpatel2608/cursor-dash","_rev":"4-03ad23f22d53b7a79838d57a6ef69357","name":"@darshanpatel2608/cursor-dash","dist-tags":{"latest":"2.2.0"},"versions":{"1.0.0":{"name":"@darshanpatel2608/cursor-dash","version":"1.0.0","keywords":["cursor","dashboard","cli","analytics","local-first"],"author":{"name":"Darshan Patel"},"license":"MIT","_id":"@darshanpatel2608/cursor-dash@1.0.0","maintainers":[{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"}],"homepage":"https://github.com/darshan260802/cursor-dash#readme","bugs":{"url":"https://github.com/darshan260802/cursor-dash/issues"},"bin":{"cursor-dash":"server/cli.js"},"dist":{"shasum":"78b60ce27f22b014c84e0c8f929e1294718ec635","tarball":"https://registry.npmjs.org/@darshanpatel2608/cursor-dash/-/cursor-dash-1.0.0.tgz","fileCount":61,"integrity":"sha512-81hq8y+CsA33KfTAYts6ZyAn59LF/azAoIPBFW4lwKmB5zFSiLr4D6KBvcF5lSeI8GF1Rg18JKMf/uU04tIFng==","signatures":[{"sig":"MEUCIDEg61xSJ+l/xnYfLl/63DnQrTtxG3iKoO2eL0Gwys2XAiEAmMS9LzS0i9TeUOpEpAb3nb8fykK2BiI0j1dH0Ao2VF8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3830566},"main":"index.js","type":"module","engines":{"node":">=20"},"gitHead":"712022fec0707e0ac19bb1d8a38f54f639a3403f","private":false,"scripts":{"dev":"vite","lint":"oxlint","build":"tsc -b && vite build","start":"node server/cli.js","preview":"vite preview","dev:server":"node server/cli.js --port 7788","prepublishOnly":"npm run build"},"_npmUser":{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"},"repository":{"url":"git+https://github.com/darshan260802/cursor-dash.git","type":"git"},"_npmVersion":"11.17.0","description":"A local, read-only dashboard for your Cursor IDE session history — chats, tool calls, tokens, and cost — served from your own machine.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","react":"^19.2.8","shiki":"^3.9.2","shadcn":"^4.16.2","sql.js":"^1.14.1","date-fns":"^4.1.0","recharts":"^3.2.1","react-dom":"^19.2.8","remark-gfm":"^4.0.1","tailwindcss":"^4.3.3","lucide-react":"^1.31.0","react-router":"^7.9.6","@base-ui/react":"^1.7.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","@tailwindcss/vite":"^4.3.3","@tanstack/react-query":"^5.90.5","@tanstack/react-virtual":"^3.13.12","class-variance-authority":"^0.7.1","@fontsource-variable/inter":"^5.3.0","@fontsource-variable/jetbrains-mono":"^5.2.7","@fontsource-variable/bricolage-grotesque":"^5.2.7"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.0","oxlint":"^1.75.0","typescript":"~6.0.2","@babel/core":"^7.29.7","@types/node":"^24.13.3","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","@types/babel__core":"^7.20.5","@vitejs/plugin-react":"^6.0.4","@rolldown/plugin-babel":"^0.2.3","babel-plugin-react-compiler":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cursor-dash_1.0.0_1786305037399_0.7762580643457222","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@darshanpatel2608/cursor-dash","version":"2.0.0","keywords":["cursor","dashboard","cli","analytics","local-first"],"author":{"name":"Darshan Patel"},"license":"MIT","_id":"@darshanpatel2608/cursor-dash@2.0.0","maintainers":[{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"}],"homepage":"https://github.com/darshan260802/cursor-dash#readme","bugs":{"url":"https://github.com/darshan260802/cursor-dash/issues"},"bin":{"cursor-dash":"server/cli.js"},"dist":{"shasum":"18edc20b76a5e5da70b69e0d6002ee206de9dd6c","tarball":"https://registry.npmjs.org/@darshanpatel2608/cursor-dash/-/cursor-dash-2.0.0.tgz","fileCount":63,"integrity":"sha512-yPrFCFrlj+cUmtBKnF0VID7QUSLD++TkEKr9f0ozASDrjHFzu/RdzRbVWbEpq0BMMHa9oexVdiyGtUX7CK7Deg==","signatures":[{"sig":"MEQCIHT+ujyXMc7ORfsjO2RCUBUwIS1TMtgHKcNmPWYEeiVnAiBo2IrAk8q/XaK1EjRNZtXlmVotn7s/OP+HG/fcwbRvMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4003776},"main":"index.js","type":"module","engines":{"node":">=20"},"gitHead":"af9a5eaba5cf5e101999b666bf481177ecc100b1","private":false,"scripts":{"dev":"vite","lint":"oxlint","build":"tsc -b && vite build","start":"node server/cli.js","preview":"vite preview","dev:server":"node server/cli.js --port 7788","prepublishOnly":"npm run build"},"_npmUser":{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"},"repository":{"url":"git+https://github.com/darshan260802/cursor-dash.git","type":"git"},"_npmVersion":"11.17.0","description":"A local, read-only dashboard for your Cursor IDE session history — chats, tool calls, tokens, and cost — served from your own machine.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","gsap":"^3.15.0","react":"^19.2.8","shiki":"^3.9.2","shadcn":"^4.16.2","sql.js":"^1.14.1","date-fns":"^4.1.0","recharts":"^3.2.1","react-dom":"^19.2.8","remark-gfm":"^4.0.1","@gsap/react":"^2.1.2","tailwindcss":"^4.3.3","lucide-react":"^1.31.0","react-router":"^7.9.6","@base-ui/react":"^1.7.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","@tailwindcss/vite":"^4.3.3","@tanstack/react-query":"^5.90.5","@tanstack/react-virtual":"^3.13.12","class-variance-authority":"^0.7.1","@fontsource-variable/inter":"^5.3.0","@fontsource-variable/jetbrains-mono":"^5.2.7","@fontsource-variable/bricolage-grotesque":"^5.2.7"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.0","oxlint":"^1.75.0","typescript":"~6.0.2","@babel/core":"^7.29.7","@types/node":"^24.13.3","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","@types/babel__core":"^7.20.5","@vitejs/plugin-react":"^6.0.4","@rolldown/plugin-babel":"^0.2.3","babel-plugin-react-compiler":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cursor-dash_2.0.0_1786425709992_0.7423228807273914","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@darshanpatel2608/cursor-dash","version":"2.0.1","keywords":["cursor","dashboard","cli","analytics","local-first"],"author":{"name":"Darshan Patel"},"license":"MIT","_id":"@darshanpatel2608/cursor-dash@2.0.1","maintainers":[{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"}],"homepage":"https://github.com/darshan260802/cursor-dash#readme","bugs":{"url":"https://github.com/darshan260802/cursor-dash/issues"},"bin":{"cursor-dash":"server/cli.js"},"dist":{"shasum":"12f7f3d0a88890c902ad57b730dce5f82d6dd9ea","tarball":"https://registry.npmjs.org/@darshanpatel2608/cursor-dash/-/cursor-dash-2.0.1.tgz","fileCount":63,"integrity":"sha512-G0C7bn49QfgAi7SgnoWIwPIIB1wZ5BVZuMYtG3unZH4iDe2LRgh8JddpoolVdJ8wcDqPLnP2vibWgxCKzV1xdQ==","signatures":[{"sig":"MEYCIQCJuO9xtPZ8xJNlups2ijRdFpigZYrCn7uvfgwCGQPbAgIhAMskVqmnwJK9XF45wxV7jclQuQnLFL6N0J10FE4Qr4Bv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4004458},"main":"index.js","type":"module","engines":{"node":">=20"},"gitHead":"44bb0f83749c81ecc9f0cd25f9f4512ea777e9c5","private":false,"scripts":{"dev":"vite","lint":"oxlint","build":"tsc -b && vite build","start":"node server/cli.js","preview":"vite preview","dev:server":"node server/cli.js --port 7788","prepublishOnly":"npm run build"},"_npmUser":{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"},"repository":{"url":"git+https://github.com/darshan260802/cursor-dash.git","type":"git"},"_npmVersion":"11.17.0","description":"A local, read-only dashboard for your Cursor IDE session history — chats, tool calls, tokens, and cost — served from your own machine.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","gsap":"^3.15.0","react":"^19.2.8","shiki":"^3.9.2","shadcn":"^4.16.2","sql.js":"^1.14.1","date-fns":"^4.1.0","recharts":"^3.2.1","react-dom":"^19.2.8","remark-gfm":"^4.0.1","@gsap/react":"^2.1.2","tailwindcss":"^4.3.3","lucide-react":"^1.31.0","react-router":"^7.9.6","@base-ui/react":"^1.7.0","react-markdown":"^10.1.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","@tailwindcss/vite":"^4.3.3","@tanstack/react-query":"^5.90.5","@tanstack/react-virtual":"^3.13.12","class-variance-authority":"^0.7.1","@fontsource-variable/inter":"^5.3.0","@fontsource-variable/jetbrains-mono":"^5.2.7","@fontsource-variable/bricolage-grotesque":"^5.2.7"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.0","oxlint":"^1.75.0","typescript":"~6.0.2","@babel/core":"^7.29.7","@types/node":"^24.13.3","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","@types/babel__core":"^7.20.5","@vitejs/plugin-react":"^6.0.4","@rolldown/plugin-babel":"^0.2.3","babel-plugin-react-compiler":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cursor-dash_2.0.1_1786427154387_0.19450171400967675","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@darshanpatel2608/cursor-dash","version":"2.2.0","private":false,"description":"A local, read-only dashboard for your Cursor IDE session history — chats, tool calls, tokens, and cost — served from your own machine.","keywords":["cursor","dashboard","cli","analytics","local-first"],"homepage":"https://github.com/darshan260802/cursor-dash#readme","bugs":{"url":"https://github.com/darshan260802/cursor-dash/issues"},"repository":{"type":"git","url":"git+https://github.com/darshan260802/cursor-dash.git"},"license":"MIT","author":{"name":"Darshan Patel"},"type":"module","main":"index.js","bin":{"cursor-dash":"server/cli.js"},"scripts":{"dev":"vite","dev:server":"node server/cli.js --port 7788","build":"tsc -b && vite build","start":"node server/cli.js","lint":"oxlint","preview":"vite preview","prepublishOnly":"npm run build"},"dependencies":{"@base-ui/react":"^1.7.0","@fontsource-variable/bricolage-grotesque":"^5.2.7","@fontsource-variable/inter":"^5.3.0","@fontsource-variable/jetbrains-mono":"^5.2.7","@gsap/react":"^2.1.2","@tailwindcss/vite":"^4.3.3","@tanstack/react-query":"^5.90.5","@tanstack/react-virtual":"^3.13.12","class-variance-authority":"^0.7.1","clsx":"^2.1.1","date-fns":"^4.1.0","gsap":"^3.15.0","lucide-react":"^1.31.0","react":"^19.2.8","react-dom":"^19.2.8","react-markdown":"^10.1.0","react-router":"^7.9.6","recharts":"^3.2.1","remark-gfm":"^4.0.1","shadcn":"^4.16.2","shiki":"^3.9.2","sql.js":"^1.14.1","tailwind-merge":"^3.6.0","tailwindcss":"^4.3.3","tw-animate-css":"^1.4.0","untun":"^0.2.2"},"devDependencies":{"@babel/core":"^7.29.7","@rolldown/plugin-babel":"^0.2.3","@types/babel__core":"^7.20.5","@types/node":"^24.13.3","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.4","babel-plugin-react-compiler":"^1.0.0","oxlint":"^1.75.0","typescript":"~6.0.2","vite":"^8.2.0"},"engines":{"node":">=20"},"gitHead":"7ff503bf0f78a0c9d63afc7911566dfd213e7efe","_id":"@darshanpatel2608/cursor-dash@2.2.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-+ae27SJluaUUUJ2Q7qK5/kggzU9B5c+fi26CU7bg+AmsGYvZsNn886fT/eo5Nj3oe5t/5MY8bDNE3zJP0H7HCQ==","shasum":"79d0a39740412de3d211fa6a74194171c42569d5","tarball":"https://registry.npmjs.org/@darshanpatel2608/cursor-dash/-/cursor-dash-2.2.0.tgz","fileCount":65,"unpackedSize":4065114,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDUDCJ3+Ldd/KJR0aVtjHJ2eTJ+cPbyC7kO/ytYk5rKoAiBrH48wbZsww+PQoy/ah19ay/m2v6X8JxdA0SDuydNuaA=="}]},"_npmUser":{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"},"directories":{},"maintainers":[{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cursor-dash_2.2.0_1786734342214_0.1365549218986879"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-09T19:50:37.204Z","modified":"2026-08-14T19:05:42.566Z","1.0.0":"2026-08-09T19:50:37.597Z","2.0.0":"2026-08-11T05:21:50.232Z","2.0.1":"2026-08-11T05:45:54.611Z","2.2.0":"2026-08-14T19:05:42.396Z"},"bugs":{"url":"https://github.com/darshan260802/cursor-dash/issues"},"author":{"name":"Darshan Patel"},"license":"MIT","homepage":"https://github.com/darshan260802/cursor-dash#readme","keywords":["cursor","dashboard","cli","analytics","local-first"],"repository":{"type":"git","url":"git+https://github.com/darshan260802/cursor-dash.git"},"description":"A local, read-only dashboard for your Cursor IDE session history — chats, tool calls, tokens, and cost — served from your own machine.","maintainers":[{"name":"darshanpatel2608","email":"darshanpatel2608ce@gmail.com"}],"readme":"# cursor-dash\n\n[![npm version](https://img.shields.io/npm/v/%40darshanpatel2608%2Fcursor-dash.svg)](https://www.npmjs.com/package/@darshanpatel2608/cursor-dash)\n[![license](https://img.shields.io/npm/l/%40darshanpatel2608%2Fcursor-dash.svg)](./package.json)\n\nA local, read-only dashboard for your [Cursor](https://cursor.com) session history — every chat, tool call, token, and estimated cost, indexed straight from Cursor's own on-disk data. Nothing leaves your machine.\n\n![cursor-dash overview screenshot](./assets/screenshot.png)\n\n## Install\n\nRun it directly, no install required:\n\n```sh\nnpx @darshanpatel2608/cursor-dash@latest\n```\n\nOr install it globally to get a `cursor-dash` command:\n\n```sh\nnpm install --location=global @darshanpatel2608/cursor-dash\n```\n\nthen run it from anywhere:\n\n```sh\ncursor-dash\n```\n\nEither way: it scans Cursor's local data stores, starts a server on `127.0.0.1`, and opens the dashboard in your browser.\n\n## What it shows\n\n- **Every session** across all your Cursor workspaces — agent and chat, archived and draft, with filters for date range, workspace, model, mode, status, errors, tool calls, token range, lines changed, and more.\n- **Full transcripts** — user/assistant messages, collapsible thinking blocks, expandable tool calls with arguments and results, syntax-highlighted code, diffs, todos, and errors.\n- **The context-window budget** — Cursor tracks exactly what's competing for a session's context (system prompt, tools, rules, skills, MCP, subagents, summarized history, live conversation) and exposes it nowhere. cursor-dash renders it as a stacked meter, at three scales: a sparkline in each session row, the full breakdown in a session's header, and a small-multiples grid in Analytics.\n- **Tokens and cost, honestly labelled.** Cursor stores no dollar amounts locally, only token counts, and even those are measured on a minority of messages. Every number carries a provenance tag — `measured`, `reported` (a context-window snapshot, not cumulative spend), or `estimated` (a character-count heuristic) — surfaced in the UI rather than hidden. Cost is computed from an editable price table (sidebar → Pricing) that can also refresh itself from Cursor's published pricing docs; unpriced models show as \"unpriced,\" never silently as $0.\n- **Analytics** — usage over time, model mix, tool call frequency and error rates, context pressure across every session.\n- **Code authorship** — AI vs. human lines per commit and per file extension, from Cursor's own AI-code-tracking database.\n- **Workspaces** — every project folder Cursor has run a session in, with rollups.\n- **Live updates** — the dashboard refreshes automatically as you use Cursor, via a small local change feed.\n\n## How it works\n\nA Node server (`server/`) reads Cursor's local SQLite stores and transcript files — never writing to them — normalizes everything into stable shapes, and serves both a JSON API and the built dashboard from one process. No native dependencies: it uses Node's built-in `node:sqlite` where available and falls back to a pure-WASM SQLite (`sql.js`) otherwise, so it works without a compiler toolchain on macOS, Windows, or Linux.\n\nData sources read (all optional — a missing one just degrades that panel):\n\n| Source | Path (macOS / Windows) |\n|---|---|\n| Session index & messages | `~/Library/Application Support/Cursor/User/globalStorage/state.vscdb` · `%APPDATA%\\Cursor\\User\\globalStorage\\state.vscdb` |\n| Full-text search | `.../globalStorage/conversation-search.db` |\n| AI code-authorship tracking | `~/.cursor/ai-tracking/ai-code-tracking.db` |\n| Raw agent transcripts | `~/.cursor/projects/*/agent-transcripts/*/*.jsonl` |\n| Per-workspace legacy activity | `.../User/workspaceStorage/*/state.vscdb` |\n\n> **Windows note:** every path is built with `path.join` from platform-detected roots and the code has been reviewed for POSIX-only assumptions, but it has only been *run* on macOS during development. If something doesn't resolve correctly on Windows, please file an issue.\n\n## CLI options\n\n```\ncursor-dash [options]\n\n  -p, --port <n>     Port to listen on (default: 7788, auto-increments if taken)\n      --data-dir <p> Override the Cursor data directory to scan\n      --no-open      Don't open the dashboard in a browser\n      --cloud        Enable the optional live Cursor usage sync (reads your local\n                      Cursor auth token and calls cursor.com — off by default)\n      --share        Expose the dashboard on a public HTTPS URL via a free\n                      Cloudflare Quick Tunnel, gated by a one-time 8-character\n                      access code. Nothing to install or sign up for — the\n                      tunnel binary downloads itself on first use. Sharing can\n                      also be started and stopped later from the dashboard's\n                      Share page, without this flag.\n  -h, --help          Show help\n  -v, --version       Show the version\n```\n\n(`npx @darshanpatel2608/cursor-dash@latest [options]` works the same way if you didn't install it globally.)\n\n## Sharing your dashboard\n\nSharing is for a team lead who wants to watch a teammate's Cursor usage remotely: cursor-dash only ever reads the *host machine's* data, so the person whose usage is being watched is the one who shares, not the person watching. It can be turned on two ways — pass `--share` at launch, or open the **Share** page in the sidebar (below Workspaces) and click **Start sharing** at any time. Either way you get back a public URL and an 8-character code:\n\n```\n  Shared publicly at  https://random-words-here.trycloudflare.com\n  Access code         K7M2QX4P\n```\n\nand send both to whoever should see the dashboard. No account, no config, no port forwarding on either end — the tunnel is a free [Cloudflare Quick Tunnel](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/), set up automatically via [`untun`](https://github.com/unjs/untun). The Share page also has a **Stop sharing** button — it closes the public link and revokes the code but leaves the dashboard itself running, so you don't have to restart cursor-dash just to turn sharing off.\n\nA few things worth knowing before you send that link:\n\n- **Anyone with the code has full access** — every session, transcript, and file diff on that machine, the same as sitting at the keyboard. There's no read-only mode. Don't share it with anyone you wouldn't hand your Cursor history to directly.\n- **The link and code are ephemeral.** A fresh pair is generated every time sharing starts, and both stop working the moment sharing is stopped (via the Share page or `Ctrl-C`) — nothing is written to disk.\n- **Quick Tunnels come with Cloudflare's own caveats:** no uptime SLA, a 200-concurrent-request ceiling, and they're explicitly meant for testing/development rather than production traffic. Fine for casual team use.\n- Your own use at `http://127.0.0.1:<port>` is completely unaffected — the code is only ever required for requests arriving through the public URL, and the Share page itself is only ever visible to you, not to anyone connected through the tunnel.\n\n## Privacy\n\nBy default, everything runs on `127.0.0.1` and only accepts loopback requests — that stays true unless you turn sharing on (via `--share` or the dashboard's Share page), which trades that guarantee for the public-URL-plus-code model described above. cursor-dash reads Cursor's local databases through snapshot copies — it never opens them for writing, never touches them mid-write — and nothing you type or that Cursor recorded leaves your machine on its own. Three narrow exceptions, all explicit opt-ins:\n\n- **Refresh pricing** (sidebar → Pricing → Refresh pricing) fetches Cursor's public pricing docs page to update the cost-estimate table. No account data is sent — it's the same request your browser makes loading that page.\n- **`--cloud`** enables an unofficial cursor.com usage endpoint that reads your local Cursor auth token. It's off by default and has to be started explicitly with that flag.\n- **Sharing** puts the dashboard on a public URL, as above. Traffic to a Cloudflare Quick Tunnel is TLS-terminated at Cloudflare's edge like any other site behind Cloudflare.\n\n## Development\n\n```sh\ngit clone https://github.com/darshan260802/cursor-dash.git\ncd cursor-dash\nbun install\nbun run dev         # Vite dev server on :5173, proxying /api to :7788\nbun run dev:server  # the API server, in another terminal\nbun run build        # builds dist/\nbun start             # runs the built app end-to-end (same as `cursor-dash`)\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}