---
url: https://docs.mochiexec.io/reference/telemetry.md
description: >-
  What Mochi's opt-in usage reporting sends, what it never sends, and how to
  turn it off.
---

# Telemetry

Mochi can send anonymous usage events that tell us whether new users get to a first
successful run. It is **off until you turn it on**. Nothing is sent before then.

Turn it on or off in the desktop app under **Settings → Privacy**, or from the CLI:

```sh
mochi telemetry status
mochi telemetry enable
mochi telemetry disable   # also deletes the install ID
```

Setting `DO_NOT_TRACK=1` or `MOCHI_TELEMETRY_DISABLED=1` in your environment keeps it off
whatever the saved setting says.

## What is sent

Events go to `api.mochiexec.io/telemetry`, which is run by Mochi. Nothing goes to a
third-party analytics service. Every request carries these fields:

| Field | Value |
|---|---|
| `installId` | A random ID created when you turn telemetry on. It is not derived from your machine, account or license. Turning telemetry off deletes it, and turning it back on creates a new one. |
| `surface` | `desktop` or `cli` |
| `os` | `darwin`, `linux` or `windows` |
| `arch` | `amd64` or `arm64` |
| `appVersion` | The desktop app's version, e.g. `0.9.0` |
| `cliVersion` | The `mochi` CLI's version |

Each event has a name and a timestamp. The complete list of events:

| Event | When | Properties |
|---|---|---|
| `app_opened` | The desktop app starts | None |
| `telemetry_enabled` | You turn telemetry on | None |
| `milestone_reached` | You reach a step of getting started, or a usage milestone, for the first time | `milestone`, `backfilled`, and for some milestones `source`, `discovery` or `files` (see below) |
| `onboarding_step` | A step of the new-project wizard is shown, finished or canceled | `step`: `source` or `discover`. `action`: `viewed`, `completed` or `canceled` |
| `error_shown` | The app shows you an error. Sent at most once per error code each time the app runs | `code`: the error's code, such as `AI_RATE_LIMITED`, or `OTHER`. `area`: `run`, `ai`, `discovery`, `workspace`, `license`, `settings` or `other` |

`milestone` is one of:

| Milestone | Reached when |
|---|---|
| `workspace_added` | You add your first project. It carries `source` (`folder` or `git`) and `discovery` (whether you scanned it for tasks) |
| `tasks_discovered` | A scan first finds task files. It carries `files`, how many it found (capped at 1000) |
| `first_run_started` | You start your first run |
| `first_run_succeeded` | A run first finishes successfully |
| `first_ai_used` | You first ask AI to explain, diagnose or document something, or start a chat |
| `runs_10`, `runs_100`, `runs_1000`, `runs_10000` | Your run count reaches that number |
| `streak_7` | You run something seven days in a row |
| `agent_first` | An AI agent runs one of your executables for the first time |

Mochi remembers which milestones you've reached on your machine, whether or not telemetry
is on. If you turn telemetry on later, the ones you've already reached are sent once at that
moment with `backfilled` set to `true`. Nothing about them is sent while telemetry is off.

An error's message, details and output are never sent. A task of yours that fails is not a
Mochi error and isn't reported.

This is the complete list. An event that isn't on it can't be sent, and the server rejects
anything that isn't.

## What is never sent

* Workspace, project, namespace or executable names
* File paths, commands, arguments or any run output
* Secrets, vault contents or environment variables
* AI prompts or responses
* Your license key, email address or IP address. The server doesn't store the IP a
  request comes from.

Properties can only be fixed choices, counts or version numbers. There is no free-text field
where any of the above could end up.
