A beautiful web UI for unified usage/cost analysis across:
profilex usage export ingestion)state.json)Built with Svelte + Vite + Tailwind CSS + TypeScript.
state.jsondefault-<counter> fallback if not matchedauto (observed if available, else calculated)calculatedisplaypnpm install
pnpm dev
Open the local URL Vite prints (usually http://localhost:5173).
pnpm dev now preflights public/local-unified-usage.json before Vite starts:
pnpm generate:local:deep first.--force-report to regenerate even when it exists.--skip-report to skip preflight generation.Examples:
pnpm dev -- --force-report
pnpm dev -- --skip-report
pnpm build
pnpm preview
If you want this UI to auto-load local data on startup (without manual file picking), run:
pnpm generate:local
By default this uses the ProfileX CLI bridge:
profilex usage export --out ./public/local-unified-usage.json
If profilex is unavailable or fails, it falls back to the local parser/scanner logic.
--no-profilex-cli to force fallback scanner mode.PROFILEX_UI_SKIP_PROFILEX_CLI=1 to skip the bridge.It writes:
public/local-unified-usage.jsonYou can run a broader home-directory scan with:
pnpm generate:local:deep
On app boot, the UI checks for public/local-unified-usage.json:
profilex usage export --out ./local-unified-usage.<machine>.json --deep
The UI merges events and profile metadata across bundles.
Upload ~/.profilex/state.json (or PROFILEX_HOME/state.json) so the UI can map events to named profiles.
Typically under:
~/.config/claude/projects/**/*.jsonl~/.claude/projects/**/*.jsonlCLAUDE_CONFIG_DIR/projects/**/*.jsonlTypically under:
~/.codex/sessions/**/*.jsonlCODEX_HOME/sessions/**/*.jsonlMIT