Diagnostic bundle
The folders, sources, limits, manifest and member formats of a diagnostic bundle
Diagnostic bundle
The format of a diagnostic bundle: the zip that a bug report, a crash report or
system.diagnostics.collect makes. This page lists its folders, its sources, its
limits and its manifest.
Where a bundle is
| Made by | Path in the data directory |
|---|---|
| A report in the outbox | reports/<id>/bundle.zip, beside its state.json |
system.diagnostics.collect |
diagnostics-<yyyyMMdd-HHmmss>.zip |
| Save to file… in the composer | The file you choose |
The folder tree
manifest.json what the bundle holds, what it lacks, what was cut
report.json trigger, cause, the user's text, app, created time
build/identity.json version, commit, build id, variant, toolchain, edition
system/os.json OS name, version, architecture, locale, memory
system/graphics.json backend, adapters, the chosen adapter
system/screens.json each screen: size, DPI, refresh rate
logs/run.log the log file of the reported run
logs/previous-run.log the log file of the run before it, in a crash report
crash/marker.txt the crash marker
crash/exit-code.txt Windows: the exit code that the crash sentinel recorded
crash/sentinel.dmp Windows: the crash sentinel's minidump
crash/wer.dmp Windows: a Windows Error Reporting dump of the same run
crash/coredumpctl.txt Linux: coredumpctl info for the crashed process
history/runs.json how the last 20 runs ended
settings/settings.json every setting that is not secret, with its value and level
screenshot/window.png the main window
opal/ text files that an OPAL task attached
A file that does not apply is absent, and the manifest names it in missing
with the reason. For example, a user report of a healthy run has no crash/
folder.
The sources
Each file belongs to one source. The composer shows a check box for each source that you can remove.
| Source | Files | crash |
user |
opal |
startup |
Removable |
|---|---|---|---|---|---|---|
| Report | report.json, manifest.json |
yes | yes | yes | yes | no |
| Build | build/ |
yes | yes | yes | yes | no |
| System | system/ |
yes | yes | yes | yes | no |
| Run log | logs/run.log |
yes | yes | yes | the first 60 s or 4 MiB | yes |
| Previous log | logs/previous-run.log |
yes | no | no | no | yes |
| Crash | crash/ |
yes | when the run crashed | when the run crashed | no | yes |
| History | history/ |
yes | yes | yes | no | yes |
| Settings | settings/ |
yes | yes | yes | no | yes |
| Screenshot | screenshot/ |
never | yes, by default | when the task asks | never | yes |
| OPAL | opal/ |
no | no | when the task attaches files | no | yes |
The trigger names who made the bundle: crash at the next start after a crash,
user from Send bug report…, opal from an OPAL task, and startup from the
startup logs of a debug build.
Limits
| Limit | Value |
|---|---|
| Total, compressed | 32 MiB |
| One file, before compression | 24 MiB |
| Members | 64 |
| Files from an OPAL task | 8, at most 1 MiB together |
When a bundle is over the total, the files are cut in this order until it fits:
logs/previous-run.logcrash/wer.dmp, whencrash/sentinel.dmpexistshistory/- The start of
logs/run.log. The end stays, because the end of a log holds the failure crash/wer.dmpcrash/sentinel.dmp
report.json, manifest.json, build/ and system/ are never cut. Each cut
is recorded in the manifest with its reason.
The manifest
manifest.json, version 1:
| Key | Content |
|---|---|
version |
1 |
files |
One entry per file except manifest.json itself: path, bytes (the size unpacked), sha256, source |
missing |
One entry per absent file: path, source, reason |
cut |
One entry per cut: path, source, bytes, reason |
removedByUser |
The sources removed in the composer |
totals |
bytes, compressedBytes, files |
Member formats
Every JSON member is UTF-8 without a byte order mark. A time is RFC 3339 UTC with
Z and whole seconds, for example 2026-10-09T18:30:00Z. A value the app could
not find is null. Keys are never translated.
report.json
| Key | Type | Content |
|---|---|---|
version |
number | 1 |
reportId |
string | The report's UUID |
trigger |
string | crash, user, opal or startup |
cause |
string or null | For crash: signal, exception, fast-fail or unclean-exit. Otherwise null |
text |
string | What the user wrote. Empty when nothing was written |
app |
string | The app id, for example construct |
created |
string | When the bundle was made |
build/identity.json
| Key | Type | Content |
|---|---|---|
version |
string | The package version |
channel |
string | The release channel |
branch |
string | The git branch |
commit |
string or null | The full 40-character commit |
buildId |
string | The short commit, which symbol archives match |
commitDate |
string or null | The commit time |
dirty |
boolean | The working tree held changes |
variant |
string | debug, release or profiling |
edition |
string | The edition id |
toolchain |
string | The compiler toolchain |
qbsProfile |
string | The qbs profile |
lto |
boolean | Link-time optimization |
hardening |
boolean | Security hardening |
sanitizers |
array of string | For example ASan. Empty when none |
system/os.json
| Key | Type | Content |
|---|---|---|
name |
string | The product name of the operating system |
productType, productVersion |
string | The operating system and its version |
kernelType, kernelVersion |
string | The kernel and its version |
cpuArchitecture, buildAbi |
string | The processor and the binary interface |
locale |
string | A BCP 47 tag, for example nb-NO |
memoryBytes |
number or null | Physical memory |
system/graphics.json and system/screens.json
graphics.json holds the keys of
system.graphics.report, with
typed values, and adapters: an array of objects with name, deviceType
and chosen.
screens.json is an array, one object per screen: name, widthPx,
heightPx, devicePixelRatio, logicalDpi, refreshHz and primary.
These two are read on the user interface thread. A bundle made without it names
them in missing.
history/runs.json
An array, newest first, one object per run: start, pid, app, version,
buildId, verdict (clean, crash or unclean-exit) and logFile (the file
name only).
settings/settings.json
An array, one object per setting that is not secret: key, value (a boolean,
number or string, as the setting's kind; a choice is its string) and level
(the level that supplied the value). A secret setting is named in missing with
the reason "secret".
Log files
The lines of the app's log format. The collector copies the bytes before the
first NUL, because the log file is padded with zeros, and bytes in the manifest
is the size after that cut.
crash/exit-code.txt
Two key=value lines: code=0x followed by 8 hexadecimal digits, and name=
followed by the Windows status name, or unknown.
Privacy
| Content | What the collector does |
|---|---|
| Your home directory in a text file | Replaced by <home> in every text file: the logs, the marker, the settings |
| A secret setting | Absent, and named in missing |
| The access token | Never in a bundle |
| A crash dump | Not redacted. It can hold document data |
| The screenshot | Only in a user report, or when an OPAL task asks for it, and removable |