Privacy
What stays on your machine, what leaves it, and how to turn reporting off.
What stays local
Harmony is local-first by construction, not by policy. The daemon, your terminals and scrollback, tasks, artifacts, agent-to-agent messages, channels, voice models, and MCP integration all run on your machine.
There is no cloud host in the path of your work, and local use does not require a Harmony account.
What leaves your machine
Three things, and only three:
| What | When | To whom |
|---|---|---|
| Provider traffic | When you run an agent turn | The provider you chose |
| Release checks and downloads | On update check or install | This site |
| Usage and lifecycle reporting | Only if you opt in | This site |
Provider traffic is the significant one. When you run an agent, your prompts and whatever context that agent gathers go to that provider under that provider's privacy policy. Harmony does not proxy, inspect, or retain it — but it also cannot make a third-party provider private.
IMPORTANT
Choosing a provider is choosing a privacy policy. If a repository must not leave your machine, use a local model, not a hosted one.
Usage reporting
Off unless you turn it on. Harmony asks once, on first run, and doing nothing leaves it off. Declining, dismissing the prompt, and pressing Escape are all the same answer.
This section previously described lifecycle reporting as "identifier-free". That was not accurate and is worth correcting plainly: every report carries one random installation UUID, and always has. It is what makes a machine that opens Harmony every day count as one machine rather than thirty. It is not an account id, it is generated on your machine, and it is not linked to anything you sign in to.
What is reported
| Kind | Events | Why |
|---|---|---|
| Install and update | first launch, update check, update available, download started, downloaded, installed, failed, repair | Whether builds reach people and actually run |
| Usage | one heartbeat per day, session opened, session ended, feature used | Whether anybody uses it, and which parts |
Each report carries the installation UUID, the version, the release channel, and the platform. Feature use carries a name from a fixed list and a count. Session length is reported as a bucket rather than a duration, so "under a minute" or "one to four hours" but never a start and end time.
The fixed list of feature names is, in full:
| Name | Counted when |
|---|---|
pane_split | a pane is split |
pane_close | a pane is closed |
terminal_open | a terminal is opened |
session_reattach | a session is reattached |
voice_dictation | dictation is used |
agent_spawn | an agent is launched |
task_create | a task is created |
task_complete | a task is completed |
worktree_create | a worktree is prepared |
channel_post | a message is posted to a channel |
browser_session_start | a browser session is started |
The last six are counted when an agent uses the corresponding tool. Only the name and a count leave your machine: not what the agent was asked to do, not which repository or worktree it touched, not the channel or its contents, and not the page a browser session opened. Those are on the never-reported list below and stay there.
What is never reported
Not "minimised" or "anonymised" — absent:
- your code, prompts, or agent responses
- terminal input, output, or scrollback
- filesystem paths
- project, repository, or worktree names
- environment variables, credentials, tokens, or API keys
- IP addresses, or the raw user-agent string
- account, profile, or user identifiers
- free text of any kind
The complete wire contract lives in the repository as
telemetry-contract.json, with the same file byte-identical on both sides so
neither can quietly start sending more than the other accepts.
Retention
Reports carrying an installation UUID are deleted after 180 days. Daily aggregates, which carry no identifier at all, are kept.
Turning it off
Settings → Privacy, or:
nala telemetry off
Or override it for a single invocation:
$env:NALA_TELEMETRY = "0"
nala telemetry on its own shows the current setting. Turning it off also
deletes anything queued locally and not yet sent.
Voice
Voice runs on-device. Dictation uses a local Whisper process; Read Aloud uses a local Kokoro model. Models are downloaded once, then used offline.
Audio is not uploaded to Harmony. What you dictate becomes text that goes wherever you send it — including, if you dictate into an agent pane, to that agent's provider.
Diagnostics and support bundles
Diagnostics are generated locally and are not transmitted unless you send them.
WARNING
Diagnostics contain absolute filesystem paths, workspace and repository names, and provider details. Those routinely reveal usernames, client names, and unreleased project names. Review and redact before sharing.
Data on disk
Harmony stores its state in a per-user data directory, namespaced by the runtime data suffix so development and packaged installs stay separate. Sessions, task state, artifacts, and scrollback live there.
Deleting that directory deletes your durable work. It is not a cache.