Releases: DO-SAY-GO/gripui
Release list
gripui v3.0.4
The first tag where the whole gate is green
No CLI changes, and the binaries are substantively identical to v3.0.3. This
tag exists because it is the first in this repository's history where both
release-public and Release smoke pass together, on all four platforms.
If you are on v3.0.3 there is nothing here you need.
Corrections to the v3.0.3 notes
Those notes claimed every Windows release had shipped unstripped. That was
wrong. Checking the published artifacts rather than the build log, the v3.0.2
and v3.0.3 executables both carry zero symbols and no debug sections, and
differ by 512 bytes: RUSTFLAGS="-C strip=symbols" already strips at link
time, so the post-build pass was redundant. The build step really had been
failing silently into a || true for a long time, and fixing it was right, but
it had no shipped consequence. The v3.0.3 notes have been corrected in place.
Internal
connect, the PTY wrapper for interactive agents, is not part of any release
artifact — the release packages gripui only — but its tests run in the
release gate, and they had been failing intermittently across platforms for
months.
- A turn could be settled by the echo of its own input. The terminal echoes
injected text straight back, so the capture saw output before the agent had
written a byte; an agent still starting up left a screen holding only that
echo, and the turn completed empty, discarding the real answer when it
arrived. At the shipped default of 1750 ms this needed an agent that stayed
quiet for under two seconds after being prompted, which for anything backed
by a model is routine. A turn now requires actual agent content, and an empty
turn is recorded only at session teardown, where it is a fact rather than a
guess. - The test fixture advertised bracketed paste and did not honour it. Once
connecthas seen the mode enabled it wraps injected text in
\033[200~ ... \033[201~, correctly. The fixture then read raw lines and
never recognised the input, so it answered nothing — but only when the banner
was parsed before the injection, which is a race decided by machine speed.
That, not any timing window, was the cause of the intermittent failures. - Tests can no longer hang the job. Both spawned children are killed on
drop and waited for with a bound, so a failure is reported instead of burning
a 25-minute step timeout in silence.
Verified under CPU starvation rather than on an idle machine: 30/30 on a
4-vCPU box against 8 spinners, where the previous code scored 9/30.
Install or update
macOS / Linux:
curl -fsSL https://gripui.com/install.sh | bashWindows PowerShell:
irm https://gripui.com/install.ps1 | iexgripui v3.0.3
A mark, one support address, and an honest build
A maintenance release on top of v3.0.0's rename. No CLI behaviour changes and
the binaries are unchanged in substance; what moves is where to write to us,
and what gripui looks like.
Build
-
A silently failing strip step in
prod.sh. It looked for
target/release/gripui, but Windows buildsgripui.exe. MSYS resolves an
extensionless path to the.exefor its own builtins, so[[ -f ]]andls
both reported the file present and the build went green — while
llvm-strip.exe, a native Windows binary that does no such resolution, failed
with "no such file or directory" into a|| true.To be clear about the impact, because the first draft of these notes
overstated it: nothing shipped unstripped.RUSTFLAGS="-C strip=symbols"
and the release profile already strip at link time, so the post-build pass was
redundant and the Windows binaries have carried zero symbols all along — the
v3.0.2 and v3.0.3 executables both report none. The bug was a build step that
had not worked in a long time and said nothing about it. The path is correct
per platform now, and a stripper that is present but fails is fatal rather
than ignored; only the absence of any stripper is tolerated.
Changes
- Support is
grips@dosaygo.com. The trial email, the EULA, terms, privacy,
the enterprise page and its intake responses all move together, so there is
never more than one address to write to. - A new mark. gripui now has a negative hand stencil, after the Cueva de las
Manos panels: pigment sprayed around a hand, crisp where the hand blocked it
and dissolving into droplets at the edge. The favicon is its inverse — a dark
hand on a white tile — because browser chrome may be light or dark and a mark
that is mostly pigment disappears into a dark toolbar.
Install or update
macOS / Linux:
curl -fsSL https://gripui.com/install.sh | bashWindows PowerShell:
irm https://gripui.com/install.ps1 | iexPowerShell reserves gu for Get-Unique, and an alias resolves before
anything on PATH. In a PowerShell session use grip or gripui; gu works
from cmd.exe, and as gu.cmd anywhere.
gripui v3.0.2
One name: gripui
The CLI carried three generations of name at once — web-cli in its config
paths, FuckUI in the repository, dub / Duet Browser in the binary and docs.
It is now gripui everywhere a user or an agent sees it. This release also
carries everything cut for v2.6.0, which was built but never published.
Breaking changes
- The binary is
gripui.gripandguare installed as aliases. The
retired commands —dub,duet,dbc,duc,fu,fui,web— are
removed on install, with no compatibility period. The installers remove a
retired name only when the file is provably ours (a symlink to our command,
or a shim that execs our wrapper), so an unrelated program that happens to
share one of those names is left alone. - Profiles, sessions and cookies are untouched. State stays in
~/.config/dosaygo/{web-cli,webcli}. The config path is deliberately
decoupled from the CLI name so that a rename cannot orphan a logged-in
profile. Nothing to migrate. - The trailing activation Space is now removed by default. v2.5.0 ended
everysayandtypewith a trusted Space and left it in the field unless
the caller passed--trim-final-space. Reversal is now the default;
--keep-final-spaceopts out.--trim-final-spaceis still accepted (and
hidden) so existing scripts and agent skill files keep working — it now
describes what already happens. - HUD scoring is gone.
WEB_ENABLE_INSPECT_SCORINGand
WEB_ENABLE_SEMANTIC_SCORINGare removed. Every shape orders actions by
page position;relevanceremains accepted as an alias ofdocument-order
on the CLI and in saved profiles. - Release artifacts are published as
gripui-<os>-<arch>instead of
dub-<os>-<arch>. The installers accept both, so an existing install
updates across the recut.
What's new
gripui doctor— why this field is rejecting what you typed. A sheet
snapshot cannot answer that;doctorprobes the live control and reports
what is true of it right now: the value with whitespace made visible
(<SP>,<NBSP>,<ZWSP>,<TAB>), the declared constraints including
selectanddatalistoptions, the browser's own validity flags and
message, page error text fromaria-errormessage,aria-describedbyand
live alerts, and the other invalid fields in the same form — because a
submit usually fails on a field nobody was looking at. It names uncommitted
state, so a form holding unsaved edits is not reloaded away, and it compiles
patternthe way the browser does (thevflag), which catches patterns
the browser silently ignores while the field reports valid. The probe only
reads; it never mutates the field it is measuring.- Actions carry their context. An action inside a
<header>now takes
identity from the heading beside it instead of hard-stopping the ancestor
walk at the landmark, so fiveAddbuttons on a settings page no longer
surface as five identical refs. - Off-screen actions are counted, with a direction. "Some results are
offscreen" is replaced by what it was hinting at: under--ignore-viewport,
"19 actions below the fold, 1 action off to the side"; without it, "20 more
actions outside the viewport" — the direction is genuinely unavailable in
that mode, so the hint does not claim one. It no longer fires at random on
one HUD in four, and the static "More below?" line is retired. - Carrier suppression.
huddrops generic wrappers —div/span,
structural roles, long aggregate blocks — whose only action is a control
already listed inside them. On by default;unset carrier-suppression
lists the raw rows, and_filterStages.carrier_wrapperscounts what was
dropped. It never removes a control or a widget role. - Unrendered targets are explained, not silently attempted. Elements with
no rendered box — a closed dialog or popover, collapseddetails,hidden,
display:none,content-visibility:hidden,visibility:hidden, detached —
are refused with a reason naming the container, forclick,hoverand
selector queries, and--try-anywayis an override rather than a bypass of
the explanation. - Reveal follows the clip chain. Occlusion mitigation scrolls only hosts on
the target's containing-block chain, and scrolls the document only when that
can actually move the target — not for top-layer or viewport-fixed targets. - Demo mode shows click intent. The pointer circle glides from the last
pointer position to the target over 250 ms and rests for 500 ms before the
trusted click, on both CDP and BiDi, and the post-click trace reuses that
circle instead of stacking a second one. WEB_FORCE_HEADLESS. Makes every browser launch headless, overriding
unset headlessandWEB_FORCE_HEADFUL. It refuseshandoffand keeps
open_urlfrom opening the system browser.
Fixes
- Trimming the activation Space is no longer blind. It used to sleep and press
Backspace unconditionally, which ate a real character whenever the Space had
not landed — typing a single@into a Cloudflare DNS name field reported
success and left the field empty. It now reads the focused field back and
presses Backspace only when the value actually ends with a space, covering
input,textareaandcontenteditable. - A failing hourly update check no longer bricks the install. The wrapper
treated the check as a precondition and recorded the check time only on
success, so once an expected asset name stopped existing, every command
exited 1 on every invocation, indefinitely, with a working runtime on disk.
An update failure now warns once, backs off for one cadence, and runs the
installed version. Only an install with no runtime at all is fatal. - The occlusion probe aims where the click aims.
hudordering no longer sorts by selector string, which put#p10ahead of
#p2.gripui teachstopped advertising command names that were removed.- Per-command caching of computed-style clip facts and memoized clip chains
shared by siblings: HUD output is unchanged, and HUD time drops 27% on the
clipping matrix and 13–33% on a 5k-control page.
Install or update
macOS / Linux:
curl -fsSL https://gripui.com/install.sh | bashWindows PowerShell:
irm https://gripui.com/install.ps1 | iexExisting installs update in place and pick up gripui, grip and gu; the
retired commands are removed at that point.
On Windows, note that PowerShell ships gu as a built-in alias for
Get-Unique, and an alias resolves before anything on PATH. In a PowerShell
session use grip or gripui; gu works from cmd.exe, and as gu.cmd
anywhere. The installer says so when it finds the alias.
Duet Browser v2.5.0
Typing at human pace
Reactive pages drop input that arrives all at once: a location search that
never shows suggestions, a filter that ignores a pasted word, a form that stays
invalid. Duet Browser now types at a human pace and ends every typed value with
a trusted key press, and demo mode shows pointer gestures as clearly as clicks.
What's new
-
Paced typing.
dub typesends real key events about 40 ms apart, with
small jitter, instead of dispatching a whole word in one turn. Controls that
drop input events under fast CDP dispatch now receive every character. -
Trusted activation Space. After
dub sayordub typeenters text, Duet
Browser pauses about 800 ms and presses Space, so frameworks that commit only
on a real keyboard event see one. This applies in Chrome and Firefox.
The Space stays in the field. -
--trim-final-space. When the field needs its exact value, pass
--trim-final-spacetosayortype. Duet Browser waits again after the
activation Space and removes it with Backspace:dub type 14 "Lisbon" --trim-final-space dub say "exact value" --trim-final-space
-
Failed text insertion is reported. If Chrome rejects inserted text for
dub say, the command now fails withtext insertion failedinstead of
reporting success with an unchanged field. -
Demo mode traces pointer gestures. With
dub set demo-mode,
dub pointerdown,pointermove, andpointeruphighlight their target
before acting and leave a cursor trace where the gesture landed, matching
click and hover.
Upgrade note
Typing takes longer than before: at least 800 ms per say or type, plus about
40 ms per character for type. Scripts that compare a field's value right after
typing should expect a trailing space unless they pass --trim-final-space.
Install or update
macOS / Linux:
curl -fsSL https://duetbrowser.com/install.sh | bashWindows PowerShell:
irm https://duetbrowser.com/install.ps1 | iexDuet Browser v2.2.2
Name the unnamed
Plenty of real controls have no text at all: a drag handle that is just an SVG,
an icon-only button, a swipe circle with a click listener. Duet Browser now
names them from the evidence the author left behind, and pointer gestures take
the same HUD refs as every other action.
What's new
-
Names for textless controls. When a control has no text, label, title, or
placeholder, its name now comes from author-supplied structure: icon
attributes (data-icon,data-feather,data-lucide,data-phosphor,
icon), thendata-action/data-label/data-name/data-tooltip, then
readable class names. A handle like
<div class="swipe-dragger-circle"><svg data-icon="left-right"></svg></div>
shows up asleft rightinstead of an empty action. Explicit labels always
win, and hash-like or numeric tokens are ignored. -
Pointer gestures accept HUD refs.
dub pointerdown,pointermove, and
pointerupresolve a bare number as a HUD ref, the same waydo,click,
type, andhoverdo, so you can build a drag straight fromdub hud:dub pointerdown 12 dub pointermove 18 dub pointerup 18
A ref that points at a tab, or at an element on another tab, fails with a
hint to switch tabs and refresh the HUD instead of acting on the wrong page. -
Clearer closed-shadow-root recovery.
dub set open-only-lightnow says to
reload the page before inspecting, and warns that it can change site
behavior. The skill documents it as a targeted recovery tool for controls
hidden in closed shadow roots, not a default.
Install or update
macOS / Linux:
curl -fsSL https://duetbrowser.com/install.sh | bashWindows PowerShell:
irm https://duetbrowser.com/install.ps1 | iexDuet Browser v2.1.2
One owner per action
A native label and its control, a disclosure summary and its body, a choice
field and its popup: each is one action to an agent, not two. Duet Browser now
resolves which surface actually owns an activation and shows that one, while
keeping every existing ref usable.
This is the first public release since v1.7.0 and includes all changes made
since then.
What's new
- One primary action per observed owner. HUD and find show a single action
for aliases such as a native label and its control. The reachable surface
wins; matching text or overlapping rectangles alone never merge actions.
dub hud --explode-pairsshows the individual surfaces, and JSON
surface.presentation_owneridentifies the observed activation owner. - Refs survive action-set changes. When the set of actions changes, the
notice now readsaction set changed; surviving refs retained. Surviving
elements keep their refs; the nonzero exit still stops&&chains. - Choice controls. Choice fields carry
opens=choices,[expanded]/
[collapsed], and a separately rendereddisplay="…". Opening a menu or
highlighting an option is not reported as a selection. Popup options carry
their controlling field's context when the page supplies an unambiguous
relationship, and an expanded choice popup counts as an active layer. - Native disclosures. Summary actions show
[collapsed]or[expanded];
controls inside a closed disclosure appear after opening it. - Listener action discovery on by default. Chrome HUD now includes controls
discovered from registered click/pointer listeners without opting in. Existing
profiles adopt the new default;dub unset listener-actionsdisables it, and
explicit settings persist. Firefox keeps the baseline sheet. - Quieter Chrome. Every launch now suppresses the "Translate this page?"
bubble and the "Restore pages?" crash bubble, which could race the requested
URL after a relaunch. Explicit session restore still works.
Install or update
macOS / Linux:
curl -fsSL https://duetbrowser.com/install.sh | bashWindows PowerShell:
irm https://duetbrowser.com/install.ps1 | iexDuet Browser v1.7.0
Actions in context
Two buttons can both say Get started and do entirely different things.
Duet Browser now surfaces the nearby card, row, or group context that helps an
agent tell them apart—without changing the action's name or stable ref.
Here is the default HUD on Cloudflare's Pages creation screen:
[148] click link:"Create a Worker"
* Get started
[149] click link:"Get started" context="Import an existing Git repository"
[150] click link:"Get started" context="Drag and drop your files"
*
This is an actual headful-session excerpt. Ref numbers are session-specific;
run dub hud to get the current refs before acting.
What's new
- Useful context by default. HUD, form, find, and observe use the same
context. Repeated buttons and fields can be distinguished by their surrounding
card, row, or group without describing every action individually. - Consistent names and values. Shared semantic naming handles labels and
media across surfaces while keeping editable values separate from names.
Changing a selected option or field value does not rename the action. - Precision comes first. Context uses bounded, local, web-wide structural
evidence—not site exceptions or button-word dictionaries. Ambiguous text and
inline sentence fragments are omitted; missing context is preferable to an
unsupported association. - More room for Firefox startup. Session creation gets a bounded 15-second
response deadline instead of the ordinary three-second read allowance.
Connection and WebSocket timeouts are unchanged, and partial responses cannot
extend the session deadline. - Chrome responsiveness fixes. CDP key events avoid native key processing
that can stall headless Chrome on macOS. A failed best-effort background tab
refresh no longer terminates the daemon; command failures still surface.
The context regression ran in Chrome and Firefox, including wrapper changes,
narrow layouts, ambiguous neighbors, stable refs, and real activation. The final
serial release-smoke run passed 375 non-ignored workspace tests, nine Chrome
smoke cases, six Firefox smoke cases, and its process-leak check.
Install or update
macOS / Linux:
curl -fsSL https://duetbrowser.com/install.sh | bashWindows PowerShell:
irm https://duetbrowser.com/install.ps1 | iexDuet Browser v1.6.0
Automated release from the private Duet Browser source repository.
Installers:
curl -fsSL https://duetbrowser.com/install.sh | bash
irm https://duetbrowser.com/install.ps1 | iex