projects/browser-orchestrator/

02 · browser session orchestrator

Browser Orchestrator

Rust · Restate · axum · Go tester · Jan '26 · source

A Rust-based microservice orchestration system aided by Restate for spawning multiple browser sessions exposed through a single axum server. It uses Restate for durable, stateful execution and axum as a thin HTTP compatibility layer, and it brings durable execution to fragile browser sessions across 1,000+ concurrent sessions.

Terminal recording of the Go tester creating, fetching and deleting browser sessions through the orchestrator's HTTP API on localhost:3000, each request returning 200 OK.
Demo: the Go tester creating, getting and deleting sessions through localhost:3000.

Summary

client ──HTTP──▶ axum :3000 ──▶ Restate ingress :8080 ──▶ Pool (virtual object) :4000
                 schema adapter        durable, stateful execution  │
                                                                    ├─▶ steel-browser :port₁
                                                                    ├─▶ steel-browser :port₂
                                                                    └─▶ steel-browser :portₙ

Restate is responsible for:

Each steel-browser instance runs exactly one browser session and exposes its own HTTP API. The orchestrator:

Axum serves only as a schema adapter, exposing endpoints compatible with the original steel-browser API and forwarding requests to Restate. All orchestration logic and state management live exclusively in Restate.

The primary design principle is statefulness first: session and worker state is always derived from Restate-managed state, never from in-memory caches.

How the pool behaves

Testing

The tester has been written in Go, encompassing TTL timeout checks, session/worker scaling, health/status checks, and notable edge cases.

Trade-offs

This project optimizes for durability, explicit, persisted state, and correctness under retries and partial failures. It intentionally sacrifices simplicity of deployment, stateless request handling and HTTP-layer ergonomics.

The focus was on Restate's execution and persistence model with orchestrating parallel reliable sessions, rather than building a fully production-ready control plane.

Production gaps & improvements

Scaling

The current scaling model assumes one orchestrator per region, with each orchestrator managing workers local to that region. In a Kubernetes-based deployment, workers would be scheduled as pods rather than OS processes, and session routing would rely on Kubernetes networking instead of local ports. Longer-term, the worker abstraction would be generalized so steel-browser is just one backend among others.