Built in public. Debugged in reality.

The browserbecame an instrument.

This is the story of how a brittle script learned to see, remember, listen—and finally share control.

Scroll to run
01 · February 2026

It began with a loop.

Agents could reason. Browsers could render. The missing piece was a language between them: look, act, verify, repeat. The first version was not magic. It was fourteen plain commands—and a battle test that refused to flatter us.

browse · localhost:3012
$ browse ready
session attached · snapshot available
gotosnapshotclickfilltypepresswaitscreenshotextractscrollselecthoverevaluateready
✓ snapshot → act → verify
battle test40% → 100%
02 / THE BROWSER CAME HOME

Use the Chrome you already trust.

A fresh cloud browser is logged out of your life. So ThinkRun learned local mode: the agent can work inside your signed-in Chrome, scoped to tabs you attach, with policy checks and a kill switch.

localNo account. No server.
Free forever.
03 / THEN IT LEARNED TO LISTEN

A recording became context.

A screen capture is evidence, but an agent needs structure. ThinkRun time-synced video, voice, actions, DOM, console, and network so a human could point—and an agent could understand exactly where.

18review rounds hardened
the MediaRecorder path
04 / ONE MEMORY, THREE READERS

Humans watch. Agents read.

The same share link became three things: a replayable page for people, compact Markdown for an LLM, and JSON for machines. No re-explaining. No 200k-token page dump.

~500tokens in the compact
Markdown representation
05 / THINKBROWSE → THINKRUN

The name caught up to the idea.

It was no longer about browsing. It was about running a loop between intent and reality. The rename crossed packages, runtime paths, UI, and docs—while deliberately preserving old native-host boundaries so existing users kept working.

2new npm packages:
@thinkrun/cli + @thinkrun/mcp

The hardest part was never making the browser move. It was knowing when it shouldn’t.

Every command policy-checked · every scope explicit · the human stays the editor
What the repo remembers

Progress leaves scars.

The development wiki does not read like a victory lap. It reads like a machine learning humility: race conditions, stale artifacts, false positives, broken packages, and the fixes that survived contact with production.

Accuracy

A field name broke the whole illusion.

The evaluator sent { expression }. The endpoint expected { script }. Fixing that mismatch took the battle test from 80% to 100%.

10 / 10 tasks
Reliability

A circuit breaker that feared success.

The old native-host breaker could produce structurally false alarms. The replacement trips only after three consecutive timeouts; any delivered response proves the transport is alive.

3 timeouts
Honesty

The headline command went dark.

The homepage install path once failed with a missing shared package. The repair did more than publish a fix—it added a guard that runs the actual public binary.

smoke the promise

The next run is yours.

ThinkRun began as a way for an agent to move through a page. It became a way for people and agents to share the same evidence, the same browser, and the same loop.

The receipts behind the story
memory/completed-work.md14 original browse commands; battle-test progression 40% → 80% → 100%; final 10/10, averaging 106s versus 150s with playwright-cli; PRs #139, #145, #146.
memory/media_recorder_hardening.md18 roborev rounds on the MediaRecorder / screen-recording hook, recorded as a hardening case study.
frontend/public/llms.txtEvery share URL has three representations; the Markdown form is documented as approximately 500 tokens.
CHANGELOG.md · PRs #665–#668Outcome-aware native-host circuit breaker: three consecutive request timeouts trip it; delivered responses do not.
memory/narratives/2026-06-12.mdThinkBrowse→ThinkRun rebrand narrative: @thinkrun/cli and @thinkrun/mcp published while legacy native-host and configuration continuity were preserved.
memory/npm_install_outage_fix.mdThe public install outage and the resulting “run the binary” smoke-test discipline.