A report turns the comparison on screen into a file you can hand over:
attach it to a mail, drop it into a ticket, archive it as evidence of what
changed between two states. Diffoniq writes reports as a self-contained
HTML page or as plain text — interactively from
File > Export Report..., or headless from the command
line with /report.
Reports are read-only: nothing on either side is touched, and the report
file is written wherever you point it. Unlike
printing, the result is a file that can be forwarded,
searched and kept. For driving /report from scripts or an AI
assistant, see Scripting and AI Assistants.
File > Export Report... reports whatever is on screen — a directory comparison, an archive comparison or a single file comparison — using the comparison that already ran; nothing is scanned again.
| HTML page | A single self-contained file: colored rows, no external images, style sheets or scripts. Opens in any browser, prints cleanly, and follows the system's light or dark mode. |
| Plain text | UTF-8 text in aligned columns (folder report) or in a diff-like marker layout (file report) — readable everywhere, easy to grep or to diff against yesterday's report. |
| JSON | One document for programs — see JSON for scripts below. Pick this when something other than a human reads the result. |
| Include identical items/lines | Off for a folder report: identical files are counted in the summary but not listed, so the report is a list of changes. On for a file report, where the unchanged lines are the context. Turn it on or off as you need. |
| Open the report | Opens the finished file with whatever is registered for its type — usually the browser or the text editor. |
Browse... opens the usual save dialog; the file type you pick there also sets the format. The suggested name combines both compared roots with a timestamp and lands in your Documents folder.
The header states both roots and the options the comparison ran with (subfolder depth, the active Ignore switches, rename detection) — a report should explain itself to whoever receives it. Then one row per compared item:
different | Both sides exist and differ |
only left/only right | Exists on one side only |
identical | Both sides agree (listed only with Include identical items) |
unverified | Same size, but the content hash was still being computed (or was canceled) — never silently reported as identical. Let the background compare finish and export again. |
not compared | Command line without
--content only: same size, contents not read. Counted in
the summary and listed with --include-equal, but never
called identical — a file changed without changing its size
would otherwise pass unnoticed. It does not count as a difference for
the exit code. |
Each side carries its path, size (<DIR> for folders) and
timestamp. A pair found by rename/move
detection is marked as renamed, and entries that live inside an
archive are marked as such — a report of a ZIP comparison stays
recognizable as one.
The Single files/Subdirectories view filters hide rows on screen only; a report always covers the whole comparison (it says so in the header when a filter is active).
The HTML file report is the two panes side by side, with line numbers and changed, added and removed lines colored. The text file report uses one marker column instead, which keeps long lines readable:
12 12 unchanged line
13 13 < the old text
13 13 > the new text
14 - - line only on the left
- 15 + line only on the right
/report)The headless twin of the dialog — it reports through an exit code,
the report file and a log file (started through
DiffoniqC.exe, the log
lines also appear in the console):
Diffoniq /report <left> <right> --out <file>
[--format html|text|json] [--include-equal] [--content] [--reverify]
[--log <file>] [compare switches]
From a script, call DiffoniqC.exe:
Diffoniq.exe is a windowed program, so a shell neither waits for it nor sees
its exit code. The console launcher DiffoniqC.exe next to it
takes the same arguments, waits, prints the log lines and returns the exit
code (Scripting and AI Assistants). The
--out file is written to a temporary name and appears only when
it is complete.
--out <file> | Where to write the report (required). Missing folders are created. |
--format html|text|json | Output format. Without
it the extension of --out decides: .txt (also
.text, .log) writes text, .json
writes JSON, anything else HTML. |
--include-equal | List identical items/lines too, not just count them. |
--content | Decide by file content instead of
size and timestamp: equal-sized pairs are hash-verified (using the
hash cache, so repeat runs are
cheap). Without it, no file is read: equal-sized pairs are reported as
not compared, and the report header says so. |
--reverify | Like --content, but
every equal-sized pair is read again instead of being answered from the
hash cache — the command-line twin of
Re-verify Contents. Use it to check
a backup: a file damaged or changed while its size and timestamp stayed
the same is found only this way. Slower, because every file is read;
the fresh checksums refresh the cache. |
--log <file> | Write the run log elsewhere
than %APPDATA%\Diffoniq\report\. |
Two folders produce a folder report, two files a file report; archives may
be used on either side. The compare switches of a
normal start work here too — for example -s to include
subfolders or the file mask on the paths — and the report header records
what was in effect.
0 | Report written — no differences |
1 | Report written — differences found |
2 | The report file could not be written |
3 | Invalid arguments, or the comparison failed |
The log is written to
%APPDATA%\Diffoniq\report\report_YYYYMMDD_HHMMSS.log (the
30 newest are kept) unless --log <file> names a
different location. It names the license the run saw
(license: <licensee> (<file>) or
license: none (evaluation)), so an evaluation note in a report
can be traced to the machine that produced it.
--format json (or the JSON option in the dialog) writes
a single UTF-8 document instead of a page — for batch files, CI jobs and
anything else that has to act on the result rather than read it. It
avoids the two bad options a script has otherwise: hanging on the exit code
alone (too coarse) or parsing the text layout (brittle).
{
"diffoniq": {"version": "2.0", "reportVersion": 1, "licensed": true},
"kind": "folder",
"created": "2026-08-13T08:31:19Z",
"left": {"root": "D:\\work\\a", "archive": false},
"right": {"root": "D:\\work\\b.zip", "archive": true},
"options": ["Subfolders: included (max level 64)", ...],
"summary": {"total": 5, "different": 3, "onlyLeft": 0, "onlyRight": 0,
"identical": 2, "unverified": 0, "notCompared": 0,
"renamed": 1,
"folders": 1, "files": 4, "listed": 3},
"entries": [
{"status": "different", "directory": false, "renamed": false,
"left": {"path": "docs\\readme.txt", "size": 18, "directory": false,
"modified": "2026-08-13T06:57:39Z",
"modifiedLocal": "2026-08-13 08:57", "inArchive": false},
"right": {"path": "docs\\readme.txt", "size": 32, ...}}
]
}
status is one of different,
onlyLeft, onlyRight, identical,
unverified, notCompared. Treat
unverified and notCompared as their own
cases — both mean equal size with the content unknown,
never “identical” (notCompared: the run was
told not to read contents). Add --content if the script
needs a decision.null, so
entry.right === null is exactly “only on the
left”.modified is ISO
8601 UTC, or null when the source carries no UTC timestamp
(archive entries) — modifiedLocal then still shows
what the display shows.inArchive marks an entry inside an
archive, and the root object says which
side is one."kind": "file" and a
lines array instead of entries: per line a
status plus left/right objects
of line (may be null for an inserted line) and
text.reportVersion changes only when an existing key changes
meaning; new keys may appear without it. Since 2.0.1 a
run without --content no longer counts same-size pairs as
identical but as notCompared: a script that
expects identical to equal the number of files, or knows
only the earlier status values, has to accept the new one. Encoding is UTF-8 with LF line
ends, and text that is not valid UTF-8 (binary content in a compared
file) is emitted as U+FFFD so the document always parses.licensed is false when the report was written
by an evaluation copy; the HTML and text
formats say the same in their footer (“Generated by Diffoniq 2.0
evaluation version — diffoniq.com”), a licensed copy writes
just “Generated by Diffoniq 2.0”. The report itself is
complete either way — nothing is held back. In the HTML footer
the domain is a link with a fixed campaign tag (see
Links to the Diffoniq website); it is the
same in every report and identifies neither you nor the recipient.schtasks /create /tn "Nightly change report" /sc daily /st 06:00 ^ /tr "\"C:\Program Files\Diffoniq\Diffoniq.exe\" /report D:\work \\nas\backup\work --out D:\reports\work.html --content"
Together with /sync this closes the unattended loop: the sync does the work, the report says what it found.