A visual old-vs-new diff tool for static websites.
It builds two versions of a site (base and current), then serves a browser UI for page-by-page rendered comparison with:
- Split and single-pane viewing
- Sidebar navigation across changed pages
- Add / delete / moved highlighting toggles
- Fuzzy moved-line detection to reduce false positives
Git diffs are great for source-level review, but website changes often need rendered review. This tool gives you a fast workflow for that.
gitdocker(default build path)python3(for local preview server)
Run from any repository you want to review (Jekyll default):
/path/to/visidelta/scripts/visidelta.sh origin/main /tmp/site-diff serve .Open:
http://127.0.0.1:4310
Use VisiDelta directly in workflows:
- uses: DollhouseMCP/visidelta@main
with:
base_ref: origin/main
out_dir: /tmp/visidelta
mode: buildFor non-Jekyll projects, pass custom build commands:
- uses: DollhouseMCP/visidelta@main
with:
base_ref: origin/main
out_dir: /tmp/visidelta
mode: build
build_old_cmd: npm ci && npm run build && cp -R dist/. "$DEST_DIR"
build_new_cmd: npm ci && npm run build && cp -R dist/. "$DEST_DIR"Install the launcher once:
./scripts/install-local-launcher.shThen run from any repo:
visideltaOr target a specific repo path:
visidelta /path/to/repovisidelta.sh [BASE_REF] [OUT_DIR] [MODE] [TARGET_REPO]BASE_REF: Git ref to compare against (defaultorigin/main)OUT_DIR: output directory for generated diff site (default/tmp/visidelta)MODE:buildorserve(defaultbuild)TARGET_REPO: repo path to diff (default.)
base_ref: compare base ref (defaultorigin/main)out_dir: output directory (default/tmp/visidelta)mode:buildorserve(defaultbuild)target_repo: target repository path (default.)build_old_cmd: optional custom base build commandbuild_new_cmd: optional custom current build commandextra_exclude_globs: extra file globs to exclude from route listport: serve port whenmode=serve(default4310)
For non-Jekyll sites, pass build commands with env vars:
BUILD_OLD_CMD='npm ci && npm run build && cp -R dist/. "$DEST_DIR"' \
BUILD_NEW_CMD='npm ci && npm run build && cp -R dist/. "$DEST_DIR"' \
./scripts/visidelta.sh origin/main /tmp/site-diff serve /path/to/repoAvailable env vars inside build commands:
SRC_DIRDEST_DIRBASEURL(/oldor/new)
- Changed pages are inferred from changed
*.mdfiles by default. - Excludes include
README.md,LICENSE,docs/*,scripts/*,.github/*. - Add extra excludes with
EXTRA_EXCLUDE_GLOBS.
shellcheckruns against all shipped shell scripts.- A smoke test creates a temporary git fixture repo and validates generated output.
Yes, but with one constraint: VisiDelta itself is a build-time tool, so GitHub Pages can host generated output for a specific run, not run comparisons dynamically in-browser.
Typical setup:
- Run VisiDelta in CI for a target repo/branch pair.
- Publish the generated
/tmp/visideltaoutput as a Pages artifact. - Browse static compare output on Pages.
An example workflow is included at docs/examples/pages-preview.yml.
AGPL-3.0-or-later.