Mirror is an open-source extension designed to provide fire-and-forget extension synchronization across any VS Code-compatible IDE, including Cursor, Windsurf, VS Code OSS, VSCodium, and others.
Its goal is to replicate the simplicity of VS Code Settings Sync but in a completely IDE-agnostic, self-hostable, and privacy-friendly way.
Mirror keeps your development environment consistent by automatically synchronizing your installed extensions across multiple machines and editors through a single profile source—either local file mode or cloud mode (GitHub Gist or any raw URL).
- Cursor
- Windsurf
- Code OSS
- VSCodium
- Any editor exposing the VS Code API and CLI (
--install-extension)
1. File Mode:
- Profile stored locally as
extensions.txt - User selects any save location (Google Drive, Dropbox, OneDrive, etc.)
- Mirror remembers the path and listens for file changes
2. Cloud Mode:
- Profile stored remotely at a raw URL
- Supports GitHub Gist, S3, Supabase storage, or any HTTP endpoint
- Ideal for "VS Code-like" fire-and-forget syncing
Mirror silently syncs your environment when the IDE opens.
Run sync anytime using: Mirror: Sync Extensions
If enabled, Mirror removes extensions not present in your profile.
Push your current extension list to your cloud profile (Gist API).
- No proprietary backend
- No login required
- User owns and controls the data
- Install Mirror
- Run command:
Mirror: Export Extensions to File - Choose a save location (e.g., inside Google Drive, Dropbox, or Syncthing folder)
- Mirror will save your extensions and configure itself automatically
On another machine:
- Install Mirror
- Open Settings (JSON)
- Set
"mirror.filePath"to the same synced file path - Restart the IDE – Mirror will auto-sync
- Install Mirror
- Create a GitHub Personal Access Token with
gistscope - Run command:
Mirror: Initialize Cloud Profile - Enter your token when prompted
- Mirror creates a private Gist and configures itself
On another machine:
- Install Mirror
- Open Settings (JSON)
- Copy the
remoteUrlfrom your first machine - Paste it into
"mirror.remoteUrl" - Set
"mirror.source": "cloud" - Restart the IDE – Mirror will auto-sync
| Command | Description |
|---|---|
Mirror: Sync Extensions |
Pull profile → install/uninstall → sync environment |
Mirror: Export Extensions to File |
Save local extensions to .txt and enable file mode |
Mirror: Initialize Cloud Profile |
Create remote profile (Gist) and enable cloud mode |
Mirror: Push Current Extensions to Cloud |
Overwrite remote list with current extensions |
mirror.source– Set to"file"mirror.filePath– Absolute path to your extensions filemirror.autoWatchFileChanges– Auto-sync when file changes (default:true)
mirror.source– Set to"cloud"mirror.remoteUrl– Raw URL of your extension listmirror.githubToken– GitHub token for pushing (optional)mirror.gistApiUrl– API URL for updating Gist (auto-configured)
- Install Mirror on Machine A
- Run
Mirror: Export Extensions to File - Save to
~/Google Drive/mirror/extensions.txt - On Machine B, install Mirror
- Set
mirror.filePathto the same Google Drive path - Extensions sync automatically whenever the file changes
- In Cursor, run
Mirror: Initialize Cloud Profile - Copy the
remoteUrlfrom Cursor's settings - In Windsurf, install Mirror
- Set
mirror.remoteUrlto the same URL - Set
mirror.sourceto"cloud" - Both editors now share the same extension list
- Create a shared GitHub Gist or S3 bucket with your team's extension list
- Share the raw URL with your team
- Everyone sets
mirror.remoteUrlto that URL - The entire team stays in sync
- Read local extensions – Using
vscode.extensions.all - Load profile – From file (local) or URL (cloud)
- Calculate differences – What to install/uninstall
- Apply changes – Using editor's CLI (
--install-extension,--uninstall-extension) - Notify user – Show progress and prompt to reload if needed
- No telemetry – Mirror doesn't collect or send any data
- No external services – Except GitHub API if you use Gist mode
- Full control – You own your extension list
- Open source – Fully auditable code
No, Mirror only syncs extensions. Use your editor's built-in settings sync or a dotfiles repo for settings.
Yes, as long as the extension IDs are accessible via the editor's CLI.
Use file mode with your preferred sync solution (Dropbox, Syncthing, etc.), or host your extension list anywhere that provides a raw URL (S3, Firebase Storage, etc.).
File mode works offline if the file is locally accessible. Cloud mode requires internet access.
Currently, Mirror syncs all extensions. You can manually edit your profile file to exclude extensions.
Contributions are welcome! Please open issues or pull requests on GitHub.
MIT License – see LICENSE file.
If you encounter issues or have questions:
- Open an issue on GitHub
- Check the documentation
Enjoy seamless extension sync across all your VS Code forks!
{ // Source type: "file" for local file, "cloud" for remote URL "mirror.source": "file", // Automatically sync when the IDE starts "mirror.autoSyncOnStartup": true, // Remove extensions not in the profile "mirror.pruneExtraExtensions": false, // FILE MODE "mirror.filePath": "/path/to/extensions.txt", "mirror.autoWatchFileChanges": true, // CLOUD MODE "mirror.remoteUrl": "https://gist.githubusercontent.com/.../extensions.txt", "mirror.githubToken": "ghp_...", // Optional, for push "mirror.gistApiUrl": "https://api.github.com/gists/..." // Auto-set by init }