

Windows compatibility for RawStdout source — the fd-level pipe intercept now works on Windows via P/Invoke into ucrtbase.dll (_dup, _dup2, _pipe, _read, _write, _close). This works because ucrtbase.dll is the Universal CRT shared across Unity's native engine and all managed code in the process.
Silent failure mode: If the Unity build were statically linked against the CRT (extremely unlikely on modern Unity 6), _dup2 would still succeed but Unity's native writes would go to a separate fd table, never passing through the pipe. The plugin would start cleanly and BepInEx-sourced lines would still appear in Discord — but world save lines and other native stdout output would be silently absent. You would only notice by their absence. On Linux this concern does not apply.
Source setting: BepInEx (default), Console, or RawStdoutBepInEx — original ILogListener approach, unchangedConsole — intercepts managed Console.Out via Console.SetOut()RawStdout — experimental, Linux only; intercepts stdout at the OS file descriptor level using pipe()+dup2(), capturing world saves, ZDO counts, and all native stdout writes that bypass BepInEx entirely. Falls back to BepInEx source on init failure.