Telemetry
Synth collects de-identified usage data to help create a better product and user experience.
You can opt-out of Synth's anonymous data collection at any time by running the command:
$ synth telemetry disable
or deleting the file at ~/.config/synth/config.json
.
Synth is completely free and open-source. This means all the code that provide
us with telemetry information is accessible by anyone. You can find
the telemetry.rs
submodule of Synth in our public repository.
The binary file that is downloaded by the installer script is built transparently by GitHub's CI/CD pipeline directly from public releases.
#
PhilosophyBelow are a set of principles that guide the telemetry decisions made in Synth:
- It is made completely transparent that telemetry is going to be installed
- It is made completely transparent as to what data we collect
- No personally identifiable information is collected. (IP addresses are discarded at the sink)
- Nothing is collected unless it is explicitly and clearly documented here.
#
Enabling / Disabling TelemetrySynth uses a configuration file under the user configuration directory (
e.g. ~/.config/synth/config.json
on typical unix systems) as a marker for
telemetry being enabled. This file also contains a randomly generated
identifier. We use this identifier to better understand how we can improve the
user experience for Synth.
You can check if telemetry is enabled by running synth telemetry status
.
You can opt-out at any time by running synth telemetry disable
.
#
Where does the data go?All the telemetry data is collected in a Posthog instance run exclusively by the maintainers of Synth.
If you would like the data associated with your UUID to be deleted, please
contact opensource@getsynth.com
.
#
What does Synth collect?Synth's telemetry collects 8 fields:
distinct_id
: A randomly generated UUID stored at~/.config/synth/config.json
command
: The command that was issued by the user. This is a text field whose value is one of the following:import
generate
telemetry::enabled
telemetry::disabled
success
: If the command completed in success.version
: The current semver of Synth. For examplev0.4.3
.os
: The target platform for which the binary was built. This value is std::env::consts::OS, a constant set at compile time. For examplewindows
.timestamp
: The time at which the command was issued. For example2021-05-06T16:13:40.084Z
.generators
: A list of generators that were used by thegenerate
command. For examplestring::title, number::I32::Range
.integration
: The integration used in agenerate
orimport
command. For examplejson
,postgres
, etc.
Below is the Synth schema of PostHog events posted by synth
's
activity:
{ "type": "object", "distinct_id": { "type": "string", "uuid": {} }, "command": { "type": "string", "categorical": { "import": 1, "generate": 10, "telemetry::enabled": 10, "telemetry::disabled": 1 } }, "version": { "type": "string", "pattern": "v0\\.4\\.3" }, "os": { "type": "string", "categorical": { "linux": 10, "macos": 10, "windows": 10 } }, "timestamp": { "type": "date_time", "format": "%Y-%m-%dT%H:%M:%S", "subtype": "naive_date_time", "begin": "2015-01-01T00:00:00", "end": "2020-01-01T12:00:00" }, "generators": { "type": "string", "serialized": { "serializer": "json", "content": { "type": "array", "length": { "type": "number", "subtype": "u64", "range": { "low": 2, "high": 20 } }, "content": { "type": "string", "categorical": { "string::first_name": 2, "string::last_name": 2, "string::title": 2, "string::suffix": 2, "string::name": 2, "string::name_with_title": 2, "string::credit_card": 2, "string::free_email_provider": 2, "string::domain_suffix": 2, "string::free_email": 2, "string::safe_email": 2, "string::username": 2, "string::ipv4": 2, "string::ipv6": 2, "string::ip": 2, "string::mac_address": 2, "string::color": 2, "string::user_agent": 2, "string::rfc_status_code": 2, "string::valid_status_code": 2, "string::company_suffix": 2, "string::company_name": 2, "string::buzzword": 2, "string::buzzword_muddle": 2, "string::buzzword_tail": 2, "string::catch_phrase": 2, "string::bs_verb": 2, "string::bs_adj": 2, "string::bs_noun": 2, "string::bs": 2, "string::profession": 2, "string::industry": 2, "string::city_prefix": 2, "string::city_suffix": 2, "string::city_name": 2, "string::country_name": 2, "string::country_code": 2, "string::street_suffix": 2, "string::street_name": 2, "string::time_zone": 2, "string::state_name": 2, "string::state_abbr": 2, "string::secondary_address_type": 2, "string::secondary_address": 2, "string::zip_code": 2, "string::post_code": 2, "string::building_number": 2, "string::latitude": 2, "string::longitude": 2, "string::phone_number": 2, "string::cell_number": 2, "string::file_path": 2, "string::file_name": 2, "string::file_extension": 2, "string::dir_path": 2, "string::pattern": 2, "string::categorical": 2, "string::serialized": 2, "string::uuid": 2, "string::trancated": 2, "string::format": 2, "number::I32::Range": 10, "number::U32::Range": 10, "number::F32::Range": 10, "number::I64::Range": 10, "number::U64::Range": 10, "number::F64::Range": 10, "bool::constant": 3, "bool::frequency": 3, "bool::categorical": 3, "series::cyclical": 1, "series::poisson": 1, "series::incrementing": 1, "series::zip": 1, "null": 1, "date_time": 1, "array": 1, "object": 1, "same_as": 1, "one_of": 1, "unique": 1, "hidden": 1, "datasource": 1 } } } } }, "integration": { "type": "one_of", "variants": [ { "weight": 0.5, "type": "string", "categorical": { "json": 1, "jsonl": 1, "csv": 1, "postgres": 1, "postgresql": 1, "mongodb": 1, "mysql": 1, "mariadb": 1 } }, { "weight": 0.5, "type": "null" } ] }}