TELEMETRY
Counts, never content.
CKey SDKs can send anonymous, aggregate scan counts to openckey.org so the project can see whether scanning works in the field. It is easy to turn off, and it never includes what was scanned.
Docs: Overview · Payloads · SDKs · Telemetry · API
The three modes
| MODE | COUNTS ON THE DEVICE | SENDS TO OPENCKEY.ORG |
|---|---|---|
0 off | no — and existing counters are purged | no |
1 on (default) | yes | aggregate batches, at most one per hour |
2 local only | yes | never; the app can read the counts itself |
Only the scanner records anything. Encoding, rendering, and one-off image decodes never do — so this site’s renderer records nothing, and it loads the SDK with telemetry off anyway.
What is collected
- scan session counts: started, succeeded, failed;
- the number of camera frames processed;
- the number of decodes per profile;
- two coarse histograms: time to first decode and time per frame;
- the SDK name and version, a coarse platform name (such as
iosorweb), and the UTC day.
What is never collected
- payloads, URLs, or anything that was decoded;
- user, device, installation, or advertising identifiers, or fingerprints;
- location;
- per-scan event histories;
- IP addresses, beyond what the network connection itself exposes.
Opt out in one line
| SDK | LINE |
|---|---|
| Swift | CKey.telemetry = .off |
| Web | ckey.telemetry = 0 or loadCKey({ telemetry: 0 }) |
| Android (Kotlin) | CKey.telemetry = 0 |
| .NET | CKey.Telemetry = 0; |
| C / C++ | ckey_telemetry_set_mode(0); or build with -DCKEY_BUILD_TELEMETRY=OFF |
Any value other than 0, 1, or 2 is an error, and the mode is never silently reset to 1. Apps that leave telemetry on may need to mention it in their own privacy disclosures.
How openckey.org handles it
- Aggregates only. Each accepted batch is added to daily totals per day, SDK, SDK version, and platform. Request bodies are not stored.
- No IP addresses stored. They are not written to logs or the database, and nothing derived from them is kept.
- 400-day retention. Daily totals older than 400 days are deleted.
- Strict input. Batches must match the published schema exactly; anything else is rejected. Requests are size- and rate-limited.
The counts are unauthenticated and can be spoofed, replayed, or inflated, and without identifiers they cannot be deduplicated. Treat them as a coarse signal. The public summary at /api/telemetry/v1/summary carries the label “Reported by SDKs with telemetry on; not total usage, unique users, or worldwide scans.”
Live summary
Loading the last 30 days…
The normative rules are in docs/adoption-and-telemetry.md.