Skip to content

feat(computer): a chromium computer app in a shipped browsers bundle - #435

Merged
earakely-scale merged 5 commits into
mainfrom
edgararakelyan/fd-4370-m16-ready-made-chromium-computer-app
Nov 2, 2026
Merged

earakely-scale merged 5 commits into
mainfrom
edgararakelyan/fd-4370-m16-ready-made-chromium-computer-app

Conversation

@earakely-scale

@earakely-scale earakely-scale commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

What

A ready-made Chromium for computers: the chromium computer app, shipped in a new browsers bundle.

  • The bundle sits beside agents, computers and drivers, and like them is named for what it holds. The name still fits once Chromium also runs outside a computer.
  • The app is src/agent_env/browsers/envs/chromium/, an env.toml and chromium.py, which holds all of it:
    • Chrome for Testing 156.0.8078.4, the build Playwright 1.64.1 pins. One archive per arch (amd64, arm64), each by sha256. Google ships no Linux arm64 Chrome, so it has to be CfT.
    • The packages Ubuntu 24.04 lacks for it.
    • A system install step that unpacks the archive (with unzip, which keeps the execute bits) and writes the managed policies.
    • The command: no sandbox, no /dev/shm, no first run, --class=Chromium (which the launch matches), its profile and a cache outside it, then the start URLs. No proxy flags.
    • Launched at boot, ready when its window shows. Its profile (.config/chromium) is its data, so a reset clears it. A start_urls setting, empty by default.
  • Listing apps = ["chromium"] in a computer's env.toml gives it a browser.

Nothing changes in agentenv-protocol. Per the website browser design, the protocol will get WebsiteBrowserEnvironment, the base class for what agentenv owns about any browser (flags, policies, CA trust, browser/v1 over CDP), and this app becomes its subclass. A particular Chromium build belongs to the app that ships it. An app elsewhere that wants the same browser, such as the bench's, pins it itself, which also keeps a benchmark's browser fixed whatever a framework release ships.

Policies

Chrome for Testing reads managed policies only from /etc/opt/chrome_for_testing/policies/managed, not Chromium's folder or Chrome's.

Without them a fresh window shows three things: CfT's "only for automated testing" bar, a --no-sandbox warning bar and a "Sign in to Chromium?" pill. The policy set turns off sign-in, sync, promotional tabs, the default-browser prompt, telemetry, password and autofill prompts, translation, component updates, and geolocation and notification prompts. CommandLineFlagSecurityWarningsEnabled=false also removes both bars.

Tests

  • tst/unit/env/envs/test_chromium_app.py:
    • the installed browsers bundle parses to @local/agentenv-framework/browsers/chromium with the chromium alias;
    • the class declares its archive per arch, packages, profile path, launch, install step and start_urls;
    • the install against a fake archive keeps the execute bit and writes the policies;
    • the exact command.
  • The shipped-bundle, clean-wheel and installer-journey lists now include browsers.
  • tst/integration/computer/chromium_app_test.py (int_test_slow): a desktop on ubuntu-24.04 with apps = ["chromium"].
    • Gate 3 makes this machine's arch ready.
    • A deploy with two start_urls shows exactly one Chromium window, on the first page, and Control+Tab through MCP reaches the second.
    • The policies file is where CfT reads it.
    • A data reset through the control token clears the profile and opens the window again.
    • Ran on an amd64 EC2 box.

Part of FD-4370 (M1.6).

🤖 Generated with Claude Code

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge; no blocking issue was found.

Summary

Adds the shipped browsers bundle with a chromium computer app.

  • Linux computers can launch a built-in Chromium browser.
  • The shipped browsers bundle makes Chromium available by the name chromium.

No new actionable issues were found in the changes since the previous review.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    A["Computer lists chromium"] --> B["Resolve browsers bundle"]
    B --> C["Download archive for target architecture"]
    C --> D["Unpack browser and write policies"]
    D --> E["Launch Chromium at boot"]
    E --> F["Wait for Chromium window"]
    G["Reset app data"] --> H["Clear browser profile"]
    H --> E
Loading

Reviews (4) · Last reviewed commit: "refactor(computer): keep chromium's pin ..." · Reviewed by Greptile

earakely-scale and others added 2 commits November 1, 2026 16:24
…ny app

agentenv_protocol.website_browser holds Chromium's install for a computer: Chrome for Testing
156.0.8078.4, the build Playwright 1.64.1 pins, for amd64 and arm64, by sha256; the packages it needs;
ChromiumInstall, whose install step unpacks it with unzip and writes managed policies where Chrome
for Testing reads them (no sign-in, sync, first-run or promotional tabs, prompts, updates or warning
bars); and chromium_command, unsandboxed, without /dev/shm and with no proxy.

The new apps bundle ships chromium, a computer app on that install that opens at boot on its
start_urls, its profile its data, so each deploy and each reset starts clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hromium test bundle

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@earakely-scale
earakely-scale requested a review from a team as a code owner November 2, 2026 00:34
earakely-scale and others added 3 commits November 1, 2026 16:48
A launch is ready on any window of its class, so two apps on one computer that start Chromium with the same class
would each take the other's window for their own. `chromium_command` takes `window_class`, `WINDOW_CLASS` by default.
The installer's container journey counts the apps bundle among the shipped ones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shipped bundles are named for what they hold (agents, computers, drivers), and chromium will also run outside a
computer once it moves onto WebsiteBrowserEnvironment, so its bundle is `browsers`, not `apps`. Its id becomes
`@local/agentenv-framework/browsers/chromium`; the `chromium` alias is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…package

The protocol package is the SDK environments are written with. Its browser piece is a base class for website
browsers, still to come, while a particular build, its archives, packages, install step, policies and command, belongs
to the app that ships it. So all of it moves into the browsers bundle's chromium.py, and
agentenv_protocol.website_browser goes. An app that wants the same Chromium, such as the bench's, pins it itself, which
also keeps its browser fixed whatever a framework release ships. With no other app starting Chromium through it, the
command no longer takes a window class.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@earakely-scale earakely-scale changed the title feat(computer): a chromium computer app, and Chromium's install for any app feat(computer): a chromium computer app in a shipped browsers bundle Nov 2, 2026
@earakely-scale
earakely-scale merged commit 34153ed into main Nov 2, 2026
37 checks passed
@earakely-scale
earakely-scale deleted the edgararakelyan/fd-4370-m16-ready-made-chromium-computer-app branch November 2, 2026 01:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant