Privacy

Problem reports

Frostyard images and apps can send short problem reports, so we can find and fix faults. Reporting is off until you turn it on. This page says what a report holds, where it goes, how long we keep it, and how to have it deleted.

Status: ChairLift v0.15.0 and later sends reports on Snow, Snowfield and Sundog after you turn reporting on. Those images get it with the next image release. On Floe, snosi-health sends reports after an administrator turns reporting on.

What reports are for

Reports tell us which updates fail, which services break, which Frostyard apps hit errors, and which versions are in use. Each kind of report and its purpose is in What is sent.

Turn reporting on or off

Nothing is sent until you turn reporting on. When you turn it off, sending stops at once. The controls are:

Frostyard apps never send anything themselves. They write problems to the journal on your computer. ChairLift on a desktop, or snosi-health on Floe, is the only program that sends. A computer that does not run a Frostyard image sends nothing.

If a new version of the report format adds a kind of report or a field, sending stops until you agree again.

What is sent

Every report has the fields below, and then the fields of its kind. Every value is a fixed choice, a number in a range, a version, or a name from a fixed list. No field holds free text. The machine-readable format is /schemas/problem-report/v1.json.

Values that every problem report carries
FieldWhat it holdsValues
schemaThe schema version of the report.frostyard.problem/1
report_idA random ID, made new for each report. It links nothing else. Give it to us to have that report deleted.
weekThe ISO week the problem happened, or the week a count is sent. Never a date or a time.
image.idWhich image the computer runs.snow, snowfield, sundog, floe
image.versionThe image version, a 14-digit build timestamp.
secureWhether the computer runs the secure-boot variant of the image.
clientThe program that sent the report and its version: ChairLift on desktops, snosi-health on Floe.
kindWhat kind of problem the report is about. Each kind is described below.unit_failed, update_stage_failed, booted_older_image, sysext_update_failed, tpm_unlock, integrity_error, crash, app_problem, count

A system service failed unit_failed

Finds image services that break after an update. Only services that ship in the image are reported, never one you added.

Fields of the unit_failed report
FieldWhat it holdsValues
unitThe service name, with any instance part removed (user@1000.service becomes user@.service).
resultHow it failed.exit-code, signal, timeout, core-dump, start-limit-hit, other
shippedAlways true: the service ships in the image.true

An update could not be prepared update_stage_failed

Finds updates that never get ready to install.

Fields of the update_stage_failed report
FieldWhat it holdsValues
target_versionThe image version the update tried to prepare.
error_classWhy it failed, as a broad class.network, registry, signature, disk_space, lock, other
bootc_versionThe version of bootc, the tool that prepares updates.

The computer went back to an older image booted_older_image

Finds updates that make people go back to the previous image.

Fields of the booted_older_image report
FieldWhat it holdsValues
newer_versionThe newer image version that was not kept.
howHow the older image was chosen.manual_rollback, boot_menu, unknown, other

A system extension update failed sysext_update_failed

Finds system extensions that fail to update. Extensions you added yourself are never reported.

Fields of the sysext_update_failed report
FieldWhat it holdsValues
featureThe extension name, from the image or the Frostyard catalog.
versionThe extension version.
outcomeWhat happened to the update.failed, held_by_rollback, needs_image, skipped_unreachable, skipped_busy, other
error_class (optional)Why it failed, as a broad class.network, http_status, signature, checksum, disk_space, link, config, other

The disk did not unlock on the first try tpm_unlock

Finds releases that break automatic disk unlock with the TPM. A clean first-try unlock is not recorded.

Fields of the tpm_unlock report
FieldWhat it holdsValues
outcomeHow the disk was unlocked in the end.ok_after_retry, recovery_key, passphrase, other
tpm_rcThe TPM's reason for refusing, as a broad class.PCR_CHANGED, POLICY_FAIL, LOCKOUT, other
retriesHow many retries it took, from 0 to 10.

A file integrity check failed integrity_error

Finds corrupted files or a bad build. File names are never sent.

Fields of the integrity_error report
FieldWhat it holdsValues
subsystemWhich integrity check failed.composefs, fs-verity, dm-verity, other
countHow many errors, in a range.1, 2-10, >10

A program crashed crash

Not sent yet. The format defines crash reports, but the first releases that send reports keep crashes on your computer; a later release adds them. Then they will find crashes of programs in the image. Only programs under /usr will be reported; a crash of a Flatpak app stays on your computer. The core dump, the command line and the environment are never sent.

Fields of the crash report
FieldWhat it holdsValues
exeThe program's file name without its folder.
package (optional)The Debian package that holds the program.
package_version (optional)The version of that package.
signalThe signal that stopped the program.SIGSEGV, SIGABRT, SIGBUS, SIGILL, SIGFPE, SIGTRAP, SIGSYS, other

A Frostyard app hit an internal error app_problem

Finds bugs in Frostyard's own apps. The error message stays on your computer.

Fields of the app_problem report
FieldWhat it holdsValues
app_idWhich Frostyard app.org.frostyard.ChairLift, org.frostyard.nsl, org.frostyard.intuneme, org.frostyard.pilothouse, org.frostyard.Frostmail, org.frostyard.Frostnotes, org.frostyard.Frostread
app_versionThe app's release version.
runtimeThe language the app part is written in.go, rust
componentWhich part of the app.daemon, cli, gui, shell, other
classA crash of the app (panic) or a known error.panic, error
code (optional)A fixed error code from the app's source, such as store.migrate_failed. Sent only for errors.
frames (optional)For a Go panic: up to 32 function names from Frostyard code, the Go standard library, and the go-imap fork that Frostmail uses. No file paths, no arguments. Other functions show as other.
location (optional)For a Rust panic: the source file and line in Frostyard's code, such as src/store.rs:42.

Weekly count count

Counts the users who turned reporting on (on Floe, the computer), to see which versions are in use and whether updates arrive. Sent at most once a week. Counts are approximate: 2 users who turn reporting on at 1 desktop count 2 times.

Fields of the count report
FieldWhat it holdsValues
install_ageHow long ago the system was installed, in a range.<1w, <1m, <6m, >=6m
channelWhether the computer follows the latest image.latest, other

What is never sent

Your IP address

Your IP address is personal data. It reaches Cloudflare, which carries the report to report.frostyard.org for us as our processor, under its data processing agreement. The intake uses the address only to limit each address to 10 requests a minute, with a short-lived counter. It does not store, log or forward the address, and it stores no key made from it. The server that keeps reports never receives it: the proxy in front of that server removes the forwarding headers and keeps no log.

Cloudflare's own security features can record the address of a request that they block or challenge, in Cloudflare's security events.

Where reports go and how long we keep them

Public statistics

We publish weekly totals on the statistics page. A number from 1 to 4 is never published, and neither is a number that would let you work one out from the totals. We never publish single reports. The 1-to-4 rule covers the statistics: a public bug report holds no count, but it exists only because 1 or more reports came in.

Public bug reports

When reports show a fault in Frostyard code, a job can open a public GitHub issue for it, with the label problem-report, in the repository of the app or image that has the fault. Anyone can read these issues: list every public bug report. The job runs at most once a day and opens at most 1 issue for each problem. crash and count reports never open an issue.

Before the job publishes a value, it finds that value in a public source of Frostyard: a release tag, the source code at that tag, a published image tag, the published extension index, or the job's fixed list of Frostyard services and extensions. A value that fails its check is never published.

What an issue holds

KindFields in the issue
app_problemapp_id, runtime, component, and code (class error) or frames or location (class panic)
unit_failedunit, result
update_stage_failederror_class, target_version
booted_older_imagehow, newer_version
sysext_update_failedfeature, outcome, error_class if the report has it, and the newest checked extension version, shown as feature_version, if there is one
tpm_unlockoutcome, tpm_rc, the variant
integrity_errorsubsystem, the variant

A Go frame of another module shows only its top package name. The variant tells if the image is the standard or the secure-boot image (the report's secure). Only tpm_unlock and integrity_error show it.

What an issue never holds

No issue, comment or status of the job holds:

What an issue still tells

An issue tells that 1 or more computers with reporting turned on sent a report with these values. Its creation time tells about when the first report came. A rare image and version can point to the few computers that run it.

Which faults are filed

The job files only faults that our GlitchTip first saw on or after , 00:00 UTC. A fault first seen before then is never filed. If you turned reporting on before this section was published, you are not asked again: this section is the notice. You can turn reporting off at any time.

Deletion and turning reporting off

Deleting a report, or turning reporting off, does not remove, change or close an issue. An issue holds no identifier of a report, and only values that exist in Frostyard's public source.

Your rights

Who is responsible

Controller: Frostyard Privacy Admin

Contact for questions and deletion requests: privacy@frostyard.org

Transfers outside the EU

Reports are kept in the United States. Cloudflare processes requests on its global network, under its data processing agreement and the EU–US Data Privacy Framework.

Source

Every part of reporting is open source.

The history of this page is in frostyard/frostyard-org.