Skip to content

Release Notes - v0.5.0

Project renamed from vibium-go to w3pilot. Native Chrome launcher, video recording, WebSocket monitoring, and page event listeners.

Highlights

Major rename and native browser support.

This release renames the project from vibium-go to w3pilot with a new module path, package name, and CLI. The external clicker dependency is replaced with a native Chrome launcher that auto-installs the browser. New features include video recording, WebSocket monitoring, and page event listeners.

Breaking Changes

Project Rename

Before After
github.com/plexusone/vibium-go github.com/plexusone/w3pilot
package vibium package w3pilot
*Vibe *Pilot
vibium CLI w3pilot CLI
vibium-mcp w3pilot-mcp
vibium-rpa w3pilot-rpa
VIBIUM_DEBUG W3PILOT_DEBUG
VIBIUM_HEADLESS W3PILOT_HEADLESS
VIBIUM_SKIP_BROWSER_DOWNLOAD W3PILOT_SKIP_BROWSER_DOWNLOAD

Migration Guide

// Before (v0.4.x)
import vibium "github.com/plexusone/vibium-go"

vibe, err := vibium.Launch(ctx)
vibe.Go(ctx, "https://example.com")
elem, err := vibe.Find(ctx, "button", nil)

// After (v0.5.0)
import "github.com/plexusone/w3pilot"

pilot, err := w3pilot.Launch(ctx)
pilot.Go(ctx, "https://example.com")
elem, err := pilot.Find(ctx, "button", nil)

CLI migration:

# Before
vibium launch --headless
vibium mcp
VIBIUM_DEBUG=1 vibium run test.json

# After
w3pilot launch --headless
w3pilot mcp
W3PILOT_DEBUG=1 w3pilot run test.json

New Features

Native Chrome Launcher

The browser is now bundled and auto-installed. No need for external clicker binary:

// Just works - Chrome is downloaded automatically on first use
pilot, err := w3pilot.Launch(ctx)

To skip auto-download (if using system Chrome):

export W3PILOT_SKIP_BROWSER_DOWNLOAD=1

Video Recording

Record browser sessions as video files:

// Start recording
video, err := pilot.StartVideo(ctx, &w3pilot.VideoOptions{
    Dir: "./recordings",
})

// Perform actions...
pilot.Go(ctx, "https://example.com")
elem, _ := pilot.Find(ctx, "button", nil)
elem.Click(ctx, nil)

// Stop and get video path
path, err := pilot.StopVideo(ctx)
fmt.Println("Video saved to:", path)

WebSocket Monitoring

Monitor WebSocket connections opened by the page:

err := pilot.OnWebSocket(ctx, func(ws *w3pilot.WebSocketInfo) {
    fmt.Println("WebSocket opened:", ws.URL)

    ws.OnMessage(func(msg *w3pilot.WebSocketMessage) {
        fmt.Printf("WS %s: %s\n", msg.Direction, msg.Data)
    })

    ws.OnClose(func(code int, reason string) {
        fmt.Printf("WS closed: %d %s\n", code, reason)
    })
})

Page Event Listeners

Subscribe to page events:

// Console messages
pilot.OnConsole(ctx, func(msg *w3pilot.ConsoleMessage) {
    fmt.Printf("[%s] %s\n", msg.Type, msg.Text)
})

// Page errors
pilot.OnPageError(ctx, func(err *w3pilot.PageError) {
    fmt.Printf("Page error: %s\n", err.Message)
})

// Network requests
pilot.OnRequest(ctx, func(req *w3pilot.Request) {
    fmt.Printf("Request: %s %s\n", req.Method, req.URL)
})

// Network responses
pilot.OnResponse(ctx, func(resp *w3pilot.Response) {
    fmt.Printf("Response: %d %s\n", resp.Status, resp.URL)
})

// Dialogs
pilot.OnDialog(ctx, func(dialog *w3pilot.Dialog) {
    fmt.Printf("Dialog: %s - %s\n", dialog.Type, dialog.Message)
})

Accessibility Snapshot

Get accessibility tree for the page:

{"name": "accessibility_snapshot"}

New MCP Tools

Category Tools
Frames list_frames, select_frame
State get_state, verify_state
Assertions assert_text, assert_element, assert_url, assert_title
Waiting wait_for_element, wait_for_text, wait_for_url
Cookies delete_cookie
Accessibility accessibility_snapshot

Bug Fixes

  • File handle error handling - Fixed writable file handle closed without error handling (GitHub code scanning alert)

Tests

  • Integration tests for verification operations
  • Integration tests for MCP tools and page methods

Installation

go get github.com/plexusone/w3pilot@v0.5.0

Documentation