Repository navigation
feat(doctor): warn when an HTTP deployment silently disables H.264 - #491
Merged
Merged
Conversation
ssl.provider 'none' serves the viewer over http://, and Chrome exposes the WebCodecs VideoDecoder only on secure origins — so the codec probe reports 'WebCodecs API not available' and every session falls back to JPEG/WebP stills, re-encoding damaged regions from scratch each frame instead of encoding inter-frame change. The server-side encoder is fine; it never gets asked for video mode. Nothing surfaced this. The deploy is green, sessions work, and the operator's experience is 'the desktop feels laggy' — a long way from 'ssl.provider is none'. It was documented in configuration.md and architecture.md, in the SSL and streaming sections, which is not where someone choosing 'no domain' is reading. The H.264 work in #477/#478 therefore does nothing at all for any domain-less deployment, and there was no way to find that out short of reading the browser console. warn rather than fail: HTTP is a supported deployment, just a slower one. The message also names the port-forward that makes H.264 testable without a domain, since localhost counts as a secure origin. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 1, 2026
Merged
7174Andy
added a commit
that referenced
this pull request
Sep 8, 2026
Release prep. publish-pip.yml's version guardrail rejects a tag whose version does not match pyproject.toml, so the bumps land on main before the release tags are cut. Allocator and client stay in lockstep at 0.4.0 as they have since 0.1.0; the CLI is versioned independently and goes to 0.3.0. The CLI's allocator pin is raised to >=0.4.0 this time: the CLI re-exports MachineConfig, whose ami_id default became empty (= resolve the per-region Deep Learning Base AMI, #489) in allocator 0.4.0. An older allocator would silently reintroduce the stale hardcoded us-west-2 AMI default that doctor's #490 fallback logic assumes gone. CHANGELOG (CLI): new 0.3.0 section (#484, #485, #490, #491, #498), and a backfilled 0.2.0 section — #481 tagged 0.2.0 without adding one (#467, #472, #474, #479). Also: README Docker <version> example moved to 0.4.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
7174Andy
added a commit
that referenced
this pull request
Sep 8, 2026
Release prep. publish-pip.yml's version guardrail rejects a tag whose version does not match pyproject.toml, so the bumps land on main before the release tags are cut. Allocator and client stay in lockstep at 0.4.0 as they have since 0.1.0; the CLI is versioned independently and goes to 0.3.0. The CLI's allocator pin is raised to >=0.4.0 this time: the CLI re-exports MachineConfig, whose ami_id default became empty (= resolve the per-region Deep Learning Base AMI, #489) in allocator 0.4.0. An older allocator would silently reintroduce the stale hardcoded us-west-2 AMI default that doctor's #490 fallback logic assumes gone. CHANGELOG (CLI): new 0.3.0 section (#484, #485, #490, #491, #498), and a backfilled 0.2.0 section — #481 tagged 0.2.0 without adding one (#467, #472, #474, #479). Also: README Docker <version> example moved to 0.4.0. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
lablink doctornow warns when the deployment will serve the viewer over plain HTTP,because that silently disables H.264 video streaming.
Chrome exposes the WebCodecs
VideoDecoderonly on secure origins, so onhttp://theviewer's codec probe reports
WebCodecs API not availableand negotiation falls back toJPEG/WebP stills — re-encoding damaged regions from scratch every frame instead of
encoding inter-frame change. The server side is fine:
-videoCodec automakes KasmVNCadvertise H.264 and the encoder works. The browser declines it.
Why a check rather than more docs
It is documented —
docs/configuration.md:313anddocs/architecture.md:254, under SSLand streaming. But nothing in the deploy path says it, so the H.264 work in #477/#478 does
nothing for any domain-less deployment and there was no way to find that out short of
reading the browser console. What reaches an operator is "the desktop feels laggy", which
is a long way from "
ssl.provideris none".Found while diagnosing a real IP-only deployment where exactly this was happening.
Behaviour
ssl.providernone, or unsetletsencrypt,cloudflare,acmwarn, not fail. HTTP is a supported deployment, just a slower one; failing preflight
over a performance cliff would block a legitimate config. One of the tests asserts that
explicitly, so a later edit can't quietly promote it to a failure.
Testing
Six new cases: HTTP warns and names the workaround, the three HTTPS providers pass, a
missing
sslsection is treated as HTTP, and the warn-not-fail contract is pinned.Related
leaves NVENC unverified on a native-Linux GPU VM (it was validated on WSL2, which fell
back to software x264); the port-forward in this message is what makes that testable on
an IP-only deployment.
Path B operator actually chooses HTTP. Path B users never run
lablink doctor, so bothare needed.