PIONEERING

Docs/Perch/How it works

How it works

Perch is two pieces that only work together: a native app and a browser extension. Neither does anything on its own, on purpose.

The substitution#

When a page calls getDisplayMedia(), the browser shows its own picker. You choose. Perch's extension then changes what the page is handed:

  • the page receives a stream of one tab — the tab that asked;
  • that stream is labelled as a monitor, so the page believes it has the whole screen;
  • the reported dimensions are a plausible display, not a tab.

A site checking whether it got "Entire screen" gets the answer it wants. It never receives anything you did not put in that tab.

This is substitution, not blocking

Refusing to share is easy and useless — the site notices. The point here is that the site gets a complete, well-formed screen share that happens to contain only one tab.

Why it launches its own browser#

Perch drives a Chrome that it starts itself, with its own profile, and never touches your existing install.

That is not tidiness. A browser will only let an application add an extension to a session that application started. There is no way to attach to a Chrome you opened yourself, and Perch does not try — anything claiming to inject into your everyday browser is doing something you should not want.

The profile lives beside Perch's own data and is left alone by the uninstaller.

The pipe#

The app speaks to that Chrome over the DevTools protocol, on a pipe rather than a port.

--remote-debugging-port opens a localhost listener that any local process can drive, including anything else running as you. A pipe is only readable by the process that was handed it. It is also the only option: the protocol method that loads an unpacked extension is pipe-only.

The mutual gate#

Each half refuses to work without the other.

  • App running, extension missing → the app says so, and does not pretend.
  • Extension present, app closed → the extension goes inert. It does not half-substitute, and it does not silently pass a real screen share through.

The second one matters more than it looks. A partial failure here would mean a page receiving your actual desktop while you believed it was receiving one tab. Failing closed is the only acceptable behaviour.

The bridge#

The two halves talk over a native-messaging host — a small executable the browser launches, registered under your user only, connected to the app by a local pipe. It carries presence and page geometry, nothing else. It is not a general-purpose channel and cannot be used as one.

Last updated 27 Aug 2026