Why We Built Popcorn: An Attestable Browser Cloud for Reclaim

Abdul Rashid Reshamwala
Aug 5, 2026
Why We Built Popcorn: An Attestable Browser Cloud for Reclaim
engineeringpopcornTEE

Reclaim lets people prove facts about themselves from websites they already use. Popcorn is the attestable browser cloud we built to make those proofs easier to integrate. Users complete the flow in a live, mobile-native browser running inside a Trusted Execution Environment (TEE). Popcorn generates the proof, then destroys the session. You can try Popcorn or explore the code on GitHub.

In the latest 30-day window, Popcorn created 102,859 browser sessions and allocated ready browsers in 470 ms at p50 and 889 ms at p95.

The story began with a WebView on the user's phone. That approach kept the work close to the user, but it asked every app integrating Reclaim to carry a surprising amount of infrastructure in its pocket: native cryptography, WebView orchestration, proof generation, and platform-specific glue. We rebuilt our proof-generation engine and cut proof time from roughly 40 seconds to 4–5 seconds, but the integration was still substantial. That migration is a story of its own.

The performance problem had improved. The integration problem had not.

We built both an App Clip and an Android Instant App to avoid a full SDK integration. They worked, but partners did not want verification to send users into a separate app experience. Google Play Instant was eventually discontinued. We needed an integration that stayed inside the product flow without putting the full browser and proof workload on the phone.

The product idea sounded almost suspiciously simple: open a browser remotely, stream its live view to the user, let them sign in and navigate, then generate the proof. Moving the work off the phone, however, also moves the hardest part of the trust model into our infrastructure.

The integration starter pack

Some assembly no longer required.

same proof · less inside the app
Before · ship the machinery
With Popcorn · open the flow
https://…/verifyOpen
One verification URLThe browser and proof workload run remotely.

Starting with Kernel

We evaluated Browserbase and other hosted-browser platforms. Kernel worked best for our flows, especially because we needed headful browsers.

Users needed to operate a real, visible Chrome session. Some sites behave differently in headless mode, while some login flows block automation. Kernel gave us interactive Chrome sessions, a live view, and browser-control APIs we could build on.

Kernel got us to a working product quickly. Another important point was that its browser image was open source. We could inspect the image, make the changes our flows needed, and contribute useful fixes upstream, including parent-frame status events and a video-sync anti-echo fix.

Once the remote-browser experience worked, the harder question became where that browser could safely run.

Kernel did not have plans to support the hardware-backed security model we needed. That meant the browser had to run on infrastructure we controlled. We started building our own TEE-based deployment, using Kernel's open-source browser image as the base instead of rebuilding a headful Chromium container from scratch.

The browser still had to be trusted

Browser sessions handle credentials, cookies, and private account data. Encryption protects that data while it travels across the network and while it is stored, but not while the browser is actively using it. Inside an ordinary VM, the host can still access that memory.

A Trusted Execution Environment, or TEE, gave us the missing protection. It is designed to isolate the browser's memory from the rest of the host, including the surrounding cloud infrastructure.

A TEE does not hide the page from the browser; the browser still needs to render it and generate the proof. It protects that work from the surrounding host. In production, each browser runs on a Confidential GKE Node with a small attestor service beside it.

In simple terms, a verifier can check that the session ran on genuine confidential hardware and used approved code. It does not have to take our word that the server was configured correctly.

Here is how it works in production. The verifier sends the attestor a fresh nonce, or one-time random challenge. The attestor returns a response tied to that challenge, the cryptographic fingerprints of the browser and attestor images, and a Google Cloud hardware attestation.

A TEE still does not replace TLS, authentication, authorization, or code review; it narrows what must be trusted.

This was not a security feature we could bolt on after the browser worked. TEE availability now determined where we could run Popcorn.

We first self-hosted on AWS with AMD SEV-SNP, but too few nearby regions supported it. Google Cloud offered AMD SEV-backed Confidential VMs and Confidential GKE in more of the regions we needed, so we moved the fleet.

The browser was only half the system

At this point, we had a browser image that could run inside a TEE. But an image is not a browser cloud. We still needed a system that could:

We split the work across a few focused components. The control plane authenticates the request and selects a region. A pool manager in that region assigns a ready browser, while the gateway securely carries the live view between the user and that browser. The control plane coordinates the session without sitting in the streaming path.

Agones is an open-source system for managing fleets of multiplayer game servers on Kubernetes. That sounds unrelated until you look at the lifecycle. A browser waits for a user, belongs to that user for a short session, and is then discarded. Agones already knows how to manage that pattern.

The Office comparison meme: a stateful isolated browser pod with a TTL and a game server are the same picture

Each regional pool keeps a warm buffer of browsers that are already running and marked Ready. A request only needs to claim one, so scheduling, image pulls, and browser startup stay off the user-facing path. Agones tracks each browser from waiting to assigned to finished. When one is assigned, its FleetAutoscaler starts a replacement. If the current TEE machines are full, our node prescaler adds another machine.

The flow is simple: a user starts a session, and the control plane chooses a pool close to them. Each regional pool contains several TEE nodes, and each node runs many isolated browser pods. The pool manager asks Agones for a ready browser and returns signed connection details. The live view then travels through the regional gateway directly to that browser. Behind the scenes, the scalers replace the assigned pod and add another TEE node when the pool needs more room.

From request to browser

The implementation lives in the regional pool manager, the Agones browser-fleet chart, and the GKE node prescaler.

Together, these pieces gave us a repeatable way to bring up a secure browser cluster in a new region, keep browsers ready, and serve users from a location close to them.

Owning the experience

Once the secure regional fleet was running, our focus shifted from where the browser ran to how it felt. Phones and slow networks exposed rough edges in the live stream, runtime, and viewer. We worked through them one by one.

Gru's Plan meme: a small open-source browser fork grows into a viewer, gateway, scaler, and regional control plane; fork around and find out

From WebRTC to VNC

The first major change was the live view. In our iOS testing, Low Power Mode sometimes prevented the remote video from autoplaying, while backgrounding the app could lead to slow ICE reconnection. Some mobile and corporate networks also blocked or degraded WebRTC's preferred UDP paths. TURN, including relay over TCP, improved reachability but added another network hop and, in our measurements, more latency.

We replaced the WebRTC video stream with VNC's Remote Framebuffer protocol, carried over a secure WebSocket and rendered with noVNC. RFB represents display updates as rectangles, which suited our mostly static verification pages: users often pause to read or type, so the display changes only intermittently. This is a workload-specific trade-off; WebRTC remains better suited to high-motion content.

When the page barely moves

continuous frames · changed rectangles

For Popcorn, the change reduced the live-view path to one WebSocket connection, shortened recovery after app switches, and produced more predictable behavior on slow mobile and corporate networks.

A smaller image for a narrower job

Changing the transport exposed another problem: the runtime carried far more than our live-view path needed. It still depended on the Kernel Images API and the Neko/WebRTC runtime, along with the supporting machinery around them. That made browser startup, image builds, and our development loop slower.

So we rebuilt the runtime image from scratch around one job: running Popcorn's LiveView in production. The new image contains the browser, lightweight desktop, VNC/noVNC viewer, Reclaim proof endpoint, proxying, and attestation. It no longer depends on the Kernel Images API or the Neko/WebRTC runtime.

Runtime metricBeforeAfter
Browser boot~15 seconds~2 seconds
Unpacked image size2.6 GB0.9 GB
Image build~30 minutes~10 minutes

These are internal before-and-after measurements for the runtime image, separate from the request-to-allocation latency discussed later. The smaller stack also gave us a cleaner build loop and much less software to operate.

Running the mobile gauntlet

Most Reclaim sessions happen on phones. The viewers we tested could show a desktop browser on a small screen, but we wanted Popcorn to feel like a native mobile browser.

Typing had to feel immediate. Zoom had to follow your fingers. Prompts and forms had to fit the screen, and switching apps could not lose the session. We built those behaviors into the viewer itself.

Same phone. Different browser.

from remote desktop to native-feeling
01 · Type

Typing should feel immediate

Before
9:41Remote view
Enter verification code
84?9
delayed inputwaiting…
keys can arrive late or incorrectly
Now
9:41Popcorn · secure
Enter verification code
8429
instant feedbackconnected
stays responsive on a slow network
types like a local keyboard
02 · Pinch and zoom

The page should follow your fingers

Before
9:41Remote view
cropped
cropped, blurry, and delayed
Now
9:41Popcorn · secure
full width
smooth zoom handled on the phone
03 · Use the page

Controls should fit the phone

Before
9:41Remote view
Verify your account
Focused field
Are you sure?
field hidden
fields and prompts can leave the screen
Now
9:41Popcorn · secure
Verify your account
Focused field
Are you sure?
CancelContinue
forms behave like mobile controls
04 · Switch apps

Come back where you left off

Before
9:41Remote view
Verification in progress
Messages
Your verification code is
8429
stale viewer
return to a black frame
Now
9:41Popcorn · secure
Verification in progress
8429
Messages
Your verification code is
8429
back where you left off
the session stays with you

Popcorn now owns the mobile experience. Integrators get native-feeling typing, zoom, gestures, dialogs, and reconnection without rebuilding them inside their app.

What it looks like in production

By August 5, 2026, Popcorn had moved well beyond a prototype. Over the previous 30 days, the fleet created 102,859 sessions and ended 102,809. Those sessions accounted for 10,605 hours and 11 minutes of browser time, with an average lifetime of 6 minutes 11 seconds. The fleet handled an average of 2.38 new sessions per minute.

Live from the last 30 days

Production pulse!

Ending Aug 5, 2026
Now with
more traffic!
102,859
sessions created
10,605
ended-session hours
2.38
sessions per minute
Sessions createdActual results!

Traffic grew from 2,825 to 11,059 sessions per interval. Operators are standing by.

The speed users feel first is allocation. We measure it from the moment the control plane receives a request until the regional pool manager returns the signed connection details for an assigned browser. That took 470 ms at p50 and 889 ms at p95.

On provisioned capacity, the minimal image can start a fresh browser pod in roughly 2–3 seconds. Once the cloud prerequisites are available, we can bring an entire regional Popcorn cluster to Ready in roughly 20 minutes. That lets us add capacity close to users wherever compatible TEE infrastructure is available.

What we learned

Start managed. Fork when the requirements sharpen. Specialize after learning.

The path to Popcorn was not “build versus buy.” Using Kernel let us validate the product before building browser infrastructure. Forking its open-source image taught us which parts of the stack mattered. Operating that fork exposed the limits of a general-purpose image for our workload. Only then did a minimal image, a mobile-native viewer, and our own scaler become the sensible choice.

Let real constraints choose the technology.

Cloud regions, mobile networks, and phone keyboards chose more of this architecture than fashion did. Each change came from watching the verification flow fail under a real constraint, then fixing that constraint at the layer that owned it.

Security becomes infrastructure topology.

Once every browser must run inside a TEE, confidential-computing availability becomes part of scheduling. It shapes cloud selection, regional expansion, node pools, images, attestation, capacity planning, and failure handling. A security requirement no longer stays in the security layer.

Popcorn now gives apps a much lighter way to integrate Reclaim while keeping the sensitive browser workload inside an attestable environment. It took a hosted service, an open-source fork, a cloud migration, a new streaming path, and an unreasonable amount of attention to mobile keyboards to get there. The runtime image, fleet configuration, attestation design, and full repository are open source.

Try Popcorn or start with the repository.

Questions, feedback, or want to deploy Popcorn? Email Abdul or Srivatsan, or reach Abdul on X.

Copyright © 2026 Reclaim Protocol. All rights reserved.