Skip to content

Latest commit

Β 

History

History
126 lines (92 loc) Β· 3.59 KB

File metadata and controls

126 lines (92 loc) Β· 3.59 KB

woah, we're halfway there

vibium halfway there

🎸 woah, livin' on a prayer 🎸

day 7 of 14. we're at the midpoint. and things are looking good.


what just shipped (days 6-7)

day 6: bidi proxy server

the websocket proxy is up. when a client connects, clicker:

  1. launches a browser
  2. connects to its bidi websocket
  3. routes messages back and forth
  4. 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-await
const { 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()

the stack so far

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  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             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

the scoreboard

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

we'll make it i swear

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