Releases: nitlink-dev/nitlink
Release list
NitLink 1.1.1 rc2
NitLink 1.1.1
Maintenance release: the USB audio stutter fix promised in 1.1.0, an aspect-ratio option, and a clear answer when Windows blocks the card's audio.
Fixed
-
Audio stutter on USB cards. The audio router now runs event-driven on both WASAPI endpoints and keeps a small buffer between the capture card's clock and the playback device's clock, steering it with single-frame corrections that are inaudible. The previous pump polled on a timer, discarded the tail of any capture packet that did not fit the render buffer, and had no drift handling, which surfaced as periodic stutter, most audibly on the 4K S. Routing health (buffer fill, underruns, overruns, corrections) is logged every five seconds for diagnosis.
-
Silent NitLink when Windows blocks microphone access. The Windows Microphone privacy switch also blocks capture-card audio for desktop apps and reports it as a plain access denial. NitLink now names the switch in an on-screen notice instead of staying quiet.
New
-
The F1 panel is now a sidebar. It opens as a translucent strip on the right and the picture keeps playing beside it, so a setting can be changed while watching the result. The Position row on the Video tab cycles Right, Left, and Full, the previous whole-window panel;
panel_sideandpanel_widthinnitlink.jsonstore the choice. While a panel is open the desktop compositor handles the window (about one frame of extra latency, VRR paused), which is why the earlier panel covered the picture; closing it restores the direct path. The Ctrl+F3 HUD is redrawn in the same style: title band, plain-ink metrics that only take color when something degrades, amber sparklines, and the pipeline badges in the footer. -
Aspect ratio option.
Alt+A, the F1 panel, oraspect_ratioinnitlink.json. Auto shows the source at the ratio the card reports; 4:3, 16:9, 16:10, 21:9, or any customW:Hsqueezes or letterboxes the picture, which restores 4:3 consoles that a card delivers stretched inside a 16:9 frame; Stretch fills the window. Requested in #4.
Known issues
- The stutter fix is verified by counters on a 4K Pro and awaits confirmation on a 4K S. If you own a 4K S, the five-second
[NitLink/Audio] statslines in DebugView are the thing to report: underrun and overrun should stay at 0 and the slip counts should stay small.
Install
- Download
NitLink-1.1.1-win64.zipbelow. - Extract anywhere.
- Double-click
NitLink.exe. Windows SmartScreen may warn (the binary is not yet code-signed); click "More info" then "Run anyway".
Requirements: Windows 10 (1809+) or Windows 11, a DirectX 11 capable GPU, the Microsoft Edge WebView2 runtime, the VC++ 2015-2022 redistributable, and an Elgato 4K Pro, 4K S, or 4K X.
Attribution
Full third-party licenses in LICENSES.md. External research, protocol references, and code contributors in ACKNOWLEDGMENTS.md.
NitLink 1.1.0
NitLink 1.1.0
First feature release after the 1.0.0 release-candidate series. Native Elgato 4K X support, real GPU timing in the HUD, a low-latency present path that matches or beats the Elgato Capture Utility on a VRR display, true-HDR screenshots, and a capture color-range override.
New
-
Native Elgato 4K X support. Live source detection (resolution, refresh rate, HDR state, and console identity) read from the card's UVC Extension Unit over a held-handle path that never wedges the device. The window title surfaces the detected source the same way it does on the 4K Pro and 4K S. Addresses #2.
-
Low-latency mode (Alt+L). A present-on-arrival path paired with an ALLOW_TEARING swap chain and a VRR-aware present cadence. On a VRR display this engages variable refresh tear-free and brings end-to-end latency to parity with (and in measurement below) the Elgato 4K Capture Utility. On by default; toggle with Alt+L or the F1 settings panel.
-
Real GPU frame time in the HUD. A new
GPU N.N msfield driven by Direct3D 11 timestamp queries reports actual per-frame GPU work. It reads back a few frames late so it never stalls the pipeline, and showsGPU --when timestamp queries are unavailable. -
NIS fp16 half-precision path. The NVIDIA Image Scaling pass uploads its coefficients as R16 half-precision and runs in
min16float, lowering GPU cost on bandwidth-limited cards with no visible change in output. -
Capture color-range override (Alt+R). A three-state cycle: Auto / Full / Limited. Auto trusts the range Media Foundation reports, which is correct on all three Elgato cards; the manual states cover third-party cards that misreport their range. Each change shows a brief on-screen notice.
-
True-HDR screenshots. In HDR mode, Ctrl+S writes a scRGB FP16
.jxrsidecar alongside the shareable tonemapped-to-SDR.png. The.jxropens as real HDR in the Windows Photos app, preserving highlights and wide gamut. -
VRR present-pacing rework. The content-frame differ uses a tiled maximum-SAD detector, which correctly handles localized motion and 30fps-over-60Hz HDMI alternation that the previous whole-frame compare misread as duplicate frames. Addresses #1.
Changed
-
HDR source color is decoded from each card's reported range rather than per-card special cases, fixing washed-out or over-saturated HDR on some sources.
-
Audio routing works across format mismatches and playback device changes. The audio router now opens the playback endpoint through the Windows audio engine's format conversion, so a playback device with a different sample rate or channel layout (a 44.1 kHz headset, virtual surround) gets audio instead of silence. It also listens for endpoint changes: switching the default playback device, unplugging the card, or an in-place format change rebuilds the affected side on the worker thread instead of leaving NitLink mute until restart. Contributed by Nathan K. (#5).
Hardening
-
Capture, renderer, audio, and Discord paths received lifetime, concurrency, and error-handling work: Direct3D device-loss recovery, checked Direct3D and Media Foundation results, bounded Discord IPC reads, a tightened WebView2 navigation allow-list, and checked WASAPI results throughout the audio router.
-
Device-loss recovery retries. If the GPU goes away mid-session (driver reset, sleep/resume, a TDR), the renderer and its dependents rebuild when the device comes back, and recovery keeps retrying while the GPU is unavailable instead of freezing the window or exiting. Swap-chain resize failures caused by a lost device route into the same recovery. Verified against forced GPU resets.
-
The present loop never waits on the GPU. The frame differ's readback is non-blocking, so when the GPU is busy with other work (another application, or the desktop compositor) NitLink keeps its cadence instead of dropping to two thirds of the source rate.
-
Exit can no longer hang on Discord. A stalled Discord Rich Presence connection is cancelled on shutdown so NitLink always closes promptly, and partially delivered IPC frames no longer park the worker.
-
Low-Latency Mode wording. The F1 panel, README, and config comments now describe what turning Low-Latency Mode off actually does: frames are held for up to one refresh before present. The present path is tearing-allowed in both states, and on a VRR display neither state shows tearing.
Known issues
- Audio routing can stutter on USB cards. Reported on the 4K S; the same mechanism applies to any USB card. NitLink copies capture audio to the playback device without compensating for clock drift between the two devices, which surfaces as periodic stutter, most noticeably over USB. A fix is in progress for 1.1.1. Workaround: send game audio to the TV or receiver over the card's HDMI passthrough and mute NitLink's audio; video is unaffected.
Install
- Download
NitLink-1.1.0-win64.zipbelow. - Extract anywhere.
- Double-click
NitLink.exe. Windows SmartScreen may warn (the binary is not yet code-signed); click "More info" then "Run anyway".
Requirements: Windows 10 (1809+) or Windows 11, a DirectX 11 capable GPU, the Microsoft Edge WebView2 runtime, the VC++ 2015-2022 redistributable, and an Elgato 4K Pro, 4K S, or 4K X.
Attribution
Full third-party licenses in LICENSES.md. External research, protocol references, and code contributors in ACKNOWLEDGMENTS.md.
NitLink 1.0.0-rc4
NitLink 1.0.0-rc4
Fourth public release candidate. Direct HDR auto-detection on the 4K S, live latency measurement replaces baked HUD constants, window title now surfaces source + resolution + effective HDR state.
New
-
4K S HDR auto-detection. Reads the live HDR Static Metadata InfoFrame directly from the card's MCU via vendor HID. When the source flips HDR on or off (e.g. PS5 Settings → Screen and Video → HDR), NitLink picks up the change on the next reconcile and swaps capture format accordingly. The 4K Pro's existing IKsPropertySet detection is unchanged.
-
4K S Alt+H is now a real capture-format swap. With HDR engaged the 4K S captures at 1080p P010 (BT.2020 PQ); with HDR off it captures at the user's preferred resolution as NV12 with the card's internal HDR-to-SDR tonemap. The USB bandwidth can't fit 4K HDR, so the trade-off is explicit and runtime-flippable.
-
Source identifier in the window title.
- 4K S:
NitLink - PlayStation 5 [HDR]/[SDR](HDMI Source Product Descriptor InfoFrame read from the card). - 4K Pro:
NitLink - 3840x2160 @ 60Hz [HDR]/[SDR](resolution + fps from the Elgato custom property set). - The HDR/SDR suffix reflects the renderer's effective mode, not the capture format: honest about what the user actually sees.
- 4K S:
-
HUD "APP INGEST" replaces baked-constant TOTAL LATENCY. The HUD's latency field used to display
16 + frame_capture + 8where16and8were tuned constants from a single test rig. The new field measures actual card-driver-to-app delivery time viaMFSampleExtension_DeviceTimestamp. When the driver doesn't populate it (some non-Elgato cards), the field reads 0. End-to-end photon-to-photon latency stays out of NitLink's measurement scope; "APP INGEST" is what NitLink can measure honestly. -
HDR-capable source heuristic as fallback. When direct HDR signal detection isn't available (HID error, MCU non-responsive, non-Elgato cards), NitLink falls back to a source-identifier lookup: known HDR-capable consoles (PS5) default the pipeline to HDR. User can override with Alt+H. Disable with
hdr_auto_from_source = falseinnitlink.json.
Install
- Download
NitLink-1.0.0-rc4-win64.zipbelow. - Extract anywhere.
- Double-click
NitLink.exe. Windows SmartScreen may warn (binary is not yet code-signed); click "More info" then "Run anyway".
Requirements: Windows 10 (1809+) or Windows 11, DX11-capable GPU, Microsoft Edge WebView2 runtime, VC++ 2015-2022 redistributable, an Elgato 4K Pro, 4K S, or 4K X (4K X uses generic Media Foundation path; vendor controls land in 1.1).
What's still coming in 1.1
- VRR Present Pacing differ rework with Media Foundation timestamp as a second signal. Addresses #1.
- Native 4K X support via Elgato's UVC Extension Unit protocol. Addresses #2.
- Source identifier coverage expansion (Xbox Series X|S, Switch 2, PC).
- Audio endpoint matching with Wave Link active.
Feedback
In-app "Send feedback" link in the F1 settings panel opens a Tally form. Tested reports route to a Discord webhook for fast turnaround.
Attribution
Full third-party licenses in LICENSES.md. External research and protocol references in ACKNOWLEDGMENTS.md.
NitLink 1.0.0-rc3
NitLink 1.0.0-rc3
Third public release candidate. Manual capture format override, false-positive fixes, and quality-of-life polish since rc2.
Bug fixes
-
Placeholder false positives on dark intro cards. The "no signal" detector matched dark studio-logo intro cards (Star Wars Jedi: Lucasfilm card and similar) whose 9-zone luma signature is pixel-identical to the baked Elgato placeholder. Tightened the per-zone tolerance from 8 to 4 and the streak length from 5 to 15 frames, then added a motion-recency gate that suppresses confirmation when the source has produced fresh content or motion in the last 5 seconds. Real placeholder is preceded by silence; intro cards are preceded by animation.
-
1080p override silent downgrade on Elgato 4K Pro. The 4K Pro's Media Foundation driver accepts a 1920x1080 RGB32
SetCurrentMediaTyperequest with S_OK and then silently delivers 4K BGRA. The override appeared to take effect but the user's resolution choice was discarded. A post-negotiation guard now reads back the actual dimensions and fps, and rejects the attempt if the driver substituted different values. The fallback path activates and a toast surfaces the format change. Verified on hardware via a device-switch repro (4K S 1080p override carried over to 4K Pro). -
Cascade dropdowns offered framerates not valid for the selected resolution.
uniqueFps()previously returned the union of every framerate across the whole device when Resolution was Auto, which surfaced unreachable combinations like 4K@120fps on the 4K Pro. The filter is now strict: framerate options only appear when a resolution is selected, and only contain framerates that have a renderable format at that exact resolution. The same strict filter applies to the format dropdown. -
Cascade could send malformed
0x0 @ Nfpsoverrides to the backend. Resolution=Auto with a specific framerate is rarely achievable on real hardware. The handler now resets the whole override to Auto when Resolution is set to Auto. Switching to a new resolution validates persisted framerate and format against the new resolution, resetting either axis if the prior choice is no longer valid. -
VRR pacing log: spurious fps spike after HDR/SDR reconcile.
hdmiFpscould read ~4.2 billion in one sample immediately after an HDR/SDR reconcile, caused by unsigned-subtract underflow when the FrameBuffer's monotonic frame counter restarted from zero. The sample now treats counter resets as "no useful delta this window" and writes 0 instead.
New
-
F1 Source picker: manual capture format override. Cascade dropdowns for Resolution, Framerate, and Format inside the Source popover. Each dropdown is data-driven from the live device's media-type list and filtered to renderable formats (P010, NV12, BGRA). Picking Auto on any axis preserves automatic negotiation for that dimension. If the chosen combination is not achievable on the live source, the pipeline falls back to automatic negotiation and surfaces a toast: "Capture format unavailable, reverted to automatic." Persisted across launches in
nitlink.json. -
Screenshot saved toast. Ctrl+S now displays a toast showing the saved filename. Click the filename to open the containing folder in Windows Explorer with the file pre-selected. Auto-dismisses after 3.5 seconds.
-
HDR auto-detect availability notice. The F1 Source picker shows a note under the HDR toggle when the active card does not expose Elgato's HDR InfoFrame property (4K S and generic Media Foundation devices): "HDR auto-detect unavailable on this card. Toggle manually with Alt+H." Makes it clear that the HDR toggle is the only way to switch the pipeline on those cards.
Install
- Download
NitLink-1.0.0-rc3-win64.zipbelow. - Extract anywhere.
- Double-click
NitLink.exe. Windows SmartScreen may warn (binary is not yet code-signed); click "More info" then "Run anyway".
Requirements: Windows 10 (1809+) or Windows 11, DX11-capable GPU, Microsoft Edge WebView2 runtime, VC++ 2015-2022 redistributable, an Elgato 4K Pro, 4K S, or 4K X (4K X uses generic Media Foundation path; vendor controls land in 1.1).
What's still coming in 1.1
- VRR Present Pacing differ rework with Media Foundation timestamp as a second signal. Addresses #1.
- Native 4K X support via Elgato's UVC Extension Unit protocol. Addresses #2.
- Cam Link 4K validation pass.
Feedback
In-app "Send feedback" link in the F1 settings panel opens a Tally form. Tested reports route to a Discord webhook for fast turnaround.
Attribution
Full third-party licenses in LICENSES.md. External research and protocol references in ACKNOWLEDGMENTS.md.
NitLink 1.0.0-rc2
NitLink 1.0.0-rc2
Second public release candidate. Two changes since rc1.
Bug fixes
- Audio: correct endpoint match on Wave Link systems. rc1 matched audio endpoints by the generic
"Elgato"substring, which could pick a Wave Link mixer channel (Headphones Mix, Voice Chat, Stream Mix, etc.) instead of the hardware capture audio. The match now uses the selected video device's full name. Fixes #3. Reported by u/XSilverlink.
New
- F1 Source picker shows the negotiated capture format. The Signal panel now displays the live resolution, fps, and pixel format (NV12, P010, BGRA, etc.) read from the active capture device. Useful for confirming what NitLink negotiated without having to read DebugView.
Install
- Download
NitLink-1.0.0-rc2-win64.zipbelow. - Extract anywhere.
- Double-click
NitLink.exe. Windows SmartScreen may warn (binary is not yet code-signed); click "More info" → "Run anyway".
Requirements: Windows 10 (1809+) or Windows 11, DX11-capable GPU, Microsoft Edge WebView2 runtime, VC++ 2015-2022 redistributable, an Elgato 4K Pro or 4K S.
What's still coming in 1.1
- VRR Present Pacing differ rework (multi-zone hashing + Media Foundation timestamp as a second signal) — addresses #1
- Native 4K X support via Elgato's UVC Extension Unit protocol — addresses #2
- Manual resolution / fps / format override dropdowns in the Source picker
Feedback
In-app "Send feedback" link in the F1 settings panel opens a Tally form. Tested reports route to a Discord webhook for fast turnaround.
Attribution
Full third-party licenses in LICENSES.md. External research and protocol references in ACKNOWLEDGMENTS.md.
NitLink 1.0.0-rc1
NitLink 1.0.0-rc1
First public release candidate. Built and hardware-tested on the Elgato 4K Pro (PCIe) and Elgato 4K S (USB) against PS5 on an LG C3 OLED desktop setup and an Acer Nitro 5 laptop.
Highlights
- Real HDR10 capture: native 10-bit P010 (BT.2020 PQ) through an R10G10B10A2 HDR10 swap chain. Zero color conversion. 4K Pro auto-detects HDR via the Elgato InfoFrame property; 4K S uses the
hdr_enabledconfig. - 4K S real HDR: reverse-engineered vendor HID tone-map control, paired with the negotiated capture format (OFF for P010, ON for NV12).
- Low end-to-end latency, measured photon-to-photon: 19.6 ms ± 0.9 ms on the 4K Pro, 33.2 ms ± 0.5 ms on the 4K S. NitLink itself contributes ~1 ms (PresentMon-verified).
- VRR Present Pacing: G-Sync / FreeSync follows the source's real unique-frame rate. Off by default; opt in from the F1 settings panel on a VRR display.
- Multi-device source picker in the F1 sidebar — switch capture devices at runtime without restarting. Strict explicit switching with safe rollback on failure.
- Smart signal handling: format-tagged placeholder fingerprints with temporal-stability gating. Brief HDMI handshake windows (PS5 boot logo, source switch, SDR ↔ HDR) hold the last good frame instead of flashing the card's NO SIGNAL placeholder.
- NVIDIA Image Scaling (compute-shader spatial upscale + sharpening).
- WASAPI audio routing, borderless fullscreen + picture-in-picture, Discord Rich Presence.
Install
- Download
NitLink-1.0.0-rc1-win64.zipbelow. - Extract anywhere.
- Double-click
NitLink.exe. Windows SmartScreen may warn (binary is not yet code-signed); click "More info" → "Run anyway".
Requirements: Windows 10 (1809+) or Windows 11, DX11-capable GPU, Microsoft Edge WebView2 runtime, VC++ 2015-2022 redistributable, an Elgato 4K Pro or 4K S.
Feedback
In-app "Send feedback" link in the F1 settings panel opens a Tally form.
Attribution
- Matt Pettineo (TheRealMJP): Catmull-Rom resampling reference (MIT).
- Brandon (13bm), elgato4k-linux: 4K S HID protocol reference. NitLink's HID implementation in
src/capture/elgato_hid_4ks.{h,cpp}is independent, written from scratch against the Win32 SetupAPI / HID Class API. SeeACKNOWLEDGMENTS.mdanddocs/4ks-hdr-tonemap.md.
Full third-party licenses in LICENSES.md.