Skip to content

Releases: DO-SAY-GO/gripui

gripui v3.0.4

Choose a tag to compare

@crisdosaygo crisdosaygo released this 19 Sep 09:06

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
    connect has 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 | bash

Windows PowerShell:

irm https://gripui.com/install.ps1 | iex

gripui v3.0.3

Choose a tag to compare

@crisdosaygo crisdosaygo released this 19 Sep 04:28

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 builds gripui.exe. MSYS resolves an
    extensionless path to the .exe for its own builtins, so [[ -f ]] and ls
    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 | bash

Windows PowerShell:

irm https://gripui.com/install.ps1 | iex

PowerShell 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

Choose a tag to compare

@crisdosaygo crisdosaygo released this 19 Sep 02:15

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. grip and gu are 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
    every say and type with a trusted Space and left it in the field unless
    the caller passed --trim-final-space. Reversal is now the default;
    --keep-final-space opts out. --trim-final-space is 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_SCORING and
    WEB_ENABLE_SEMANTIC_SCORING are removed. Every shape orders actions by
    page position; relevance remains accepted as an alias of document-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; doctor probes 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
    select and datalist options, the browser's own validity flags and
    message, page error text from aria-errormessage, aria-describedby and
    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
    pattern the way the browser does (the v flag), 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 five Add buttons 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. hud drops 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_wrappers counts 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, collapsed details, hidden,
    display:none, content-visibility:hidden, visibility:hidden, detached —
    are refused with a reason naming the container, for click, hover and
    selector queries, and --try-anyway is 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 headless and WEB_FORCE_HEADFUL. It refuses handoff and keeps
    open_url from 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, textarea and contenteditable.
  • 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.
  • hud ordering no longer sorts by selector string, which put #p10 ahead of
    #p2.
  • gripui teach stopped 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 | bash

Windows PowerShell:

irm https://gripui.com/install.ps1 | iex

Existing 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

Choose a tag to compare

@crisdosaygo crisdosaygo released this 14 Sep 04:38

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 type sends 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 say or dub type enters 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-space to say or type. 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 with text insertion failed instead of
    reporting success with an unchanged field.

  • Demo mode traces pointer gestures. With dub set demo-mode,
    dub pointerdown, pointermove, and pointerup highlight 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 | bash

Windows PowerShell:

irm https://duetbrowser.com/install.ps1 | iex

Duet Browser v2.2.2

Choose a tag to compare

@crisdosaygo crisdosaygo released this 14 Sep 03:44

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), then data-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 as left right instead 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
    pointerup resolve a bare number as a HUD ref, the same way do, click,
    type, and hover do, so you can build a drag straight from dub 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-light now 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 | bash

Windows PowerShell:

irm https://duetbrowser.com/install.ps1 | iex

Duet Browser v2.1.2

Choose a tag to compare

@crisdosaygo crisdosaygo released this 14 Sep 02:54

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-pairs shows the individual surfaces, and JSON
    surface.presentation_owner identifies the observed activation owner.
  • Refs survive action-set changes. When the set of actions changes, the
    notice now reads action 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 rendered display="…". 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-actions disables 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 | bash

Windows PowerShell:

irm https://duetbrowser.com/install.ps1 | iex

Duet Browser v1.7.0

Choose a tag to compare

@crisdosaygo crisdosaygo released this 09 Sep 09:48

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 | bash

Windows PowerShell:

irm https://duetbrowser.com/install.ps1 | iex

Duet Browser v1.6.0

Choose a tag to compare

@crisdosaygo crisdosaygo released this 03 Jul 09:16

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