A macOS menu-bar app that captures any game window or display via ScreenCaptureKit and applies real-time frame interpolation (e.g. 30 fps → 60+ fps) using Apple's on-device VideoToolbox ML models (VTLowLatencyFrameInterpolation). The output is rendered as a transparent, click-through overlay that sits precisely on top of the original window — no game modifications required.
- Frame interpolation — doubles (or triples/quadruples) the frame rate of any window using Apple's VideoToolbox neural interpolation model
- Transparent overlay — borderless, click-through window rendered with
AVSampleBufferDisplayLayerso the game remains fully interactive underneath - Auto-fallback — if a chosen processing resolution is unsupported on the current device, MetalDuck automatically steps down to the next lower resolution
- Device diagnostics — built-in diagnostics runner that tests model capabilities on your specific chip and generates a markdown report for GitHub issues
- Menu bar app — lives in the menu bar; no Dock icon, no interference with your workflow
- Content picker — uses
SCContentSharingPickerto visually select any window or display
| Requirement | Minimum |
|---|---|
| macOS | 26.0 |
| Xcode | 26.0 |
Frame interpolation uses
VTLowLatencyFrameInterpolation, available on Apple Silicon. On M1 Pro, only up to 720p processing resolution is supported by the model; higher resolutions fall back automatically.
cd MetalDuck
xcodebuild build -scheme MetalDuck -destination 'platform=macOS'Or open MetalDuck/MetalDuck.xcodeproj in Xcode and press Run.
On first launch MetalDuck will request Screen Recording permission. Grant it in System Settings → Privacy & Security → Screen Recording.
- Launch MetalDuck — a videogame controller icon appears in the menu bar.
- Click the icon → Preferences.
- Select a Capture Type (Window or Display) and pick your target.
- Set Mode to Frame Interpolation and choose a Processing Resolution (720p is currently the most tested).
- Click Start in the menu — the overlay appears on top of your window.
- To stop, click the menu bar icon → Stop.
| Resolution | Dimensions | M1 Pro |
|---|---|---|
| 360p | 640 × 360 | Supported |
| 720p | 1280 × 720 | Supported |
| 1080p | 1920 × 1080 | Unsupported (auto-fallback) |
| 1440p | 2560 × 1440 | Unsupported (auto-fallback) |
If the model fails to produce a frame within 5 seconds at the selected resolution, MetalDuck automatically falls back to the next lower resolution.
SCStream
└─ AsyncThrowingStream<CapturedFrame> (CaptureSession)
└─ AppCoordinator
└─ RealTimeFrameInterpolation (actor, optional)
└─ OverlayManager.enqueueBuffer()
└─ AVSampleBufferDisplayLayer (timed via CMTimebase)
Key components:
| File | Role |
|---|---|
App/AppCoordinator.swift |
Central singleton — owns capture, interpolation, overlay |
Capture/CaptureSession.swift |
SCStream → AsyncThrowingStream<CapturedFrame> |
Metal/RealTimeFrameInterpolation.swift |
VTLowLatencyFrameInterpolation actor |
Overlay/OverlayManager.swift |
Borderless NSWindow + AVSampleBufferDisplayLayer |
Diagnostics/DiagnosticsRunner.swift |
Device capability tests + markdown report generator |
Models/DeviceCapabilityDatabase.swift |
Community-sourced chip compatibility database |
MetalDuck includes a diagnostics tool to map which processing resolutions work on your chip. Run it via Preferences → Debug → Run Device Diagnostics. It will:
- Detect your chip, CPU cores, RAM, and macOS version
- Test each
ProcessingResolutionwith the VideoToolbox interpolation model - Query super-resolution scaler capabilities
- Generate a markdown report you can paste into a GitHub issue
This helps build the community compatibility database (Resources/DeviceCapabilities.json).
If you run the diagnostics on a chip that isn't in the database yet, please open a GitHub issue and paste the generated report. This data improves the resolution recommendations shown in Preferences for all users.
- Capture is fixed at 1920×1080 regardless of the target window size — some system APIs return incorrect dimensions for game windows.
- SCStream's capture buffer contains ~3% black padding on the right edge; MetalDuck clips this automatically using the content-width ratio computed on the first frame.
- Super-resolution (
VTLowLatencySuperResolutionScaler) on M1 Pro only supports 2× upscale at inputs ≤ 960×540. - Multipliers above 2× may introduce latency or quality artifacts; 2× is recommended.