author: David Mashburn created_at: 2026-06-01T20:35:08Z modified_at: 2026-07-31T20:56:06Z generated_by: Codex generated_for: David Mashburn reviewed_by: approved_by: repo: https://github.com/davidmashburn/bygone branch: main repo_branch_url: https://github.com/davidmashburn/bygone/tree/main repo_head_commit_url: https://github.com/davidmashburn/bygone/commit/183156146f54cc35b9304d6b2131e066b88e97dcBygoneBygone is a VS Code extension and standalone desktop app for visual diff and file history.
Explore the 51-step product tour, including comparison, VS Code editing, dependency graphs, pull-request review, and the reader path for optional proof. Features
StatusThis project is usable as a VS Code extension and standalone desktop app. The two-way diff and git history flows are the most complete. The multi-panel view is diff-focused, not a merge tool. Change blocks and inline highlightingHover a changed block on either side or its gutter connector to show copy arrows. Moving the text cursor into a changed block or jumping to a change also shows them. Each arrow stays beside its source block's first line: the left arrow points right, and the right arrow points left. Clicking copies that block to the opposite panel; arrows targeting a read-only panel are disabled. A touching run of deletions and insertions forms one blue replacement block, even when the text has no matching words. One-sided changes stay green. Green and blue blocks can still touch; exactly matching lines separate change regions. When an unpaired gap contains exactly one line on each side, those lines are compared for inline highlighting. Larger ambiguous gaps keep conservative line alignment within their blue block. A short statement expanded from one line to several, or collapsed back to one, is compared as a whole for inline highlights when the combined text is similar enough. This preserves the line alignment and the inline highlighting length limit. Multi-panel comparisons show changes from all adjacent pairs. A shared panel shows the union of changed lines and words, with overlaps painted once. A line that is one-sided in one pair and replaced in another uses replacement blue; connectors in each gutter still describe that pair. Focus selected pair is off by default. Turn it on to show only the selected pair's highlights and connectors, then select another gutter to inspect that comparison with its own block colors. Toggling focus preserves your scroll position. Previous/next change always follows the selected pair. Directory and file views share the Visible panels setting (2, 3, 4, or Fit), so opening a file or returning to its directory keeps the chosen density. New three-way and four-way comparisons start with 3 and 4 panels selected. Those counts stay visible even in tight windows; choose Fit for automatic width-based adjustment. You can still select a smaller count manually. Bygone matches words first, then uses edge trimming inside each replacement:
leave the longest identical beginning and ending unhighlighted, and highlight
the remaining middle. The beginning and ending never overlap. If one complete
text is a prefix or suffix of the other, keep it unhighlighted: Brackets below represent the stronger inline highlight:
This handles a single contiguous edit anywhere in a replacement. It does not
search for unchanged text inside the remaining middle: multiple separated edits
within one word highlight everything from the first difference through the last.
It also makes no semantic judgment: Highlight boundaries preserve whole displayed Unicode characters, including combining accents and emoji. Edge trimming changes inline emphasis, not line pairing or block colors. Existing whitespace-only highlighting and limits on inline highlighting for long lines still apply. Install For DevelopmentInstall dependencies and compile:
Run the extension in VS Code:
Run the standalone desktop app locally:
Run a headless standalone smoke check:
For development only, you can install the repo-local launcher globally:
For a one-command local sync that builds the repo, installs the global CLI, packages the desktop app, and auto-installs the VSIX and desktop app for your current platform:
A clean checkout installs the committed version. Rebuilding with uncommitted
changes automatically increments a local iteration: For a real release, set the intended plain version with
CLI defaults:
On macOS, desktop-backed CLI commands and change tours route into the running Bygone app instead of opening another app instance and Dock item. Starting a new comparison brings the central app window forward and replaces its current session after any unsaved-change confirmation. Tours reuse a dedicated window owned by that same app process. When Bygone is quit or restarted for an upgrade, the desktop app remembers the open Explore session and tour windows. A normal no-argument launch restores them; an explicit file, directory, review, or presentation launch takes precedence. Windows whose source files or Git targets no longer exist are skipped or replaced with a blank Explore window. Shell completion is generated from the same command specification as
If the native desktop app is installed, the npm/source launcher prefers it and forwards the shell working directory. Set Review a pull requestUse Pull request inputs require the GitHub CLI, authenticated with No manual clone is needed. Bygone reuses a matching full clone, or creates an empty cache repository under Fetched refs use The desktop Git → Review Pull Request… dialog accepts a link or qualified reference. PR title, description, author, state, and URL are included in context and presentation metadata; the title and URL supply presentation defaults. PR inputs cannot be combined with explicit head/base refs or Branch review compares the selected head directly with Two-file and directory drill-down comparisons detect binary content before decoding it as text. Images render side by side when they are small enough to preview inline; all binary comparisons report whether the underlying bytes are identical. Change tours can layer an authored, code-connected narrative over the complete generated change set. Pass a Packaged macOS builds register Agents can validate anchors and structure with Install the agent skill:
The skill includes Bygone install instructions for macOS Homebrew, npm, and source checkouts. It also ships inside the Contributors should consult the internal product surface overview before adding a command, mode, tour scene, or packaged artifact.
The desktop app also includes macOS says the app is damagedDownloads from GitHub or Homebrew are unsigned (no Apple Developer ID signature yet). macOS Gatekeeper then shows a misleading “damaged” dialog. Workaround (unsigned desktop builds):
Or right-click the app → Open once, or allow it under System Settings → Privacy & Security. Package For External UseThis repo is set up for local/private packaging. A typical release flow is:
That produces a Build the standalone desktop packages:
That produces a macOS DMG in
Stage the scoped npm standalone package:
The root Homebrew packaging templates live in Build the full local release artifact matrix:
That runs tests, rebuilds the VSIX, stages and dry-run checks the npm package, builds desktop artifacts, and installs the resulting CLI, shell completions, VSIX, and current-platform desktop app locally. A running macOS desktop app is asked to quit normally; installation stops if unsaved work prevents it from exiting, and the installed app is then restarted. If the local macOS DMG or Windows cross-build toolchain is unavailable, use Publishing is intentionally explicit:
Run Reinstall the current built artifacts without rebuilding:
This refreshes the global CLI, shell completions, VSIX, and desktop app from the existing artifacts. On macOS it performs the same graceful quit and restart, blocking installation when unsaved work keeps the app open. Run the release checks:
The standalone smoke check is intentionally run directly because Electron can abort on macOS when launched from a longer nested npm command chain, while the same smoke check passes as a direct release gate. In the standalone window, you can also drag and drop:
Git DifftoolBygone can be launched from Configure the standalone launcher:
That registers:
Configure the VS Code launcher:
That registers:
The VS Code path launches:
The wrapper scripts are:
Commands
Two-file comparisons open as independent editor tabs. Trusted local worktree panes edit through VS Code documents, so changes participate in dirty state, undo, save, and external-document updates. Historical and non-local inputs are read-only. Desktop hand-offs are unavailable in remote extension hosts. Follow the active VS Code editorRun Bygone: Follow Active Editor to open one comparison beside your source editor without moving keyboard focus. Switching source files updates that pane. The left side is HEAD; the right side is the VS Code document, including unsaved edits. Edit either the source pane or Bygone's working pane: both update the same document. Save, Undo and Redo in Bygone use that document's save and edit history. Typing neither saves the file nor stages it. Source Control offers Open Staged Changes in Bygone (HEAD → index) and
Open Working Changes in Bygone (index → working buffer), in the file's inline
and context menus. Staged views exclude unsaved edits and are read-only. Native
stage, unstage, discard, commit and checkout operations refresh live comparisons.
The selected policy stays in place when a file leaves its SCM group; an empty
comparison shows that there are now no changes. Enable Use Bygone: Compare Symbol in Bygone, or enable Working symbol slices are editable. Edits before a declaration move its tracked range; temporary syntax errors keep its editing range usable. Replacing or deleting the declaration externally returns to file context. If a concurrent edit makes a pending write stale, Bygone preserves the attempted text in an untitled recovery document instead of overwriting the source. Pending drafts are also recovered when the panel closes or the extension starts again after a reload. Pin keeps the target, baseline and symbol focus. A pinned working endpoint continues to reflect edits; a pinned staged view holds both snapshots. Git changes show a notice until Resume Following resolves current endpoints. Refresh updates live comparisons; pinned snapshots remain fixed. Source navigation within the selected file preserves SCM policy; a different ordinary file selects HEAD → working. View File History and Manual Compare… pause following and open separate views. A restored following panel starts paused. Labels identify the repository, paths, comparison policy and saved/unsaved state. New/deleted files and unborn HEAD use explicit absent endpoints. Following supports trusted local Git worktrees, including linked worktrees and multiple repositories. Each selected endpoint must be text, at most 128 KiB and 5,000 lines; Git snapshots must be UTF-8. Conflicts, unsupported diff inputs, symlinks, binary, remote, virtual and notebook inputs show an explicit unavailable state. Git failures clear the previous comparison. Arbitrary cross-file symbol moves and hunk staging inside Bygone are outside this integration. Use Bygone: Open Evidence Review to inspect pinned requirement evidence, edit the working counterpart, and return to the original review. See the evidence workflow and PR Reviewer bridge. See the integration contract and verification record for snapshot/edit safeguards, analysis budgets and reproducible Extension Host tests. Limitations
Release WorkThe current release checklist and remaining publication blockers are tracked in RELEASE_PLAN.md. Codebase GuideArchitecture and implementation details are documented in CODEBASE.md. WalkthroughA screenshot-based walkthrough using Bygone on its own source tree lives in docs/walkthrough.md. Why “Bygone”?In short: this project is openly inspired by Meld, and Bygone is meant to carry that visual tradition into a more history-aware tool. Meld was a direct inspiration for this project. Its visual diff metaphor is still one of the clearest and most human ways to understand change, and Bygone builds on that lineage while pushing further into revision history. The name also nods to the bygone era before vibe-coding, when people were at least pretending to read, understand, and take responsibility for the code they were writing. This tool is about looking directly at what changed, where it came from, and how the current state emerged. And yes, Codex, the irony is noted. Thanks for the assist. TestsRun the current unit checks with:
|
