From vnc-remote-control
Use when you must drive a remote machine, VM, or GUI/TUI program over VNC/RFB - sending keystrokes and clicks and reading the screen with OCR - because the target has no network, SSH, agent, or API. Covers Proxmox/hypervisor VM consoles (first boot before networking, or a VM that will never have a network), legacy line-of-business GUIs and dated installers that are only a window, and old TUI apps driven by keypresses. Nothing is installed on the target except its VNC server (Proxmox ships noVNC out of the box). Driven with the `vnc-remote-control` CLI (PyPI).
How this skill is triggered — by the user, by Claude, or both
Slash command
/vnc-remote-control:vnc-remote-controlThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Drive a target's screen over plain VNC/RFB with the `vnc-remote-control` CLI: type text, press
Drive a target's screen over plain VNC/RFB with the vnc-remote-control CLI: type text, press
named keys, click, screenshot, and OCR. It is a pure client - nothing runs on the target, no
agent, no service, no open port, nothing in its process list. The control happens entirely through
a VNC/RFB server the target already exposes.
type + key); the target needs only
a VNC server, which Proxmox provides out of the box.This skill installs vnc-remote-control and then drives it. First make sure the CLI and tesseract
are present on the machine you drive FROM (never on the target):
# the CLI - persistent on PATH via uv; skip if already installed
command -v vnc-remote-control >/dev/null || uv tool install vnc-remote-control
# tesseract is a REQUIRED system dependency (OCR is how you find what to click)
command -v tesseract >/dev/null || sudo apt-get install -y tesseract-ocr # macOS: brew install tesseract | Windows: choco install tesseract
For a one-off without a persistent install, uvx vnc-remote-control ... runs it on demand (uv
fetches it each run); tesseract is still required. Then drive the target with the commands below.
Every command needs --port; --host defaults to 127.0.0.1.
| Command | Does |
|---|---|
type "text" [--enter] | Type a literal string into the focused field (--enter adds Return) |
key <name> | Press one named key: enter, tab, esc, arrows, f1-f12, ... |
click X Y | Left-click at an absolute framebuffer pixel |
screenshot out.png [--mark X,Y] [--grid 50] | Write the native-resolution PNG; prints resolution: WxH; optional crosshair / coordinate grid |
ocr [--grep PATTERN] | List on-screen words with their click centers and confidence |
click-text "PATTERN" | Click the first on-screen word matching the pattern |
vnc-remote-control --port 5901 screenshot /tmp/g.png --grid 50
vnc-remote-control --host 10.0.0.5 --port 5901 click-text "Next"
vnc-remote-control --port 5901 type "chkdsk c: /f" --enter
RFB pointer coordinates are absolute framebuffer pixels - the same pixels as a native-resolution screenshot. This tool never scales, so a coordinate read off the screenshot is the exact click coordinate. (Past "wrong pixel" failures came from reading coordinates off a scaled image.)
screenshot out.png - view it at NATIVE size (do not let the viewer downscale).out.png - there is no scale factor to undo.screenshot out.png --mark X,Y and check the crosshair lands on target (--grid 50 adds a ruler).ocr --grep "Sign in" then click <cx> <cy>, or one-shot click-text "Sign in". click-text only sees text OCR can read - low-contrast or placeholder hints (a faint greyed-out search box), icons, and untitled controls are missed and it fails; fall back to reading the pixel off the screenshot and click X Y.type. Skipping the click is the #1 reason typed text seems to vanish.keyboard: key) maps keysyms to the guest layout. If wrong characters land, the SERVER layout
is misconfigured - fix it there, never compensate per keystroke on the client.--delay-scale 2 multiplies every delay, or set
individual gaps via --set vnc.key_up_gap=0.2 (keys: key_down_hold, key_up_gap, click_move_gap,
click_hold, click_release_gap).screenshot + ocr FIRST and act on what
the screen ACTUALLY says (an error dialog, a validation message, a progress indicator, a greyed-out or
relabeled button). Never blind-retry: if the first click DID land, the same coordinates may now hit a
DIFFERENT control (re-firing an installer, dismissing an unread error), and on a laggy guest an
"unchanged" screenshot is weak evidence. Only when two screenshots a few seconds apart show a genuinely
identical, idle screen is "dropped input" the diagnosis - then retry ONCE with increased delays and
re-read the screen.bitranox:coding-resilience.VNC_REMOTE_CONTROL_PASSWORD env var (which --password reads by
default), NOT on the command line - a password in argv is visible in ps. TLS/VeNCrypt and Apple
Remote Desktop auth are not supported. (demand gated)VNC_REMOTE_CONTROL_PASSWORD=secret vnc-remote-control --port 5901 key enter
The VM's console is a VNC/RFB server on the host. Reach it directly, or SSH-tunnel to the console
port (see bitranox:compuse-ssh). openvmm is the ideal layout-aware target so arbitrary
characters and non-US layouts type reliably; plainer VNC servers still work for any text a fixed
(usually US) layout can produce.
Guides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Implements work from a spec or tickets using TDD at agreed seams, with regular typechecking and test runs, followed by code review.
npx claudepluginhub bitranox/vnc-remote-control --plugin vnc-remote-control