Turn your ChatGPT export into a navigable personal-story dashboard. Runs locally on your own machine, your data never leaves your laptop.
The dashboard reads your ChatGPT data export and produces four views over your last few years of conversation:
- Overview — totals, streaks, gaps
- Rhythms — when, what model, how much, how long
- Timeline — monthly narratives + era detection
- Topics — embeddings, UMAP scatter, named clusters
It's not a chat browser. It's a tool for looking at the shape of three years of asking AI questions — what you were working on, learning, wrestling with — and seeing patterns you wouldn't notice scrolling through them one at a time.
Claude Sonnet reads every conversation summary from a given month and writes a paragraph capturing what you were actually working on. Highlight cards link straight to the originals.
Stacked-area chart of every assistant message by model family — the gpt-4 era, the gpt-4o ramp, the move to gpt-5 thinking.
Hour × day-of-week heatmap surfaces your real rhythm — the late-night research bursts, the consistent morning queries, the weekend gaps.
Every conversation embedded with OpenAI text-embedding-3-small, projected to 2D with UMAP, k-means clustered, and labeled by Claude Sonnet. The axes mean nothing — only distance matters.
Click any cluster to focus the scatter and explore its representative conversations.
- Request your export from ChatGPT: Settings → Data Controls → Export → wait for the email.
- Clone this repo:
git clone https://github.com/YOUR_USERNAME/ai-usage-dashboard cd ai-usage-dashboard - Drop the
Conversations__*.zipintoOpenAI-export/User Online Activity/. - Set up env:
cp .env.local.example .env.local # Edit .env.local — add your Anthropic + OpenAI keys, optional DASHBOARD_PASSWORD - Install + run the pipeline:
npm install npm run ingest # ~30s, free ANALYZE_LIMIT=20 npm run analyze # validate prompt quality first npm run analyze # full run, ~20 min, ~$1–2 npm run normalize # canonical topic buckets npm run embed # ~3 min, ~$0.05 npm run narratives # ~10 min, ~$2–5
- Start the app:
npm run dev
- Open http://localhost:3000.
| Step | Cost | Provider |
|---|---|---|
| ingest | $0 | local |
| analyze (1,200 convos) | ~$1–2 | Anthropic Claude Haiku 4.5 |
| embed (1,200 convos) | ~$0.05 | OpenAI text-embedding-3-small |
| narratives (~36 months) | ~$2–5 | Anthropic Claude Sonnet 4.6 |
| Total | ~$5–10 one-time |
All LLM responses are cached on disk by content hash, so re-running is free for already-processed conversations.
A four-stage offline pipeline writes to a local SQLite file, and a Next.js app reads from it. Nothing reaches into the LLM on a page load.
ChatGPT export → ingest → analyze → embed → narratives → SQLite → Next.js
30s 20m 3m 10m
See docs/architecture.md for a deeper tour of the pipeline, schema, and design choices.
Next.js 15 (App Router) · TypeScript · Tailwind · SQLite (better-sqlite3) · Observable Plot · Anthropic SDK · OpenAI SDK · umap-js
Your conversations contain a lot. By default the dashboard:
- Runs only on your machine. No network calls except to Anthropic/OpenAI during the pipeline.
- Gates access with a single-password middleware when
DASHBOARD_PASSWORDis set in.env.local(httpOnly cookie, no session storage). - Never commits data.
OpenAI-export/anddata/are both.gitignored.
If you deploy somewhere (Vercel, Fly), set DASHBOARD_PASSWORD to keep the dashboard private.
MIT — see LICENSE.






