Skip to content

fix(container): Beeper 4.3.123 never paints its first window + first-paint gate — v0.9.1 (#27) - #28

Merged
hamr0 merged 4 commits into
masterfrom
fix/first-paint-swiftshader
Sep 30, 2026
Merged

hamr0 merged 4 commits into
masterfrom
fix/first-paint-swiftshader

Conversation

@hamr0

@hamr0 hamr0 commented Sep 30, 2026

Copy link
Copy Markdown
Owner

Fixes #27.

Problem

On :latest (Beeper Desktop 4.3.123) the Beeper window is created but never mapped under Xvfb, so the login screen never renders and first-run noVNC login is impossible. The API still comes up, so the HEALTHCHECK and the MCP guard matrix passed and the weekly rebuild published it.

Fix

  • entrypoint.sh launches Beeper with --use-angle=swiftshader (SwiftShader ships inside the AppImage; no new packages). --disable-gpu / --disable-gpu-compositing do not help.

Gate

  • scripts/first-paint-check.sh boots the image on a fresh profile, reads the framebuffer over VNC from the host, and passes only on two consecutive samples of 1000+ colours (blank = 2, login screen ≈ 11,000).
  • Wired into mcp-test.yml and release.yml verify, plus a new verify-arm64 job on the native arm runner that publish waits on.
  • scripts/rfb.py: one RFB handshake shared by both VNC probes.

Release

Stamps 0.9.1 (PATCH).

Verification

  • Gate fails on current :latest (2 colours) and passes on an image built from this branch pinned to Beeper 4.3.123; also passes on 4.2.923.
  • node --test mcp/server.test.js: 48/48. asset-serve-check: pass.
  • Not run locally: mcp-guard-check.sh, vnc-auth-check.sh (CI runs both here). The verify-arm64 job has never run; it first runs on the v0.9.1 tag push.

🤖 Generated with Claude Code

https://claude.ai/code/session_01U1PKBQDukuTNc4Eak9icLz

hamr0 and others added 4 commits September 30, 2026 17:26
…window + first-paint gate (#27)

From Beeper 4.3.123 the renderer stalls on Chromium's default GL fallback
under Xvfb: the window is created but never mapped, so the login screen never
renders and first-run noVNC login is impossible. The API still comes up, so the
HEALTHCHECK and the MCP guard matrix passed and the weekly rebuild shipped it.

- entrypoint.sh: launch beepertexts with --use-angle=swiftshader
- scripts/first-paint-check.sh + vnc-paint-probe.py: boot the image on a fresh
  profile, read the framebuffer over VNC from the host, fail on a blank screen
- wire the gate into mcp-test.yml and release.yml verify
- docs: CLAUDE.md, PRD, CHANGELOG

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U1PKBQDukuTNc4Eak9icLz
…ed RFB handshake

Follow-up to the #27 fix from the self-review:

- first-paint-check.sh: pass needs two consecutive samples >= 1000 colours
  (a mid-paint frame no longer passes); a probe error is reported as such
  instead of "screen still blank"; unique container name + docker-assigned
  port so concurrent runs don't collide
- scripts/rfb.py: one RFB handshake shared by vnc-auth-probe.py and
  vnc-paint-probe.py (no behaviour change to the auth probe)
- release.yml: verify-arm64 job on the native arm runner runs the first-paint
  gate; publish and notify-failure wait on it (not yet executed)
- stamp 0.9.1: mcp/package.json, CHANGELOG, CLAUDE.md, PRD

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U1PKBQDukuTNc4Eak9icLz
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U1PKBQDukuTNc4Eak9icLz
…, merge duplicate Changed sections

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U1PKBQDukuTNc4Eak9icLz
@hamr0
hamr0 merged commit c4b316f into master Sep 30, 2026
3 checks passed
@hamr0
hamr0 deleted the fix/first-paint-swiftshader branch September 30, 2026 16:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Beeper 4.3.123 never paints first window headless (VPS): renderer alive, blank page, bootstrap stall

1 participant