Your own Chrome, driven from Officer. Not a headless one: it attaches to the browser you are already
signed into, which is the whole difference from /scrape, and /scrape stays behind in the platform.
The relay is a sidecar now, and that is the point. It was a second Bun.serve inside the platform
process on its own port, which is exactly why it was switched off on 2026-08-13 — "the platform serves
one port". A sidecar is a process allowed its own listeners, so the objection stops applying instead of
being argued with.
The boundary across it is deliberately small: two questions, who is connected and what tabs they have,
because only those live in memory on the relay side. Screenshots, evaluation and navigation still go
straight down cdp.ts's own WebSocket to the relay's /cdp endpoint, exactly as before — routing page
bytes through the platform would be work for nothing.
Three normally-breaking changes taken now because now they are free, each already recommended in a
comment by whoever switched the relay off. Its own signing key instead of borrowing getKey('jwt'). Its
own table instead of the platform's user_integrations. And the port kept at 18792 on purpose, because
the port is an input to the token HMAC as well as an address — moving it fails every pairing silently,
and the extension blames the address. user_integrations held zero browser-relay rows, checked in
Postgres rather than assumed, so there was nothing to unpair.
The screen became panels. BrowserScreen.tsx rendered TabList and TabPreview through appType: null
placeholders; both components were already self-contained and took no props, so the screen had nothing
to pass and simply went.
Not tested end to end — no browser has been paired since the move, and that needs a Chrome and a
person. BLOCKERS.md says so rather than the commit implying otherwise.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
39 lines
2.3 KiB
Markdown
39 lines
2.3 KiB
Markdown
# Blockers — browser extraction, 2026-08-21
|
|
|
|
## 1. Three breaking changes taken now, because now they are free
|
|
|
|
The relay has been switched off since 2026-08-13 and `user_integrations` held **zero** `browser-relay`
|
|
rows — checked in Postgres, not assumed. Nothing is paired, so nothing can be unpaired. Each of these
|
|
would cost somebody their pairing on any other day, and each was already recommended in a comment by
|
|
whoever switched the relay off:
|
|
|
|
- **the signing key** — tokens derived from `getKey('jwt')`, the platform's session key. Now
|
|
`getKey('browser-relay')`. The old file said to do this on extraction, in those words.
|
|
- **the storage** — pairing salts lived in the platform's `user_integrations`. Now `browser_pairings`,
|
|
this plugin's own table.
|
|
- **the port** — kept at 18792 deliberately, so an extension configured before the extraction still works.
|
|
It is an input to the token HMAC as well as an address; changing it is silent and the extension reports
|
|
it as "Relay not reachable", which SETUP.md blames on a wrong address.
|
|
|
|
If any of this is revisited later, it is no longer free.
|
|
|
|
## 2. The extension is unbranded beyond its name
|
|
|
|
`extension/manifest.json` is "Officer Browser Relay" with the icons it shipped with. The OfficerIcons
|
|
repository has newer artwork and a naming convention (`OffBrowserAppIcon.png`) that this predates. Left
|
|
alone rather than half-applied — the icons are a set, and the owner has more of that repository coming.
|
|
|
|
## 3. Untested end to end
|
|
|
|
The relay ran as a second listener inside the platform and now runs as a sidecar. The rewiring is small —
|
|
two questions cross the boundary and CDP still goes direct over its own socket — but **no browser has been
|
|
paired against it since the move**. What is verified: it typechecks, the plugin passes discovery, the
|
|
schema pushed, and the platform's test suite is green. What is not: an extension actually connecting,
|
|
which needs a Chrome and a person.
|
|
|
|
## 4. `/scrape` stayed, and shares a word rather than a mechanism
|
|
|
|
The platform keeps `browser` as an `execution` permission covering `/scrape` — headless chromium via
|
|
playwright, running as the owner, no sessions. Renamed to "Scraping" in the registry so the two stop
|
|
looking like one feature split in half. They were never the same thing.
|