Commit Graph
4 Commits
Author SHA1 Message Date
rmancinasandClaude Opus 5 88be2bf867 fix(http): 400 on malformed JSON body instead of 500
Build and Deploy Remote Control Support / Test (push) Successful in 11s
Build and Deploy Remote Control Support / Build Image (push) Successful in 47s
Build and Deploy Remote Control Support / Deploy to Portainer (push) Successful in 7s
express.json() raising a parse error was falling through to the generic
500 handler, which reads as a server fault for what is a bad request.
Also maps the body-size limit to 413.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:55:48 -07:00
rmancinasandClaude Opus 5 30feb5f61b fix(deploy): publish on 5910, 8091 is taken on the Swarm ingress
Build and Deploy Remote Control Support / Test (push) Successful in 11s
Build and Deploy Remote Control Support / Build Image (push) Successful in 47s
Build and Deploy Remote Control Support / Deploy to Portainer (push) Successful in 9s
The first real deploy failed with "port '8091' is already in use by
service 'ai-training-lab_ai-lab' as an ingress port". Worth noting the
port answered nothing when probed over HTTP — a Swarm ingress
reservation survives the service behind it being down, so probing is not
a way to find a free port.

5910 is VNC display :10 and sits clear of the 809x web-app block.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:52:48 -07:00
rmancinasandClaude Opus 5 8af9d39ffd feat(ui): warm-graphite design system and particle background
Build and Deploy Remote Control Support / Test (push) Successful in 18s
Build and Deploy Remote Control Support / Build Image (push) Failing after 20s
Build and Deploy Remote Control Support / Deploy to Portainer (push) Skipped
Reworks the console's look away from generic dark-mode defaults: the
neutral ramp carries a faint violet cast, and the signal palette now
distinguishes connection topology by colour — mint for live agents,
iris for direct connections, copper for consent-required machines.

Type contrast comes from pairing the platform mono against the platform
sans rather than a webfont, since the box this runs on has no internet.

particles.js draws a proximity-linked node field: full strength on the
login and public pages, frozen static in the console, and entirely
absent from the viewer, where every frame belongs to the remote desktop.
It caps DPR at 2, scales node count to viewport area, throttles to 30fps,
cancels rAF when the tab is hidden, and honours prefers-reduced-motion.

app.js and viewer.js are unchanged; the particle layer mounts itself and
tracks the console via MutationObserver on #app.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:40:16 -07:00
rmancinasandClaude Opus 5 999717f77b feat: self-hosted remote support over VNC
Browser-based remote control (noVNC) with invite links, per-user access
control, garagedoor SSO and a persisted client list.

The hub proxies RFB rather than pointing the browser at a VNC server. That
is what lets it authenticate upstream with a stored password the browser
never sees, and enforce view-only by dropping input messages on the
client->server stream instead of hiding buttons.

Machines are reachable two ways: direct TCP for LAN hosts, or an outbound
agent tunnel for anything behind NAT. Node 22's global WebSocket keeps the
agent dependency-free, and node:sqlite keeps the image free of native
builds.

Ships with an end-to-end suite that boots the real server against a fake
VNC server and a fake auth service (72 assertions), plus Gitea Actions
CI/CD to Portainer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:37:35 -07:00