PNSQC 2026 · POSTER PAPER
Lana Begunova·Daisy Lady Bug·Seattle, WA
Making a browser-automation CLI faster

Skip the
Wrapper

Five optimizations, measured under fixed semantics.
Four of them lost. The one that shipped is a packaging change.
~108ms saved per CLI call691ms off a 7-command journey0 mismatches
Same journey · same verbs · byte-identical output

Every call boots Node before any browser work.

saucedemo · 7 commands · replayed at ⅓ speed
illustrative split; totals as measured
THROUGH THE WRAPPER0ms
THE REAL BINARY0ms
Node runtime bootthe command’s real work
691ms
off a real 7-command journey
1.69×
journey speedup — not the 11.6×
of a near-empty command
0
behavior changes:
same click, same fill, same checks
What is actually on your PATH

vibium is not Vibium.

Today — two process spawns~118ms
vibium click
bin/cli.js41-line Node shim
Node runtime bootsevery single call
execFileSyncspawn #2
native binary
Skip the wrapper — one spawn~10ms
vibium click
native binaryhard-linked at install time
118−10=108msper call. The fix is in postinstall.js, not the CLI — what esbuild already does.
Five candidates · one survivor

Most “wins” stopped looking like wins.

upper bar = flat (6 cmds) · lower bar = navheavy (7 cmds) · positive is faster
dashed = not a saving: it changed what the journey does
How the numbers were kept honest

Without a noise floor, 108ms is a number — not a result.

0
timed journeys, all verified
0
further reps on the patch
0
output mismatches
40–60×
the measured noise floor
#356
Filed upstream at a maintainer’s public invitation — merged as PR #432.
Every sweep also run in reverse, so a direction effect could not hide.
The transferable part

The cheapest performance win is often not in the code. It is in the packaging.

Run it yourself

Under a minute.
Doesn’t touch your install.

Questions? The author is right here →
Scan for the repro repo
PORTLAND · OCT 12–14, 2026