Agent Runtime
Status: Connected
Parsing documentation...
Extracted api references
Generating type definitions...
opensteeropensteer
Y Combinator logoBacked by Y Combinator.

The most comprehensive browser automation framework for AI

Enterprise-grade automation at scale.

Custom plans, unlimited concurrent sessions, dedicated proxies, and advanced support for teams that need more.

+ self-service sso
+ unlimited concurrent sessions
+ custom audit logs
+ advanced captcha bypass
+ dedicated support
view pricing

Simple, transparent pricing.

Start for free, upgrade when you need to scale. Everything you need to build robust AI agents.

Core Concepts

Selectors

Element resolution chain, selector cache, and deterministic replay.

Resolution chain

Descriptor-aware actions (click, input, hover, select, scroll) resolve their target in this order:

StepSourceWhen
1Persisted pathdescription matches a cached selector
2Element counterelement number from current snapshot
3CSS selectorExplicit selector provided
4LLM resolutiondescription provided, no cache hit
5ErrorNo resolution possible

When steps 2-4 succeed and description is present, the resolved path is persisted for replay.

// First run: LLM resolves "login-button", persists path
await opensteer.click({ description: 'login-button' })

// Subsequent runs: uses persisted path (no LLM call)
await opensteer.click({ description: 'login-button' })

Selector cache storage

Cache location: .opensteer/selectors/<namespace>/

  • index.json — registry of cached selectors.
  • <descriptor-id>.json — individual selector records with method, description, DOM path, and metadata.

Cache persistence

Each record stores createdAt, updatedAt, and sourceUrl. Records are keyed by (method, descriptionHash, siteOrigin).

Cloud cache import

Upload your local cache to the cloud for replay continuity:

POST /selector-cache/import

See Cloud API for endpoint details.

Cache invalidation

Wipe all cached selectors for the current namespace programmatically:

await opensteer.clearCache()

Or delete the directory manually:

rm -rf .opensteer/selectors/<namespace>