Everything the dashboard can do, in plain language. Runs entirely in your browser — your transcripts never leave your machine.
New here? what the claude turns your ~/.claude/projects folder into a calendar of when, how long, and on what you worked with Claude Code. Connect the folder once and it stays live.
The core week/month timeline that visualizes when, how long, and on what you worked with Claude.
A Monday-start, 7-column day grid with a 24-hour time axis where each work session renders as a positioned block at its real start/end time; today's column header is highlighted.
How to use: Default view on load, or click the "Week" button in the header view-toggle. Day headers show weekday + date.
A Mon-Sun month grid (4-6 week rows) where each in-month day cell shows a stacked mini bar-chart of per-project time plus a daily total and message count; out-of-month days are dimmed and empty days show a dot.
How to use: Click the "Month" button in the header view-toggle.
A two-button header toggle switches between the hourly week grid and the month overview; the active view is highlighted and remembered across reloads.
How to use: Click "Week" / "Month" in the header.
Clicking any day cell in month view jumps into the week view containing that day.
How to use: Click a non-empty day cell in Month view.
In week view, today's column draws a dashed horizontal line with a dot and a "NOW" label at the current local time.
How to use: Automatic on today's column in week view.
The header shows a running "N sessions · M msgs · Xh active" summary computed from currently visible sessions (respecting profile/hide filters, source toggles, and the gap setting), mirrored into the drawer header.
How to use: Always visible in the header and under the Filters drawer title; updates live as filters/sources/gap change.
A header Refresh button re-reads the data source and config, then re-renders. It is hidden when a live watcher is active (updates are already pushed) and shown for polling, no-watcher, or disconnected states.
How to use: Click "Refresh" in the header when visible.
On boot the app immediately renders the empty week/month grid (before any folder is connected) so it looks alive; disconnect returns to this same grid with the Connect prompt.
How to use: Shown automatically at boot and after disconnect.
How raw transcripts become meaningful work blocks, and the controls that tune that clustering.
A project's sessions are pooled by user-message timestamp and split into blocks wherever the gap between consecutive messages exceeds the idle-gap threshold; block bounds extend to cover the true work span (lead-in before the first message through the last response).
How to use: Automatic; tuned via "Idle gap (min)" in the Filters drawer. Each block renders as a card with group name, time range, duration, and message count.
A configurable minute threshold controlling when a continuous run of messages breaks into separate blocks; 0 disables splitting (one block per project). Default 20. Editing it re-clusters live.
How to use: "Idle gap (min)" number input in the Filters drawer (Activity clustering section); a helper paragraph explains the behavior.
Within a block, any stretch more than a set number of minutes past your last typed message is flagged as "Claude running on its own" and rendered as diagonal hatched stripes; day totals split into a "you" vs "auto" line.
How to use: "autonomous after (min)" input in the Filters drawer (default 5; 0 disables). Hatched segments appear in blocks; the tooltip shows an "autonomous" duration stat.
Each individual user message renders as a thin horizontal tick line at its exact timestamp inside its block, colored with the project color; hovering shows the message's exact send time.
How to use: Automatic inside blocks and aggregate cards.
Sessions with zero user messages become "idle" blocks spanning their file-open window; a checkbox (default on) hides these from the calendar and totals. When shown, idle blocks have a distinct empty style and an "idle / No messages" tooltip.
How to use: "hide sessions with no messages" checkbox in the Filters drawer Display section.
Hovering a block shows a styled tooltip: project name, time range + duration, date, and stats (messages, autonomous time, session count, distinct folders, token mix bar with total, git branch). Consolidated blocks list each contributing session's range, branch, tokens, and message count.
How to use: Hover any block; aggregate cards and month-day cells have their own tooltip variants.
In month view each day cell stacks up to 4 project bars whose heights are proportional to that project's time, normalized against the month's busiest day; bars fold to "+k" when a day has more than 4 projects.
How to use: Automatic in month view; bars carry "group · duration" tooltips.
Month view renders a legend of the top groups active that month (by time) with color swatches and durations, capped at 14 with a "+k more" overflow; shows "// no activity" for empty months.
How to use: Automatic strip above the month grid.
Each clustering/aggregation control carries an inline tooltip and a short explanatory paragraph describing block spans, the hatched stripes meaning, and the hybrid aggregation layout.
How to use: Open the Filters drawer; hover inputs and read the meta paragraphs.
Density-aware folding, directory filtering, and in-place hiding to keep packed days legible.
When a connected chain of overlapping blocks reaches a configurable overlap depth (default 7; 0 disables), the cluster collapses into a single striped summary card ("N blocks · M groups") instead of unreadable slivers.
How to use: "collapse when overlap depth ≥" input in the Filters drawer (Density-aware aggregation section). Dense clusters show a summary card with "click to expand".
Clicking an aggregate summary card expands it into individual blocks (with a "↥ collapse (N)" pill to re-fold); a "Collapse all expanded" button resets every expanded cluster at once. Expanded state persists.
How to use: Click an aggregate card to expand; click the collapse pill to re-fold; use "Collapse all expanded" in the Filters drawer.
The Filters drawer shows a collapsible directory tree of the week's unique folders, each with a color swatch, session count, and optional group label; tri-state checkboxes toggle visibility, with branch toggles cascading to descendants. Hidden folders render struck-through and dimmed and persist into the portable config.
How to use: Open Filters > "Working dirs"; click a node/checkbox to toggle; use Show all / Hide all and the expand/collapse-all buttons.
Drill from a calendar block into the raw event stream behind a work session.
Clicking a block opens a full-page inspector that lists every event from every session in the block, with a hero summary (group, time span, duration, message count, folder count, tokens, branches, version). The URL is shareable and bookmarkable.
How to use: Click a block (or right-click > "open detail"). Back button, browser back, or Escape closes it and restores the calendar.
Chips filter the event list by kind (real user msgs, assistant, all user, synthetic) and, when agent events exist, by source (main/subagent/workflow); an "all" chip clears everything. Kind and source are combined; counts shown per chip.
How to use: Click chips in the detail event-filter row; the source-chip row appears only when non-main events are present.
When a block consolidates multiple sessions, the detail view shows a tab per session (time span + message count + folder basename) to switch which session's events are displayed.
How to use: Click a session tab in the detail view.
Choose whether main, subagent, and workflow transcripts count toward your activity picture.
A three-button header toggle (all on by default) selects which transcript sources count as activity: main (the human conversation), agents (subagents), and workflows (workflow-agent runs). Toggling re-derives each session's effective activity without re-reading files, and re-renders blocks, stats, and day totals live.
How to use: Click "main" / "agents" / "workflows" in the header; active ones are highlighted. State persists with your config.
Turn scattered working directories into named, colored projects via rules, auto-suggestions, drag-and-drop, or right-click.
Each session's working directory is matched against prefix rules; the most specific (longest) prefix wins, so an exact path beats a broader ancestor. Matching respects path-segment boundaries, so "/a" never matches "/ab".
How to use: Implicit when you assign a repo root a project name; one rule sweeps in all subfolders while overrides resolve automatically.
Assigning a single folder pins just that folder to a project (inheriting its color) even under a broader parent rule; many folders can be assigned at once, each as an exact rule.
How to use: Select a folder (or multi-select several) in the grouping UI and assign to a project.
Unassigning an already-grouped folder drops any exact rule and, if a broader prefix still claims it, pins just that path back to Unassigned without deleting the broader rule or affecting siblings.
How to use: Choose "unassign" on a grouped folder, or the "×" on a folder row inside a project card.
Mark a path (and optionally everything beneath it) to exclude it from grouping, counts, and the calendar; an "exact" variant excludes only that single path without removing its subtree. The ignore list is shown tagged prefix vs exact with a count of distinct folders each entry drops.
How to use: Add an ignore entry (toggle "exact" as needed) from the auto-group view, context menu, or ignore-management UI; previews the blast radius.
Rules sharing a name aggregate into one project showing color, prefixes, member folders, and total sessions/messages. A project can be renamed (preserving profile membership), recolored (all rules at once, or cleared to auto), or dissolved (all its rules removed, folders returning to Unassigned).
How to use: Edit/recolor/dissolve from the project list, the Drag board bucket header, or the Auto-group active-projects list.
Lists every distinct folder with no matching rule and not ignored — the staging area for assignment.
How to use: Rendered as the "unassigned" bucket / Drag board tree.
Analyzes unassigned folders and proposes projects: parents named worktrees/workspaces/playgrounds/conductor/trees give each child its own project; a parent with 2+ child folders becomes one repo-root project; lone folders become solo projects. Colliding auto-names are de-duplicated, each labeled solid (●) or weak (○) confidence.
How to use: Open the Auto-group tab; review suggestion cards with confidence dots and session counts.
A full-screen modal ("GROUP FOLDERS INTO PROJECTS") hosting Auto-group, Drag board, and Profiles as switchable tabs over one shared store, with a per-tab hint bar, a "?" help link to the explainer, and a live footer of project/unassigned/ignored/cleanup counts. Closes via X, Escape, or backdrop click.
How to use: Open via the top-bar "group folders" button (or "Manage profiles…" in the title menu); click tabs to switch.
Left: unassigned folders as a filterable, collapsible file tree with leaf vs folder icons, session/dir count chips, and multi-select. Right: project buckets with drop zones. Dragging a folder adds a prefix rule, a leaf groups just that folder, and dropping on a dashed box (or clicking it) creates a new project pre-named from the folder. Buckets support inline rename/recolor/dissolve and per-folder eject.
How to use: Open the Drag board tab; filter/expand the tree, select or drag rows onto buckets or the dashed "create project" box.
Suggestion cards (sorted by sessions, confidence-dotted, with editable name/color and coverage chips) can be accepted one-by-one ("✓ add") or in bulk via checkboxes and "✦ Apply N checked". "split ▸" drills a card into per-subfolder cards; clickable path segments collapse to a shallower level; "⌫ ignore" excludes a card. Sections list active projects and ignored prefixes. Edits survive re-renders and reconcile with newly appearing folders.
How to use: Open the Auto-group tab; edit, split, collapse, ignore, then add or apply checked suggestions.
Sessions are parsed raw, so every rule change re-derives group/color and re-applies the ignore list on already-loaded sessions and re-renders instantly — decoupling grouping edits from disk reads.
How to use: Implicit: any add/remove/assign/rename/recolor/ignore takes effect immediately.
A standalone guide covering what "projects" are, a before/after illustration, a quick-start, the two tabs plus right-click grouping, where changes are saved, and how to open the panel; adapts to light/dark.
How to use: Open via the "?" button in the panel header (or directly at the grouping explainer).
Named sets of projects layered above grouping as a pure visibility filter for switching contexts (e.g. Work vs Personal).
Profiles never re-group — they just show/hide which projects appear. A synthetic "Unassigned" profile automatically owns every project no real profile claims (auto-hidden once everything is assigned), guaranteeing no group is ever orphaned. A project belongs to at most one profile.
How to use: Create profiles and assign projects; the profiles view lists each with rolled-up counts and a visibility flag.
A two-column board (unassigned groups left, profile buckets right) for organizing contexts: drag a group into a bucket to assign, drag between buckets to reassign, or "×"/drag-left to unassign. A dashed box creates a profile (click or drop, with a name prompt); buckets support inline rename and delete. Group rows show color swatch, sessions, dir count; the left column is filterable.
How to use: Open via "Manage profiles…"; drag group rows between the unassigned column and profile cards.
Profiles get kebab-case IDs derived from the name, collision-suffixed (e.g. "work-2"), and can never collide with the reserved synthetic "unassigned" id. Because profiles store group names, renaming a project rewrites them inside every profile so membership survives renames.
How to use: Automatic on profile creation and on project rename.
Read ~/.claude/projects directly in the browser — no upload, no backend — and keep it live.
Reads ~/.claude/projects directly from disk via the browser's folder picker — data never leaves the machine and there is no backend. The picked directory becomes the live data source for the whole calendar.
How to use: Click the header "+ connect ~/.claude/projects" button, then "Continue" in the walkthrough to open the native picker and grant read access.
A 4-step accessible modal (open picker, navigate, paste path, confirm) detects macOS/Windows/Linux and shows the matching projects path plus the correct picker keystroke (Cmd-Shift-G / Ctrl-L) and confirm-button label; a "copy" button copies the OS-specific path with a "✓ copied" flash. Closes on Cancel, backdrop, or Escape.
How to use: Opens on clicking Connect; read the per-OS path/keystroke, optionally copy the path, click Continue.
Detects the absence of folder-picker support (Firefox/Safari/mobile) and disables Connect, relabeling it "browser unsupported" with an explanatory tooltip and status naming Chromium browsers to use.
How to use: Automatic on page load.
When connected, the header shows 'connected "<folder>"' plus a watch-mode suffix ("· live" for observer, "· polling" for fallback) and a colored pulse dot that goes solid when watching and rings on each detected change; hover shows the last-change time.
How to use: Appears in the header after connecting.
On supported browsers a file-system observer recursively watches the transcript tree and re-renders on any change with a one-shot blip; when unavailable it polls every ~3s comparing a per-file fingerprint (including subagent transcripts) and reloads only on change.
How to use: Automatic once connected; status reads "· live" or "· polling" and the Refresh button stays available for polling.
On reload the saved folder is rehydrated: if read permission still stands the app reconnects silently and repopulates instantly; if permission lapsed a '↻ reconnect "<folder>"' button re-requests access in one click instead of re-picking.
How to use: Automatic at boot, or click the reconnect button when shown.
An ✕ button beside the status forgets the connected folder: stops the watcher, clears the saved handle, empties the calendar back to the pre-connect grid, and re-shows the Connect prompt — all without a page reload.
How to use: Click the ✕ disconnect button in the header status.
A debug hook exposes connect/disconnect/store/openPanel plus caps/state, letting a test harness drive the full pipeline (including the observer) over an in-browser file system with no native picker.
How to use: In console/tests: seed an in-browser dir, then connect it via the debug hook.
How JSONL transcripts become structured sessions, including subagent/workflow ingestion and resilience.
A pure parser turns JSONL transcripts into per-session summaries: time bounds, typed-user-message timestamps, an activity timeline, event count, token usage (input/cache/output), git branches, Claude version, entrypoint, and models used — the data behind the entire calendar.
How to use: Runs on connect; fields surface across the calendar and detail view.
Distinguishes real human-typed prompts from synthetic/meta/sidechain/tool-result/command events, so "messages" counts and the user-activity timeline reflect actual human input rather than tool noise.
How to use: Implicit in every session summary and in detail-view event labeling.
Reads subagent transcripts and the nested workflows tree alongside the main transcript, merging by timestamp and tracking activity per source — so agent-heavy sessions show real activity instead of looking idle. This per-source data backs the main/agents/workflows toggles.
How to use: Automatic on parse.
A malformed JSONL line is skipped rather than fatal, and a single unreadable transcript is dropped from the scan instead of aborting the whole load; each read re-acquires a fresh copy of the file so a transcript grown since connect reads cleanly instead of erroring.
How to use: Transparent during load and on every watcher-triggered reload.
How every setting persists across reloads and travels between origins and machines via the config object.
Every user setting lives in one config object that flows through five persistence layers: an in-browser working copy (per origin, on every change), the folder config file (the only artifact crossing origins/machines), export/import JSON, and the deployed default seed. Changes persist and re-group live; layout-neutral changes (e.g. hidden folders, prefs) persist without re-grouping.
How to use: Automatic on every change; no user action needed for the in-browser copy.
On startup the store seeds from the in-browser working copy, then the connected folder's config file, then the deployed seed, then empty — and tracks which source was used so the UI can distinguish a fresh setup from a returning user.
How to use: Runs at app startup; the source drives onboarding vs returning-user UI.
The "⊓ save to disk" button escalates the folder to read-write and writes the config file into the connected folder (the scanner skips it), with the button flashing a ✓/✕ confirmation. Disabled in snapshot mode with a tooltip pointing to export. This file is the only layer that crosses origins/machines.
How to use: Click "⊓ save to disk" in the panel footer; grant write permission if prompted.
Export serializes the current config and downloads it; import reads a JSON file, normalizes its shape, preserves unknown keys, and applies it live. The footer surfaces an inline "import failed: …" on error.
How to use: Click "⭳ export" / "⭱ import" in the panel footer.
On connect the app reads the folder's config file to seed grouping when this origin's local copy is empty — the mechanism that moves a setup between localhost and the deployed site (or another machine). Because the local copy wins precedence, a target that already connected keeps its copy unless reset.
How to use: Automatic on connect.
On a fresh origin with no local copy and no folder config, the app falls back to a shipped default config so new users get sensible default grouping rather than a flat list.
How to use: Fetched at boot; used only when higher-precedence sources are empty.
Normalization keeps the raw config first so fields written by a newer build survive the round-trip, then layers known keys with guaranteed shapes/defaults — preventing settings loss when configs move between app versions.
How to use: Implicit on every load, import, and reset.
Wipes the config back to empty — all rules, profiles, ignores, cleanup, hidden folders, and prefs — and applies/persists it, behind a confirmation in the panel.
How to use: Click "reset" in the panel footer and confirm.
First-run guidance and a punch-list for tidying ~/.claude/projects.
On a genuinely fresh setup the app suggests groupings for ungrouped folders, applies them, then glows the "group folders" button and pops a tip explaining how to refine (rename/recolor/merge/split) — so the calendar reads cleanly out of the box and you discover the panel.
How to use: Fires once after first connect when no user config exists; the tip auto-dismisses on outside click / "got it".
A list of folders you flag as deletion candidates, with toggle/mark/unmark/clear actions and session/message/last-seen metadata joined back in — a to-do list for tidying ~/.claude/projects. Surfaced in the panel footer count ("🗑 N to clean up").
How to use: Flag folders for cleanup from the UI; a cleanup panel lists them with stats and a clear-all action.