Deploy Obscura – Rust Headless Browser
A Rust headless browser for AI agents, web automation, and data extraction.
obscura
Just deployed
Deploy and Host Obscura Headless Browser (Built in Rust)
About Hosting Obscura
Obscura is a headless browser built in Rust for AI agents, web automation, and data extraction. It runs JavaScript with V8, so your worker can read pages that load their content dynamically. Connect with Puppeteer or Playwright using the Chrome DevTools Protocol (CDP).
Why Deploy Obscura on Railway
Run Obscura as a standalone browser service alongside your app or worker. Railway private networking keeps the connection internal, and a bearer token protects the browser endpoint. The template includes a readiness check and uses the official Obscura v0.2.6 release, verified by checksum.
Common Use Cases
- Give an AI agent access to public pages that require JavaScript to load.
- Extract text, links, or tables from public sources.
- Check that a page renders expected content in an automated test.
Dependencies for Obscura
Deployment Dependencies
The template creates one service. A client in the same Railway environment can connect using Puppeteer or Playwright.
Set the required OBSCURA_CDP_TOKEN to a unique random secret when deploying. Generate one with openssl rand -hex 32.
Connect on Railway
Use the private hostname from a service in the same Railway environment. Set OBSCURA_HOST to the browser service's private hostname and pass that service's OBSCURA_CDP_TOKEN to the client as a secret. Set OBSCURA_PORT to the browser port shown in its startup log. You can set PORT=9222 on the browser service to choose a fixed port.
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({
browserWSEndpoint: `ws://${process.env.OBSCURA_HOST}:${process.env.OBSCURA_PORT}/devtools/browser`,
headers: { Authorization: `Bearer ${process.env.OBSCURA_CDP_TOKEN}` },
});
try {
console.log(await browser.version());
} finally {
await browser.disconnect();
}
Railway checks GET /healthz. Browser discovery and WebSocket connections require the token. Keep the service on private networking and store the token as a service variable.
Template Content
obscura
lifeofjer/obscuraOBSCURA_CDP_TOKEN