Input tarpitting fixes:
- terminal.ts: batch stdin writes with 10ms coalescing window (flushes
immediately for large payloads like paste), replacing per-keystroke
WebSocket messages with fewer, larger frames
- server.go: replace per-message time.After() with a reusable timer to
eliminate GC pressure from repeated key input
- server.go: coalesce queued stdin writes (up to 4KB) into a single PTY
write to reduce syscall overhead
Screenshot/rendering pipeline optimizations:
- tracker.go: stop forcing empty cells to space; let exporters decide
what to render, drastically reducing work for mostly-blank terminals
- tracker.go: use clear() for dirty map instead of delete-in-loop
- svg_exporter.go: skip visually empty cells (blank glyph, default BG,
no reverse/underline); still render background rects for colored or
reverse-video cells
- png_exporter.go: add color parsing cache to avoid redundant hex
parsing per cell; add empty cell fast-path; short-circuit blend math
for coverage 0 and 255
Dashboard thumbnail concurrency:
- server.go: replace single-flight screenshot fetching with limited
parallelism (2-4 concurrent requests based on hardwareConcurrency)
so large dashboards with many tiles update faster
Also fixes typo in dashboard JS (tetagBySlug -> etagBySlug) that
silently broke ETag caching for screenshot refreshes.
Bumps version to 1.3.32.
Introduce VERSION as the app version source of truth and add make bump-patch to increment VERSION, commit, and create a matching vX.Y.Z tag.
Wire VERSION into build outputs by injecting it into webterm.Version for make build-go and Docker image builds, and include VERSION in Docker build context.
Also remove the visible dashboard container count subtitle while keeping count updates in browser console logs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>