Original line numbers
Every block points to its exact 1-based range in each file. Removing ANSI colors never renumbers a line.
For developers and platform teams
CI Log Diff lines up two job logs, ignores the timestamp noise you choose, and shows each change next to its original line numbers. New error-like lines are flagged as leads, not verdicts.
change-005 · Changed Error candidate
| 24 | 2026-09-15T10:00:24.488Z PASS tests/orders.test.ts (3.1s) |
| 25 | 2026-09-15T14:30:26.801Z FAIL tests/orders.test.ts (3.2s) |
| 26 | 2026-09-15T14:30:26.802Z Error: connect ECONNREFUSED 127.0.0.1:5432 |
| 27 | 2026-09-15T14:30:26.803Z at TCPConnectWrap.afterConnect (node:net:1611:16) |
The problem
Two runs of the same job differ on every line because every line starts with a different time. The one change that matters — a port, a dependency warning, the first stack trace — is somewhere in the middle of thousands of red and green lines.
CI Log Diff removes only the noise you name, keeps every meaningful number, and keeps the way back to the source: each block carries its 1-based line range in both files, so you can verify it in the raw log.
How it works
Pick the known good and the failed run log of the same job. You assign the roles; the tool never guesses which run passed.
Step through changed blocks side by side, switch between original and normalized text, widen the source context up to 100 lines, and filter to error candidates.
Download JSON or a self-contained HTML report of the selected blocks. Log text is left out unless you explicitly include it.
What you get
Every block points to its exact 1-based range in each file. Removing ANSI colors never renumbers a line.
Only leading ISO timestamps and the workspace prefixes you type. Exit codes, ports, durations and versions stay visible.
If a work or size budget runs out, the result says how far it got. A partial comparison is never presented as clean.
No upload, no storage, no tracking scripts or cookies. Exports contain line ranges only unless you opt in to text for the blocks you selected.
Log text, file names and group labels are displayed as text. HTML, terminal hyperlinks and “instructions” inside a log do nothing.
A read-only command-line tool with the same limits, exit codes for CI policies, and no network access.
Boundaries
Command line
npm ci --ignore-scripts
node apps/cli/main.mjs --root . --before fixtures/good.txt --after fixtures/failed.txt
node apps/cli/main.mjs --root . --before good.log --after failed.log --format html --out report.html
Exit code 0 means complete and within policy, 1 means the policy found changes or candidates, 2 means invalid or incomplete, 130 means cancelled. Node.js 24 is required. CLI reference →
Questions
No. The app is a static page. Your two files are read by a Web Worker inside your browser tab, and the page’s Content Security Policy forbids network connections from scripts. There is no upload endpoint, account, tracking script, cookie or storage.
No. It shows what changed between the two logs and marks blocks that contain a new error-like line as “error candidates”. A candidate is a lead for your investigation. A changed line alone cannot establish why a build failed.
No. “No differences after normalization” only means the two files match under the active profile. It says nothing about either job’s outcome.
Optionally, a leading ISO-8601 timestamp on each line, and the exact workspace path prefixes you type in. Nothing else. Exit codes, ports, durations, versions and every other number are compared as written.
Each file can be up to 8 MiB and 200,000 lines, with at most 65,536 characters per line. The comparison has a work budget and a 5-second deadline. If a budget runs out you get an explicit “incomplete” result that states how far the comparison got; it is never shown as clean.