
Simple Tab Saver
Simple but powerful Visual Studio extension for saving and restoring opened document tabs. Built to do one thing well, with opt-in extra features layered on top. Fully customizable and portable (no absolute paths). Inspired by Workspace Manager.
Supports Visual Studio 2022 and Visual Studio 2026.
Overview
Saves the currently open document tabs into a per-solution JSON file and restores them later in the same visual order. Each save captures:
- tab order
- pinned status
- tab groups arrangement
- cursor and scroll position
- the active tab
- breakpoints (optionally)
Multiple named tab layouts per solution are supported and selectable from a toolbar dropdown. File paths are stored relative to the solution so tab layouts are portable across machines and Visual Studio versions. JSON files are created either at solution root or in external directory.
Integrates with git and can automatically save/restore tabs based on active git branch.
Unlike other extensions of this type, Simple Tab Saver is NOT a wrapper for IVsUIShellDocumentWindowMgr that captures all open tabs as a Visual Studio version-specific opaque binary stream, which uses absolute file paths and cannot be inspected, modified, or shared. Simple Tab Saver does everything explicitly, which enables unmatched level of customization and inspectable, portable storage: every tab layout is a plain JSON file, readable and editable by hand. This is the opposite of the opaque binary stream that IVsUIShellDocumentWindowMgr produces, and it is the reason the project exists.

Features
- Customizable Toolbar with a tab layouts dropdown and
New / Save / Restore / Management buttons, plus default Ctrl+Shift+R chord keybindings for every action. All commands are also registered in the Customize > Add Command dialog, allowing individual Management commands to be placed directly on the toolbar.
- JSON storage per solution, by default at
<SolutionDir>\.tablayouts\<name>.json, storing relative file paths (whenever applicable), with an option to use configurable external folder instead of solution root.
- Tab order preservation against the actual document tab strip, including pinned-first ordering and the active tab. Can also
Append tabs from the selected tab layout alongside currently open tabs without closing them.
- Tab groups support saving groups arrangement (which group each tab belongs to, active tab per group, group orientation) and re-creating it when restoring tab layouts.
- Tab layout management with
Rename, Duplicate, Merge (combine tabs from multiple tab layouts), Hide, Star (fix to top), and Delete.
- Toolbar dropdown sorting using order key and by starring/hiding tab layouts. Starred tab layouts are always put at the top regardless of the configured sort, and hidden at the bottom (if showing hidden is enabled, otherwise they are not displayed in the dropdown).
- Utilities sub-menu in the Management menu with:
Export Settings, Import Settings, Open Storage Directories, Breakpoints Snapshot, Tab Layout Backups dialog for browsing and recovering backups, and more.
- Session logs written to the extension's own installation folder (
Logs\ subfolders). No telemetry, no upload.
- Free and honest, no hidden trial, no expensive licensing, no subscriptions, no data collection.

Management Menu that contains additional options and extra features.
Tabs Drift Detection
When a restored tab layout points to a file that no longer exists at the saved path, the extension attempts to locate it automatically via Relocation and Rename detection:
- Relocation: exact file name (including extension) match anywhere else in the solution tree (except in configurable excluded directories).
- Rename: same-extension file in the original directory with a similar base name (default 75% match, configurable 50-99%).
When a candidate is found, a dialog offers to adopt the new location. If multiple candidates match, a picker dialog provides an option to choose the right one.

Autosave and Autorestore
Optionally saves the current tabs to a dedicated tab layout on solution close (or on solution build starting) and/or restores a tab layout on solution open. The autosave tab layout name is configurable (default Autosave) or can be set to match the solution name. Autorestore can be configured to use following tab layouts: Last Saved, Last Restored, Autosaved, Named like Solution, or Default-named.
Git Integration
Opt-in feature that automatically creates, saves and restores tab layouts per git branch. When a branch switch is detected, the outgoing branch tabs are saved and the incoming branch tabs are restored. A tab layout is created for each visited branch so it appears in the dropdown immediately. Git-tracked tab layouts displays a GIT prefix. An optional purge removes tab layouts for branches that no longer exist locally and are older than a configurable threshold (default 7 days).
Automatic Backup and Recovery
Keeps tab layouts safe by keeping copies of historic JSON files.
- Backup: every user-initiated save (
Save button, Create New overwrite, Autosave on close, Merge into same tab layout, Git Switch branch tab layout auto-save) can automatically copy the pre-update tab layout file into a .backups\ subfolder under the storage directory.
- Recovery: recovery is available through the
Tab Layout Backups dialog in the Utilities sub-menu. It shows all backups for each tab layout, and a Recover button which overwrites the main tab layout file from the backup contents.
Number of timestamped backup copies per tab layout is configurable in Options (default 5, up to 999).

Breakpoint Capture
Optional breakpoint capture in the opened documents on save and re-insertion during restore. A line-text anchor self-corrects the saved line number when the file has been edited between save and restore, with optional manual review. Stores breakpoint location, conditions, hit count filter, trace message, and enabled state. When breakpoint save is not enabled, breakpoints are ignored and existing ones are unaffected.
Breakpoints Snapshot
Standalone breakpoint save and restore, without affecting opened documents. For stashing a set of configured breakpoints independent of tab layouts. The Breakpoints Snapshot sub-menu in the Utilities provides following actions:
- Take Breakpoints Snapshot: saves breakpoints of opened documents into an invisible technical tab layout (can still be inspected as JSON file), merging into previously saved ones.
- Apply Breakpoints Snapshot: re-inserts saved breakpoints into documents that are already open, without reopening anything, using the same self-correction and review flow as the tab layout Restore's breakpoint re-insertion.
- Clear Breakpoints Snapshot: removes all saved entries from the breakpoint snapshot.
Options in the dedicated Breakpoints Snapshot category configure the Take merge behavior, a stash workflow (removing live breakpoints after a manual Take), a silent automatic Take on debug session end, additive or active-document-scoped Apply, and the sub-menu placement.

Compare and Edit
The Management menu provides Compare and Edit commands for deeper insight into saved tab layouts.
- Compare: shows a read-only diff between a saved tab layout and the currently open document tabs, showing tabs which are only in the saved tab layout and tabs that are not saved yet. It quickly answers the question "What will change during Save/Restore?".
- Edit: opens a dialog to inspect and lightly modify a saved tab layout. Can reorder tabs within their pinned/unpinned group, toggle pinned status, remove tabs, strip breakpoints, arrange tab groups, and run relocation/rename detection on tabs whose files have moved. The dialog also provides Tab layout management options (
Starred/Hidden toggles and Rename, Duplicate, Merge, Delete buttons). Edits are held in memory and written only when Save is clicked.
In both dialogs paths to the documents can be easily copied to clipboard using right-click on the selected rows.

Customization
Available in Tools > Options > Simple Tab Saver, or via the Options entry in the Management menu. Almost everything in Simple Tab Saver is customizable, but comes pre-configured with sensible defaults, so the extension is ready to use from the get-go.
- Storage location for tab layouts: at solution root (default) or an external directory with per-solution subfolders. Solution-root folder name is configurable (default
.tablayouts, supports defining subfolders via .vs\TabLayouts which can target existing subfolders like .vs, and moving up in directory tree via ..\.tablayouts), and can be created with a Hidden folder attribute. Changing the folder name or external directory path automatically renames/moves the existing storage directory.
- Storage overrides optional lists: set solution names (or patterns with
* wildcards) to always be stored at root/externally, overriding global 'Storage location' setting.
- Sort order and direction for the tab layouts dropdown: Alphabetical, Created Time, Last Saved Time, Last Restored Time, Tab Count, Save Frequency, or Restore Frequency. The frequency orders rank tab layouts by how many times they were manually saved or restored.
- Show hidden tab layouts in the dropdown (they appear with a prefix glyph and are sorted to the bottom of the list).
- Save and restore tab groups toggle. When disabled, all saved tab groups are always flattened to a single group during restore.
- Expand everything on restore toggle, unfolds every collapsible outlining area (
#region directives, collapsed methods, classes, comments) when restoring tabs.
- Autosave enable/disable, configurable tab layout name, option to use solution name as autosave name, and toggle to create autosave tab layout as hidden.
- Autorestore enable/disable with configurable tab layout source: Last Saved, Last Restored, Autosaved, Named like Solution, or Default-named.
- Pre-select tab layout on solution load dropdown with same options as Autorestore plus None, Most Saved, and Most Restored. Selects the tab layout in the toolbar without restoring it.
- Git branch integration toggles: auto-save on branch switch, auto-restore on branch switch, create git branch tab layouts as hidden, and prioritize git branch restore over Autorestore.
- Git branch tab layout purge enable/disable, age threshold in days (1-9999, default 7), and confirmation prompt toggle.
- Automatic backup enable/disable, backup count cap (1-999), and a separate toggle for whether Delete also removes the backup archive.
- Save breakpoints in tab layout toggle. Saves breakpoint location, conditions, actions, etc.
- Include external files in saved tab layout toggle (default on) and Exclude file path patterns from Save option. Together they control which open tabs are captured: turning off external files excludes tabs outside the solution directory, and patterns (with
* wildcards) exclude matching paths (in example: add *.Tests* to never save tabs from Tests projects).
- Insert breakpoints three separate toggles for insertion during manual Restore, Autorestore, and git branch switch (all default off).
- Breakpoints line self-correction toggle and confidence thresholds for reviewing or skipping breakpoints that no longer match their original location after restore.
- Breakpoints Snapshot options: Take merge behavior, active-document scoping for Take and Apply, stash workflow (remove live breakpoints after Take), automatic Take on debug session end, additive Apply mode, and sub-menu placement.
- Confirmation prompts for save overwrite, restore closing existing tabs, delete, hide, breakpoint refresh, breakpoints snapshot clear, tab-count drop, git branch restore, and git branch tab layout purge. Each individually toggleable.
- Relocation and rename detection each independently toggleable, plus a configurable match-percentage threshold for rename detection.
- Excluded directories for the relocation search, with common directories already added (
bin, obj, packages, node_modules, .git, .vs, etc.) and fully editable.
- Add '.tablayouts/' to '.gitignore' automatically on first folder creation (appends to an existing
.gitignore, optionally can create new one if it doesn't exist), updates automatically to match configured storage folder name.
- Default name for the first tab layout in a fresh solution.
- Tab layout name decorator glyphs each independently toggleable: Star, Hidden, Git Branch, Autosave, Last Saved, and Last Restored. All are shown by default except Last Saved and Last Restored. Disabling a glyph removes its visual prefix from the toolbar dropdown without affecting sorting or tracking behavior. Also can disable number of tabs and last saved time display, and enable an Unsaved Changes glyph shown on the toolbar when the open tabs (or their pinned states) differ from the selected tab layout (only compares against last saved or last restored tab layout, whichever is newest).
- Show Utilities sub-menu in Management menu toggle (default on). When turned off, the
Utilities sub-menu is hidden from the Management menu, while every Utilities command stays available from the Extensions > Simple Tab Saver menu on the Visual Studio menu bar.
- Session logging enable/disable, with a separate verbose toggle for low-level diagnostic output.
Utilities menu has an option to Export and Import all extension settings to/from JSON file.

The extension can also be fully operated via Extensions > Simple Tab Saver menu on the Visual Studio menu bar. The menu includes a Selected label showing which tab layout is currently selected, so the selection is visible even without the toolbar.

Simple Tab Saver toolbar buttons placement can be adjusted via Visual Studio's built-in Customize dialog. Width of the Tabs: dropdown can also be changed there.
Feedback
Feedback and bug reports are welcome via the Marketplace Q&A but are handled on a best-effort basis with no guarantees.
| |