---
title: v0.41.0 — Truthful Telemetry, App Store Privacy, Plan Badge
date: 2026-05-18
version: v0.41.0
---

## New features

**Default-on anonymous usage analytics with one-command opt-out.** Official builds now report which features and screens are used so development is guided by real usage — never code, prompts, paths, or session content. A one-time notice prints on first run. Turn it off permanently with `CLAUDE_VIEW_TELEMETRY=0`. Builds from source send nothing. A closed event taxonomy enforces this in the schema, not just in policy.

**`installed` acquisition event** fires exactly once per machine, deduplicated by a persistent anonymous ID, so adoption is measurable without double-counting on every server restart.

**Plan-mode badge on session cards (#61).** When a session is in plan mode, a `Plan` badge appears on the card — but only when the session is *actually* in plan mode, never guessed. Following the project's "trust over accuracy" principle: better to show nothing than show something wrong.

**Sub-agent ordering on cards (#62).** Sub-agents now sort running + newest first. The visible slice surfaces the most relevant agents, and the "+N more" overflow hides the oldest instead of the working ones.

**Full privacy policy at [claudeview.ai/privacy](https://claudeview.ai/privacy/)** with Apple App Store privacy nutrition labels, third-party processor list, retention, and your rights. Privacy copy is now consistent across all 10 README translations.

## Fixes

- **`install_source` detection rewritten.** The old detection matched `.cache/claude-view` in the binary's exe path — broken by the `~/.cache → ~/.claude-view` migration earlier in the year, silently misclassifying every `install.sh` install as `npx`. Now uses an explicit marker file beside the binary; install.sh / npx / plugin installs are correctly distinguished and survive `CLAUDE_VIEW_INSTALL_DIR` overrides.
- **Statusline wrapper** moved to `~/.claude-view/statusline-wrapper.sh`, matching the app-data-dir rule. Sandbox-setup script updated to match.
- **AudioContext unlock** for notification sounds. `audioUnlocked` state now mirrors the real browser context state instead of being set optimistically. The "click the page to enable sound" hint only shows when the browser genuinely blocks audio.
- **Notification sound** guarded against concurrent re-entrancy.
- **Cloudflare landing-page cache rule.** Removed a `/*` catch-all that was concatenating `max-age=0, must-revalidate` onto every fingerprinted asset, forcing edge revalidation on every request (the cause of the ~0% cache hit rate on `_astro/*`).
- **`~/.cache → ~/.claude-view` cleanup swept** — the last four shipped references (npx-cli error message, npx-cli README, package.json dev scripts, classifier test fixtures) now point at the real location. Users following the old `rm -rf ~/.cache/claude-view/` error hint no longer hit a dead path.

## Improvements

- **`permission_mode` threaded end-to-end** from Claude Code hooks through the mutation pipeline to the UI, with full type-safety and Latest-wins semantics.
- **Indexer `stop_hook_summary` parser** simplified via Rust match guards (no behaviour change).
- **CI**: `scripts/cq` now pins clippy to `rust-toolchain.toml` so Homebrew's newer clippy can no longer shadow the pinned channel and false-fail the gate with style lints the project doesn't target.
- **`/api/telemetry/event`** + `Surface` / `ActionId` schemas registered in OpenAPI; the `telemetry_ingest_event` plugin tool is now exposed for explicit ingress.

## Getting started

```bash
curl -fsSL https://get.claudeview.ai/install.sh | sh
# or
npx claude-view@latest
```
