🌀 WindowPortal
Your portal to any external window - Stream live applications directly inside VS Code
WindowPortal transforms your VS Code workspace by bringing external applications right into your editor. Monitor Android emulators, preview browsers, watch video players, or keep an eye on any application window — all without leaving your IDE. Perfect for developers who want to maximize screen real estate while maintaining full visibility of their tools.
Note: WindowPortal supports Windows, macOS, and Linux!
Security & Privacy (Quick Note)
- Runs local native tools: This extension invokes platform-specific native tools (Win32
PrintWindow on Windows, screencapture on macOS, and ffmpeg/wmctrl on Linux) locally to list windows and capture frames.
- No uploads or telemetry: Frames and window data stay on your machine and are rendered locally inside VS Code.
✨ Features
🎥 Real-Time Streaming
Capture and stream any window with live MJPEG encoding. Watch your applications update in real-time with minimal latency.
📺 Activity Bar Integration
Access WindowPortal directly from the Activity Bar. Browse all available windows at a glance from a dedicated sidebar.
⚡ Performance Profiles
Choose from four FPS profiles (Low 10-15fps, Medium 20-30fps, High 30-60fps, Max refresh rate) and resolution modes (Scaled/Native) to balance quality and performance.
🔍 Interactive Controls
Full pan and zoom support with mouse wheel scrolling and drag-to-reposition. Includes dedicated zoom buttons (in/out/reset/fit) that auto-hide when not in use.
🎯 One-Click Operation
Start streaming any window with a single click. Each window has its own Start/Stop button for instant control.
📊 Live Feedback
Real-time dimension overlay shows current window size. Auto-adjusts when windows are resized.
🖥️ Non-Intrusive Design
Streams open in separate Column Two panels, keeping your code editor clean and focused while monitoring external applications.
📋 Prerequisites
WindowPortal relies on native integrations and works across all major OS platforms:
- Windows: Windows 10/11
- macOS: macOS 10.15+ — No special permissions needed. WindowPortal uses
screencapture, a privileged macOS system binary, to capture windows without requiring VS Code to hold a Screen Recording entitlement.
- Linux: X11 environment (Wayland is only supported if running in XWayland compatibility layer)
System Dependencies
Windows: No external dependencies required. Capture is handled natively via Win32 PrintWindow.
macOS: No external dependencies required. Capture is handled natively via the built-in screencapture binary.
Linux: The following tools must be installed and accessible in your system PATH:
ffmpeg — Required for video capture and streaming
wmctrl — Window listing and management
xwininfo — Window geometry information
xrandr — Display refresh rate detection
On Debian/Ubuntu:
sudo apt install ffmpeg wmctrl x11-utils x11-xserver-utils
On Arch Linux:
sudo pacman -S ffmpeg wmctrl xorg-xwininfo xorg-xrandr
🚀 Installation
From VS Code Marketplace
Search for "WindowPortal" in the VS Code Extensions view (Ctrl+Shift+X) and click Install.
From VSIX File
- Download the latest
.vsix file from Releases
- Open VS Code
- Open the Extensions view (
Ctrl+Shift+X)
- Click the
... menu at the top of the Extensions view
- Select Install from VSIX...
- Choose the downloaded
.vsix file
- Reload VS Code
🏃 Usage
- Click the WindowPortal icon in the Activity Bar (left sidebar)
- The sidebar displays all available application windows
- Configure streaming settings:
- Resolution: Choose between Scaled (≤1280x720) or Native (full resolution)
- FPS Profile: Select Low (10-15), Medium (20-30), High (30-60), or Max (refresh rate)
- Click ▶ Start button next to any window to begin streaming
- The window opens in a new panel (Column Two)
- Click ⏹ Stop to end streaming
Method 2: Command Palette
- Open Command Palette (
Ctrl+Shift+P)
- Type and select:
- WindowPortal: Open Window Viewer - Main streaming command
- WindowPortal: Diagnose Environment - Check system dependencies
Interactive Controls
When streaming a window:
- Zoom In - Click
+ button or scroll up with mouse wheel
- Zoom Out - Click
− button or scroll down with mouse wheel
- Reset Zoom - Click
100% button to return to original size
- Pan - Click and drag the window to reposition
- Dimensions - Live window size displayed in bottom-left corner
⚙️ Configuration
Settings are configured per-stream in the sidebar panel:
| Setting |
Options |
Description |
| Resolution |
Scaled, Native |
Scaled limits to 1280x720 for performance; Native captures full resolution |
| FPS Profile |
Low, Medium, High, Max |
Controls frame rate: Low (10-15fps), Medium (20-30fps), High (30-60fps), Max (display refresh rate) |
💡 Tips & Best Practices
- 🔧 Sidebar Width: Drag the sidebar edge to increase width if window titles are truncated
- ⚡ Performance: Use "Scaled" resolution and "Medium" FPS for better performance on most systems
- 🎮 Gaming/Video: Use "Native" resolution and "High" or "Max" FPS for smooth playback
- 💾 Resource Usage: Stop streaming when not needed to free up system resources
- 🖥️ Multi-Monitor: Works with windows on any monitor in your setup.
🔧 Troubleshooting
macOS: First frame takes 1-2 seconds to appear
This is expected. On the first stream, the extension resolves the target window's CGWindowID via a Swift one-liner (~1-2s compile time). Subsequent frames stream at the configured FPS after that.
macOS: Stream shows the wrong window or a black region
- Ensure the target window is visible and not minimized.
- Open View → Output in VS Code, select Window Embedder from the dropdown, and check for
screencapture errors.
- If
CGWindowID resolution fails (logged as "not found, using -R fallback"), the extension falls back to coordinate-based capture which may capture a larger region. Try restarting the stream.
"No windows found"
- Linux: Ensure
wmctrl is installed (wmctrl -l). Check that windows are running on X11, not Wayland.
- macOS: Ensure VS Code has "Screen Recording" and "Accessibility" permissions under System Settings > Privacy & Security.
"Command failed" or streaming errors
- Run WindowPortal: Diagnose Environment command from the palette.
- Linux only: Verify
ffmpeg is installed and accessible in your terminal (ffmpeg -version).
Black screen in streaming panel
- The window may be minimized, hidden, or offscreen.
- On macOS, check the Window Embedder output panel for
screencapture errors.
- Ensure the target window still exists and is not occluded by a full-screen app.
- Try stopping and restarting the stream.
- Lower the FPS profile to "Medium" or "Low"
- Use "Scaled" resolution instead of "Native"
- Close other resource-intensive applications
📝 License
Copyright (c) 2026 Shashi Sharma. All Rights Reserved.
This extension is free to use for personal and internal business purposes.
💖 Support
If you find WindowPortal useful, consider supporting the project:
Contribute / Support the project →
❓ FAQ
Q: Is this extension free to use?
A: Yes! WindowPortal is free to download and use for personal and internal business purposes.
Q: Why is this not open-source?
A: This extension uses a proprietary license to protect the intellectual property while still allowing free use. Future commercial licenses may be offered.
Q: Does this work on Windows or macOS?
A: Yes! As of our latest update, WindowPortal natively supports Windows, macOS, and Linux X11 environments.
Acknowledgments
Built with:
- VS Code Extension API
- FFmpeg and MJPEG processing
- Cross-platform native shell scripting