---
title: "Deploy Steel Browser | Open-Source Headless Browser API"
description: "Self-host Steel Browser. Headless API for AI agents, scraping & automation"
category: "Automation"
url: https://railway.com/deploy/steel-browser
---

# Deploy Steel Browser | Open-Source Headless Browser API

Self-host Steel Browser. Headless API for AI agents, scraping & automation

**[Deploy Steel Browser | Open-Source Headless Browser API on Railway](https://railway.com/template/steel-browser)**

- **Creator:** Heimdall
- **Category:** Automation
- **Total deploys:** 17

## Template content

### Steel Browser https://raw.githubusercontent.com/steel-dev/steel-browser/main/images/steel_header_logo.png

- **Image:** ghcr.io/steel-dev/steel-browser:latest
- **Public domain:** Yes

## Documentation

![Steel Browser logo](https://external-preview.redd.it/the-open-source-browser-api-for-ai-agents-v0-U6oclm2ELerHWzGcmMpJIiNJQiiNFR9X4So3v7TJX6s.jpg?width=640&crop=smart&auto=webp&s=37e554128c6934648f88856d8578c6c720fb5c17)


# Deploy and Host Steel Browser on Railway

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/steel-browser?referralCode=QXdhdr&utm_medium=integration&utm_source=template&utm_campaign=generic)

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/pdf` endpoints 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`](https://github.com/steel-dev/steel-browser/pkgs/container/steel-browser)
- **GitHub:** [steel-dev/steel-browser](https://github.com/steel-dev/steel-browser)
- **Docs:** [docs.steel.dev](https://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.


## Similar templates

- [N8N Main + Worker](https://railway.com/deploy/n8n-main-worker) — Deploy and Host N8N with Inactive worker.
- [Evolution API with n8n](https://railway.com/deploy/evolution-api-with-n8n) — [Jul'26] WhatsApp automation platform using Evolution API, n8n & PostgreSQL
- [Postgres Backup](https://railway.com/deploy/postgres-s3-backups) — Cron-based PostgreSQL backup to bucket storage

Open this page in a browser: https://railway.com/deploy/steel-browser
