
Deploy Steel Browser | Open-Source Headless Browser API
Self-host Steel Browser. Headless API for AI agents, scraping & automation
Steel Browser
Just deployed
/data

Deploy and Host Steel Browser on Railway
Deploy Steel Browser on Railway to get a fully managed, self-hosted headless browser API for your AI agents and automation pipelines. Steel Browser is an open-source browser sandbox that provides REST and WebSocket APIs on top of Chrome, with built-in session management, anti-detection, ad blocking, and proxy support. This template deploys the combined Steel Browser image with persistent log storage on a Railway volume.
Getting Started with Steel Browser on Railway
After deployment, visit your Railway public URL to confirm the API is live — the root path redirects to /ui, where you can create browser sessions, view live sessions, and inspect logs. Navigate to /documentation for the full Swagger API reference. To verify the service is healthy, check /v1/health — it should return {"status":"ok"}. Create your first session by sending a POST to /v1/sessions, then connect to the returned WebSocket URL using Playwright or Puppeteer. The session persists cookies, localStorage, and auth state across requests.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(
"wss://your-steel-instance.up.railway.app/v1/cdp/session-id"
)
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
About Hosting Steel Browser
Steel Browser is an open-source headless browser API built for AI agents, web scrapers, and automation tools. It wraps Chromium in a managed REST/WebSocket API layer, handling the infrastructure complexity of running browsers at scale.
- Session management — persistent browser sessions with cookies, localStorage, and authentication state
- Anti-detection — stealth plugins, fingerprint management, and human-like browsing patterns
- Built-in scraping —
/v1/scrape,/v1/screenshot, and/v1/pdfendpoints for quick data extraction - CDP access — full Chrome DevTools Protocol via WebSocket for Puppeteer, Playwright, and Selenium
- Ad blocking and proxy support — configurable per session via API parameters
- Live session viewer — built-in UI dashboard for debugging and monitoring sessions
Why Deploy Steel Browser on Railway
Self-host Steel Browser on Railway for instant headless browser infrastructure:
- One-click deploy with zero Chrome/Chromium dependency management
- Persistent log storage via Railway volumes
- Private networking for secure agent-to-browser communication
- Auto-scaling with Railway's usage-based pricing — pay only for compute used
- No vendor lock-in — full open-source codebase
Common Use Cases for Self-Hosted Steel Browser
- AI agent web browsing — give LLM-powered agents the ability to navigate, fill forms, and extract data from any website
- Large-scale web scraping — run parallel browser sessions for data collection pipelines and RAG ingestion
- QA and testing automation — automated end-to-end testing with real browser rendering and JavaScript execution
- Web monitoring — scheduled page checks, screenshot diffing, and uptime monitoring behind auth walls
Dependencies for Steel Browser on Railway
ghcr.io/steel-dev/steel-browser:latest— combined API + UI image with bundled Chromium
Environment Variables Reference for Steel Browser
| Variable | Value | Description |
|---|---|---|
PORT | 3000 | HTTP server listening port |
DOMAIN | ${{RAILWAY_PUBLIC_DOMAIN}} | Public-facing domain for the API |
CDP_DOMAIN | ${{RAILWAY_PRIVATE_DOMAIN}}:9223 | Chrome DevTools Protocol endpoint |
LOG_STORAGE_ENABLED | true | Enable persistent browser logs |
LOG_STORAGE_PATH | /data/browser-logs.duckdb | DuckDB log file path on volume |
Deployment Dependencies
- Runtime: Node.js 22 + Chromium (bundled in Docker image)
- Docker image:
ghcr.io/steel-dev/steel-browser - GitHub: steel-dev/steel-browser
- Docs: docs.steel.dev
Hardware Requirements for Self-Hosting Steel Browser
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2+ vCPU |
| RAM | 2 GB | 4 GB |
| Storage | 1 GB | 10 GB |
| Runtime | Docker 20.10+ | Docker 20.10+ |
Chromium is memory-intensive. Each concurrent browser session adds ~200–500 MB of RAM depending on page complexity. Scale memory with expected concurrency.
Self-Hosting Steel Browser with Docker
Run Steel Browser locally with a single Docker command:
docker run -d \
--name steel-browser \
-p 3000:3000 \
-p 9223:9223 \
-v steel-data:/data \
-e LOG_STORAGE_ENABLED=true \
-e LOG_STORAGE_PATH=/data/browser-logs.duckdb \
ghcr.io/steel-dev/steel-browser:latest
Or use Docker Compose for the split API + UI setup:
services:
api:
image: ghcr.io/steel-dev/steel-browser-api:latest
ports:
- "3000:3000"
- "9223:9223"
volumes:
- logs:/data/logs
environment:
- DOMAIN=localhost:3000
- CDP_DOMAIN=localhost:9223
- LOG_STORAGE_ENABLED=true
- LOG_STORAGE_PATH=/data/logs/browser-logs.duckdb
ui:
image: ghcr.io/steel-dev/steel-browser-ui:latest
ports:
- "5173:80"
environment:
- API_URL=http://api:3000
volumes:
logs:
How Much Does Steel Browser Cost to Self-Host?
Steel Browser is fully open-source under the Apache 2.0 license — there are no licensing fees. The cloud-hosted version at steel.dev offers a free tier (100 hours/month) and paid plans starting at $29/month. When self-hosted on Railway, you pay only for Railway infrastructure — typically $5–15/month depending on usage and concurrency. There are no per-session or per-API-call charges when self-hosting.
Steel Browser vs Browserless
| Feature | Steel Browser | Browserless |
|---|---|---|
| License | Apache 2.0 (open-source) | Proprietary + open-source edition |
| Self-hosting | Free, Docker image | Free (limited), paid tiers |
| AI agent focus | Primary design goal | General browser automation |
| Session persistence | Built-in (cookies, localStorage) | Available |
| Anti-detection | Built-in stealth plugins | Built-in |
| CAPTCHA solving | Built-in (cloud) | Not built-in |
| MCP server | Official steel-mcp-server | Community |
| Pricing (cloud) | Free 100h/mo, $29/mo starter | $140/mo starter |
Steel Browser is purpose-built for AI agent workflows with first-class session management, while Browserless targets broader browser automation with a more mature ecosystem.
FAQ
What is Steel Browser and why self-host it? Steel Browser is an open-source headless browser API that gives AI agents and automation scripts full control over Chrome instances via REST and WebSocket APIs. Self-hosting eliminates per-session cloud costs and keeps your browsing data private.
What does this Railway template deploy?
This template deploys a single Steel Browser service using the combined ghcr.io/steel-dev/steel-browser:latest Docker image. It includes both the API server (port 3000) and the web UI dashboard, with a Railway volume for persistent log storage.
How do I connect Playwright or Puppeteer to self-hosted Steel Browser on Railway?
Create a session via POST /v1/sessions, then use the returned websocketUrl with browser.connect_over_cdp() (Playwright) or puppeteer.connect() (Puppeteer). Use your Railway public domain as the base URL.
Does Steel Browser on Railway support concurrent browser sessions? Yes. Each session runs in an isolated browser context. Concurrency is limited by available RAM — budget ~300–500 MB per active session and scale Railway's memory allocation accordingly.
How do I scrape a web page using Steel Browser's API?
Send a POST request to /v1/scrape with the target URL. Steel returns the page content as clean markdown, ready for LLM consumption or data pipelines. No browser session management needed for simple scrapes.
Is the Chrome DevTools Protocol port (9223) exposed publicly?
No. On Railway, only port 3000 is exposed via the public domain. The CDP port (9223) is accessible only via Railway's private network using ${{RAILWAY_PRIVATE_DOMAIN}}:9223, keeping debugging access internal.
Template Content
Steel Browser
ghcr.io/steel-dev/steel-browser:latest