How to get sharp text from a KVM video stream

A KVM stream that looks fine for a desktop wallpaper can turn a terminal into a smear. Most of that is fixable once you know which part of the pipeline is responsible.

Where the softness comes from

Four things stand between the target’s frame buffer and your eyes.

The encoder’s mode. Many devices default to a “smart” encoder mode that reduces quality on content it judges static, on the theory that nobody is looking closely at a screen that is not changing. A KVM screen is almost always static and you are almost always looking closely. Switching to normal mode stops the encoder economising on the thing you care about.

Keyframe interval. Every keyframe re-encodes the whole picture and costs many times the bits of an ordinary frame. On a still screen, ordinary frames are nearly free, so a long interval spends the budget on quality instead of repetition. A short interval helps only when frames are dropping.

Chroma subsampling. The capture chips in these devices encode 4:2:0, which stores colour at half resolution in each direction. Coloured text on a coloured background keeps slightly soft edges at any bitrate. This is why a lossless protocol like VNC will always look crisper on syntax-highlighted code. Nothing on the client can change it.

Scaling. If the stream is 1920×1080 and the window shows it at 87%, every pixel is interpolated. Browsers use bilinear filtering, which blurs fine strokes. A native client can use a better filter, and can avoid the problem entirely by showing the picture at exactly one source pixel per screen pixel.

What to change on the device

For a GL.iNet Comet, KVM Remote’s Sharp Text preset sets a 20 Mb/s ceiling, 30 frames a second, a keyframe every 240 frames and normal encoder mode. Maximum Quality keeps the same values at 24 frames a second. Smooth Motion shortens the keyframe interval and raises the frame rate to 60, which is the right choice for scrolling and animation and the wrong one for text. Low Bandwidth is for a VPN or a slow link: 2 Mb/s, 15 frames a second, smart mode, more error correction.

PiKVM exposes similar controls in its own web interface; KVM Remote receives whatever the device is configured to send.

What to change on the client

Open the statistics overlay in the console. It shows resolution, frame rate, bitrate against the configured ceiling, loss, jitter, codec, and whether scaling is pixel-exact. Two readings matter most.

If bitrate is far below the ceiling on a clean link, the encoder is the limit. Choose Sharp Text, or on another device turn off any smart or adaptive quality option.

If scaling reads resampled, the picture is being interpolated. Choose Pixel Perfect to resize the window so one source pixel maps to one screen pixel. If the window cannot be that large, KVM Remote uses Lanczos resampling, which keeps strokes noticeably cleaner than the bilinear filter a browser canvas applies. At exact integer magnifications it uses nearest-neighbour so that a 2× view stays crisp.

When it still looks soft

Check for packet loss in the overlay. Automatic error correction follows measured loss, but on a very lossy path the fix is the network, not the encoder. Check the target’s own display scaling: a HiDPI target rendering at 200% sends the KVM a picture that is already large and soft. And accept that 4:2:0 colour will never match a lossless desktop protocol on coloured text; for a long editing session, a plain colour scheme helps more than any bitrate.

Read what an IP KVM is for the trade-offs that come with hardware access, or see which devices expose encoder controls.