CI Log Diff Open the app

For developers and platform teams

Compare the failed CI log with the last good one.

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.

  • Runs in your browser
  • Nothing is uploaded
  • No account
  • Free, MIT licensed
≠ Differences found7 changed blocks2 error candidates23 equal lines

change-005 · Changed Error candidate

Known good · line 24

242026-09-15T10:00:24.488Z PASS tests/orders.test.ts (3.1s)

Failed run · lines 25–27

252026-09-15T14:30:26.801Z FAIL tests/orders.test.ts (3.2s)
262026-09-15T14:30:26.802Z Error: connect ECONNREFUSED 127.0.0.1:5432
272026-09-15T14:30:26.803Z at TCPConnectWrap.afterConnect (node:net:1611:16)
Real output of CI Log Diff 1.0.0-rc.1 for its built-in synthetic example, generated when this page was built. Timestamps differ on every line and are ignored. Run this example in the app →

The problem

A plain diff of two CI logs is mostly timestamps.

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

Three steps, all on your machine.

  1. Choose two logs

    Pick the known good and the failed run log of the same job. You assign the roles; the tool never guesses which run passed.

  2. Review the changes

    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.

  3. Export what you chose

    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

Evidence you can check, limits you can see.

Original line numbers

Every block points to its exact 1-based range in each file. Removing ANSI colors never renumbers a line.

Narrow normalization

Only leading ISO timestamps and the workspace prefixes you type. Exit codes, ports, durations and versions stay visible.

Honest incomplete results

If a work or size budget runs out, the result says how far it got. A partial comparison is never presented as clean.

Private by default

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.

Inert log content

Log text, file names and group labels are displayed as text. HTML, terminal hyperlinks and “instructions” inside a log do nothing.

Same engine in a CLI

A read-only command-line tool with the same limits, exit codes for CI policies, and no network access.

Boundaries

What it does not do.

  • It does not find the root cause. It shows differences and marks candidates.
  • It does not fetch logs from GitHub or any CI provider, rerun workflows or change code.
  • It does not claim a minimal diff; alignment is bounded, and heavily repeated text can split or merge blocks.
  • It does not redact secrets. If you include log text in an export, review it first.

See all limits →

Command line

The same comparison in a terminal or CI step.

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

Before you try it.

Does CI Log Diff upload my logs?

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.

Will it tell me the root cause of the failure?

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.

If it reports no differences, did my CI job pass?

No. “No differences after normalization” only means the two files match under the active profile. It says nothing about either job’s outcome.

What is normalized, and what is not?

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.

What happens with very large or very different logs?

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.

All questions →

Try it with the built-in example, then with your own two logs.