Ctrl K
ComunidadGuías…

PRIVACY.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# What Ferryman sends, and what it never sends

This page is part of the terms of Section 3 of the [license](LICENSE). It is
deliberately specific, because vague privacy pages are how software loses the trust
of exactly the people Ferryman is built for.

## The short version

Free production use requires registering a contact email. Ferryman records that
address plus a count of how many people, computers and phones are in your deployment,
and reports those counts to the Licensor.

**It never sends your code, your channel, your prompts, your results, your file names,
or anything your agents produce or say.** Those never leave your machines. That is the
entire point of the product and it is not compromised for licensing.

## Exactly what is sent

One JSON object, sent only when you run `ferry license checkin`, to the check-in
URL configured in your install (unset in every downloaded release):

```json
{
  "deployment_id": "a41f...",
  "emails": ["you@example.com"],
  "seats": 1,
  "computers": 2,
  "mobile_devices": 0,
  "over_limit": false,
  "version": "0.5.3",
  "sent_at": "2026-08-12T09:00:00Z"
}
```

That is the whole payload. There is no other field, and you can confirm that by
reading `crates/ferryman-channel/src/licensing.rs` — the struct that is serialised is
the struct above, and nothing constructs it from your project data.

| Field | Why it exists |
|---|---|
| `deployment_id` | A random number generated on your machine, so two check-ins can be recognised as the same fleet without identifying you further. Not derived from your hardware, hostname, or network. |
| `emails` | The addresses registered with `ferry enable`. Distinct addresses are how Seats are counted, and the only way the Licensor can contact you about licensing. |
| `seats`, `computers`, `mobile_devices` | The counts the free tier is defined in. |
| `over_limit` | Whether those counts exceed the free allowance. |
| `version` | Which Ferryman is running, so you are not told to do something that does not apply to your version. |

## What is never sent

- Your code, in whole or in part
- Anything in the channel: orders, results, reviews, messages, shared memory
- Prompts sent to your agent CLI, or anything it returns
- File names, directory names, repository names, or project names
- IP-derived location, hardware identifiers, MAC addresses, or serial numbers
- Your hostnames or your agents' names
- Any content of any kind

The list above describes the licence check-in, which is the only thing Ferryman will
ever send to the Licensor. Two other outbound paths exist, both off unless you turn
them on, and neither goes to us by default:

### Soak reports — `ferry soak`

While Ferryman is in soak testing we would very much like to know how it behaves on
your machines. `ferry soak` builds a report and **prints it**; it is sent only if you
set `FERRYMAN_SOAK_URL` *and* pass `--send`, per invocation. There is no setting that
makes it happen on its own.

The report is counts, category labels and the build string:

| Field | What it is |
|---|---|
| `format`, `version`, `platform` | The report format, the build (including its git commit), and `linux`/`macos`/`windows`. Not your hostname or OS release. |
| `sandboxed`, `preamble_bytes` | Whether a container runner is configured, and the *size* of your preamble file. Never the image name or the preamble's contents. |
| `agents` | How many agents are on the project roster. A number, not names. |
| `tasks_by_state`, `max_revision` | Counts of tasks per state, and the highest revision reached. |
| `signature_checks` | Counts per outcome: `valid`, `unsigned`, `invalid`, `unknown_signer`, `key_changed`. The most useful number in the report. |
| `ledger_intact`, `ledger_entries` | Whether the ledger verifies, and how many entries it has. |
| `run_log_categories`, `run_log_lines` | Your local run log matched against a fixed list of failure *labels* (`agent_stalled`, `governor_declined`, …) and counted. Lines that match nothing count as `other`. |

No file paths, task text, prompts, results, agent output, credentials, agent names or
project names. That is structural rather than filtered: the report type has no field
that can hold them, and log lines are reduced to a label from a fixed vocabulary
before they are counted. `ferry soak --dry-run` prints exactly what `--send` would
transmit, from the same value, so the two cannot disagree.

### Tracing — `FERRYMAN_OTLP_ENDPOINT`

If you set `FERRYMAN_OTLP_ENDPOINT` (or `OTEL_EXPORTER_OTLP_ENDPOINT`), Ferryman
exports OpenTelemetry spans to **your** collector. This is a debugging tool you point
at your own infrastructure; it never goes to the Licensor and there is no default
endpoint. Unlike the two above, these spans **do** carry agent names, project names
and absolute workspace paths, because that is what makes a trace useful. Do not set it
unless you are happy for that data to reach wherever you are pointing it.

## What you can do about it

- **Nothing is sent automatically.** There is no timer and no background sender. The
  check-in happens only when you run `ferry license checkin` yourself, and only if a
  check-in URL is configured in your install. If no URL is set — which is the state
  every downloaded release is in — that command sends nothing and says so.
  (An earlier version of this page suggested `checkin = "off"` in
  `.ferryman/agent.toml`. No code ever read that key, so it did nothing; leaving the
  URL unset is the control that works, and it is the default.)
  Note that free *production* use is conditioned on registration under Section 3 of the
  license — not reporting does not change what you owe, it only changes whether the
  Licensor can see it. Non-production use has no registration requirement at all.
- **See it before it goes.** `ferry license checkin --dry-run` and
  `ferry soak --dry-run` each print the exact payload and send nothing. In both cases
  the dry run and the real send format the *same value*, so a payload cannot drift away
  from what the dry run shows.
- **Read the code.** It is source-available. This is a claim you can check rather than
  trust, which is the only kind of privacy claim worth making.

## Handling

The Licensor stores the email addresses and counts to administer the license and to
contact you about licensing. They are not sold, and not shared with third parties
except where required by law or to a processor acting for the Licensor. To have your
address removed, or to ask what is held, email the address in
[COMMERCIAL.md](COMMERCIAL.md); removal ends free production use under Section 3 until
you register again.

If a check-in cannot be delivered — no network, endpoint down, DNS failure — Ferryman
carries on without complaint. Licensing never blocks work.