FF Git Image
See what changed in your images, right inside VS Code. Review screenshots, icons, illustrations, and other image assets in any Git repository. Pick a file in the native sidebar, compare its versions, and stage or discard changes without leaving the editor. Get started · Comparison modes · Different image sizes · File actions · Changelog Side by side: inspect both versions at once. Screenshots in this guide use demo images in the actual comparison interface.
More from the same developer: ASO.dev · [FF] Flutter Files for VS Code. FF Git Image is an independent extension for ordinary image assets in any Git repository. It has no runtime npm dependencies and does not require Flutter, Dart, ff_golden, ff_golden_presenter, ImageMagick, a browser server, or an external diff program. Install and openDownload a tagged build from GitHub Releases, or build a VSIX locally. Branch and PR builds are available as temporary artifacts under GitHub Actions.
The sidebar header has Find Changed Image (search icon), Open Image Changes, and Refresh actions. Search by filename, full path, repository, or staged/unstaged state; selecting a result opens that comparison and reveals its tree entry. You can also run [FF] Git Image: Find Changed Image or [FF] Git Image: Open Image Changes from the Command Palette, or click the diff icon in the Source Control header. Single-child folder chains are compacted into one row. Branches such as You can also right-click an image in Explorer or Source Control and choose [FF] Git Image: Compare Image Changes, or use its editor title action. The native sidebar is the only file list. The editor tab uses its full width for the comparison; its Images button reveals the sidebar if it is hidden. Review controls
Swipe and overlay
Click a screenshot to inspect it at full size. Pixel diff and color thresholdPink marks the changed pixels. Start at Exact to see every difference; move Color threshold toward Ignore more to filter out smaller color variations. This changes the comparison preview; tree percentages always use Exact. Pan, zoom, and review
Compare captures with different dimensionsDifferent pixel dimensions, matching visual width. Compare the layout and content while both original sizes remain visible. Choose View → Side by side and check Logical scaling above the images, next to Fit. Each version uses its own image-sized canvas. Both versions have the same displayed width, preserve their aspect ratios, and align at the top. Zoom and scrolling stay synchronized in the shared visual coordinates. For example, 1440 × 875 and 3456 × 2156 captures fill the same visual width instead of leaving the smaller version in the corner of a larger canvas. This setting is intended for comparing content and layout across different screenshot resolutions. Fit fits the whole pair; 100% displays both at the smaller image's native width. Each pane shows its original dimensions and actual image scale. Pixel highlight, color threshold, change bounds, and raw pixel percentages are hidden while logical scaling is active because they describe the original pixel grid. Uncheck the box to restore them. Other views continue using original pixels; returning to Side by side restores the checkbox's selection. Saved settings from the former Layout view automatically migrate to Side by side with Logical scaling checked. Images are not stretched, cropped, or modified; no automatic semantic matching is performed. Git semanticsHide images with .image_ignoreCreate
Patterns use Git ignore syntax: one per line, The working copy of the root Saving, creating, or deleting the file updates the extension automatically, and Refresh rereads it. Each repository has independent rules. If the selected comparison becomes excluded, the viewer selects another visible image or displays an empty state. If the file cannot be read, a warning is shown and the previous rules remain active until it can be read again. Manage exclusions from the treeUse Ignore Images on files, folders, or a multi-selection. The extension appends exact, escaped paths to Compared versions
A partially staged file has two separate entries. Renames use the old path for the before version and the new path for the after version. New images open at full width with a new badge, without an empty before pane. Zoom, pan, backgrounds, and file actions remain available; comparison controls return with your saved settings when you select a modified image. Deleted files retain an explicit absent after side. Merge conflicts remain marked as conflicts; this extension does not resolve them. Accept or discard a folderRight-click an image, folder, or scope heading in the FF Git Image tree:
Folder and group actions include only their visible image descendants, respecting Ctrl/Cmd-click or Shift-click to select several files and folders. Right-clicking a selected row applies to the selection; right-clicking a different row applies to that row. Overlapping folders/files are deduplicated. Stage handles unstaged, non-ignored entries; Unstage handles staged, non-ignored entries. Commands from the tree and comparison toolbar share one FIFO queue. One progress notification shows the current action and the number waiting. Identical outstanding commands for the same selected revisions share a task. Each task keeps the paths and revisions captured when clicked, checks them again before writing, and reports the completed count. A failed task or a cancelled discard confirmation does not block later tasks. Conflicting commands whose selected changes are no longer current are rejected; queued selections are never silently expanded or updated. Image contents are fingerprinted as the tree loads. Tree actions remain available during background calculations; if a selected image is still loading, the operation waits for its initial revision and reports progress. A changed path with unchanged Git status is still rejected. For an image already viewed, the last displayed revision must also match. If a file changes, review the refreshed image before trying again. Preview errors and preview size limits also prevent Git mutations through this UI; use Source Control for those files. The comparison toolbar offers Stage / Unstage, Discard…, Ignore / Stop ignoring, Previous, and Next. Left/right arrows navigate images when focus is outside controls and reveal the current image in the native tree. Navigation remains available while actions are running, so another image can be reviewed and queued. Only the image with an outstanding toolbar action has its action buttons temporarily disabled. Commands refresh Git status only in the selected repositories. Initial reads needed by an action take priority over queued background images; background revision checks and pixel-statistics requests pause during the operation and resume afterward. The tree and comparison refresh after each action, with background fingerprint work outside the mutation queue. Committing and conflict resolution remain in VS Code's Source Control. Discard uses VS Code's filesystem API; if the filesystem cannot move a new image to Trash, the error is reported without silently retrying permanent deletion. Git index lock recoveryIf staging or unstaging fails specifically because Pixel percentages in the treeOnce a comparison tab is open, its local background worker calculates original-pixel differences sequentially for visible images and sends only counts back to the tree. This does not change the active canvases, zoom, or comparison mode. Unchanged Git status notifications preserve the existing tree nodes and revisions. Percentages use native file decorations, separate from tree structure updates, so background results do not reset context menus or selection. The compact badge shows a whole percentage ( Fingerprints, previews and background statistics share an in-memory cache with a 64 MiB byte budget and up to 2,000 recently used fingerprints/results. Working-file events invalidate exact paths even when timestamps are preserved. Git index metadata is checked via literal blob paths when the real index changes (including linked worktrees); immutable commit versions remain reusable. Image bytes are read again only for changed or evicted versions, and unchanged snapshots do not reload the viewer. Explicit Refresh bypasses preview caches and retries unavailable results. Stage, Unstage and Discard always verify fresh bytes independently of this cache. Formats and limitsSupported extensions: PNG, JPG/JPEG, WebP, GIF, BMP, SVG, ICO, AVIF, including uppercase extensions. Decoding uses VS Code's Chromium engine. TIFF, HEIC, PSD, RAW, and other formats requiring additional codecs are not supported.
Requires VS Code 1.85+ and its built-in Git integration with Git available. VS Code's Git extension manages Git processes; FF Git Image itself does not start external programs, HTTP servers, or shell commands. Remote extension hosts are supported by the architecture but have not yet been separately verified; virtual workspaces are not supported. DevelopmentUse Node.js 22+ for the development tools.
Open this folder in VS Code and press F5 to launch an Extension Development Host. Build output is in Additional verification:
The browser test uses an ephemeral loopback server and synthetic image fixtures, checks canvas pixels and interactions, and saves a screenshot under Implementation: TypeScript extension host, a local HTML/CSS/JavaScript webview, and a local Web Worker for pixel comparison. Image bytes travel through VS Code's message channel; workspace paths never enter HTML. The webview can load code and styles only from its packaged media directory and has no network permissions. The integration uses the built-in Git API v1 and the VS Code webview API. To regenerate the five README screenshots from the current webview and synthetic fixtures:
This runs the browser checks and saves the gallery to Releases and publishingPushing a version tag such as See the publishing guide for the first release, version updates, retry behavior, and Marketplace setup. Related projects and links
For FF Git Image, see the source code, report a bug or request a feature, or browse the changelog. LicenseMIT. See LICENSE. Git ignore pattern matching uses a bundled copy of ignore 7.0.6, also MIT licensed. Its source attribution and license are included in |



