πΈ woah, livin' on a prayer πΈ
day 7 of 14. we're at the midpoint. and things are looking good.
day 6: bidi proxy server
the websocket proxy is up. when a client connects, clicker:
- launches a browser
- connects to its bidi websocket
- routes messages back and forth
- kills the browser when the client disconnects
Connected to proxy
> session.status
> browsingContext.getTree
> browsingContext.navigate β https://example.com
> browsingContext.captureScreenshot
< Screenshot received! Base64 length: 20736
Disconnected from proxy
[router] Browser session closed for client 1
no zombie processes. clean shutdown. rock solid.
day 7: javascript client (async api)
the js/ts client is alive:
import { browser } from 'vibium';
const vibe = await browser.start();
await vibe.go('https://example.com');
const shot = await vibe.screenshot();
require('fs').writeFileSync('test.png', shot);
await vibe.quit();it works. actually works. spawns clicker, connects via websocket, drives chrome, takes screenshots.
try it yourself (local dev):
make # build everything
cd clients/javascript && node --experimental-repl-awaitconst { browser } = await import('./dist/index.mjs')
const vibe = await browser.start({ headless: false }) // see the browser!
await vibe.go('https://example.com')
const shot = await vibe.screenshot()
require('fs').writeFileSync('test.png', shot)
await vibe.quit()βββββββββββββββββββββββββββββββββββββββ
β your code β
β const vibe = await browser.start()β
ββββββββββββββββ¬βββββββββββββββββββββββ
β spawns
ββββββββββββββββΌβββββββββββββββββββββββ
β clicker serve (go binary) β
β websocket proxy on :9515 β
ββββββββββββββββ¬βββββββββββββββββββββββ
β launches + routes bidi
ββββββββββββββββΌβββββββββββββββββββββββ
β chrome for testing β
β webdriver bidi enabled β
βββββββββββββββββββββββββββββββββββββββ
done (days 1-7):
- β day 1: project bootstrap
- β day 2: browser detection & installation
- β day 3: websocket & bidi basics
- β day 4: navigation & screenshots
- β day 5: element finding & input
- β day 6: bidi proxy server
- β day 7: js client async api
remaining (days 8-14):
- β¬ day 8: element class + sync api (
vibe.find('button').click()) - β¬ day 9: auto-wait (no more
.sleep()hoping elements load) - β¬ day 10: mcp server (claude code drives the browser)
- β¬ day 11: error handling + logging
- β¬ day 12-13: cross-platform packaging (npm install just works)
- β¬ day 14: docs + examples
halfway there. on track for christmas.
the second half is where it gets fun: mcp integration means claude code can browse the web. that's when vibium becomes more than a library β it becomes infrastructure for ai agents.
stay tuned.
β¨π ππβ¨
- π€ hugs
#vibium
december 17, 2025
