Litewave
Provides Phoenix/Elixir runtime tools for a running application via the development-only litewave_phoenix dependency. Over a private Unix socket it exposes tools for retrieving docs, source locations, logs, evaluation, and SQL, usable from the CLI or MCP server without an open browser.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LitewaveCan you screenshot the current page?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Litewave
Local browser access and Phoenix runtime tools for coding agents.
Litewave keeps a dedicated Chromium open on your machine and lets an agent drive it through a CLI or an MCP server: navigate, click, fill, upload, download, screenshot, and read the accessibility tree. Every mutation is journaled with a caller-chosen request ID, so a lost response is reported as unknown, never as success, and is never replayed automatically.
For Phoenix applications, an optional development dependency publishes runtime tools (docs, source locations, logs, evaluation, SQL) on a private Unix socket at boot. No port, token, or endpoint change is needed, and the tools work without an open browser.
Everything stays on your machine. There is no Litewave account, relay, or model subscription.
Requirements
macOS. Linux runs in CI but is not yet a supported platform.
Node 24.21.0 or newer.
.nvmrcand.node-versionpin the development version.Your application already running. Litewave never starts, restarts, or repairs it.
Related MCP server: chrome-devtools-mcp
Install
CLI and MCP server
npm install -g litewave
litewave browser installbrowser install downloads the pinned Chromium build once. Nothing is installed automatically. Prefer not to install globally? Prefix every command below with npx litewave instead. For MCP use, install globally (or as a project devDependency) so the command path init prints stays stable; an npx cache path is temporary.
Phoenix runtime tools
Add the development-only dependency and restart your app:
# mix.exs
{:litewave_phoenix, "~> 0.1", only: :dev}That is the whole install. Details, options, and the alternative HTTP transport are in the Phoenix package README.
First session
Register the project. When the Phoenix app is running with litewave_phoenix, the app URL is read from it; otherwise pass --app.
litewave init --project /absolute/path/to/app
litewave browser open --project /absolute/path/to/appinit prints an MCP server entry with absolute Node and CLI paths. Add it to your agent's MCP configuration; Litewave never edits agent configuration itself. Sign into your app normally in the dedicated browser. The profile persists, so you sign in once.
Every browser operation uses the same JSON schema and response envelope through the CLI, the library, and the MCP browser tool. List tabs, then act on one:
litewave call --project /absolute/path/to/app --json '{"method":"tabs","requestId":"tabs-1"}'{
"method": "navigate",
"requestId": "home-1",
"tabId": "TAB_ID",
"url": "http://localhost:4000"
}{
"method": "click",
"requestId": "export-1",
"tabId": "TAB_ID",
"target": { "kind": "role", "role": "button", "name": "Export" },
"postcondition": {
"target": { "kind": "role", "role": "heading", "name": "Export ready" },
"state": "visible"
}
}Use a new request ID for each intended mutation. After a lost response, query action_status with actionId: "export-1": the same ID returns the prior state and never clicks again. dispatched means the browser call completed; postcondition_met confirms the requested observation; outcome_unknown means investigate, not that the app failed.
Runtime tools need no browser:
litewave phoenix status --project /absolute/path/to/app
litewave phoenix call --project /absolute/path/to/app --tool get_docs --json '{"reference":"Enum.map/2"}'
litewave mcp --project /absolute/path/to/appGuides
Phoenix package: install, options, tool behaviour, the HTTP Plug alternative.
Reference
Locators, waits, files
Locators support exact role/name, test ID, and explicit CSS. Ambiguous targets fail. Supply revision from a snapshot to reject an action after navigation.
snapshot: bounded accessibility text, optionally scoped to a target. Truncation is explicit.wait: a target,state: "visible"or"hidden", and optionaltimeoutMsup to 30 seconds.screenshot: viewport by default,fullPage: true, ortargetfor an element. Returns a local PNG path; password inputs are masked.upload: a file-inputtargetand absolutepathsinside registered upload roots.paths: []clears the selection. Selection does not confirm server import.Downloads are captured from every tab from creation, before click dispatch. Poll
downloadsforcomplete, retainedpath, size, and SHA-256. Each download gets its own directory.
Full schemas: src/protocol.ts. Library exports: src/index.ts.
Upload folders
Uploads are optional. Browser uploads send local files to your app, so Litewave limits selection to folders you allow explicitly; the agent cannot pick arbitrary local files. Use an existing folder of files you intend to upload, such as a fixture directory. Subfolders are allowed; symlinks cannot escape the boundary.
litewave init --project /absolute/path/to/app --upload-root /absolute/path/to/fixturesFor an existing registration, doctor shows the configured folders and the registration file. To change them: finish active actions, stop, edit only uploadRoots in that file, then browser open. There is no registration-update command yet.
Browser version and profile transitions
Litewave pins Playwright 1.62.0 / Chromium 151.0.7922.34 to avoid a reproduced Chromium 153/154 crash on restart with retained downloads; see the investigation. It refuses to open a profile last used by a newer Chromium. To create a compatible replacement while keeping the old profile:
litewave stop --project /absolute/path/to/app
litewave browser open --project /absolute/path/to/app --fresh-profileSign in again, or add --storage-state /absolute/path/to/state.json to import an explicitly exported Playwright storage state. That file contains authentication: keep it private and delete it after import. Litewave never exports authentication or copies cookies from another browser.
Ownership and troubleshooting
litewave doctor --project /absolute/path/to/app
litewave stop --project /absolute/path/to/appdoctor probes the app over HTTP, the browser worker, and the Phoenix runtime separately. stop closes the owned browser and worker and refuses while an action or download is active. Closing an MCP client only detaches it.
State lives in ~/.litewave with owner-only permissions. LITEWAVE_HOME relocates it: use a short absolute path (socket paths are limited to about 100 bytes on macOS), not a symlink, and set the same value for the app and every CLI/MCP client of a project; the MCP entry printed by init includes it. Project identity is the canonical project directory, so each worktree gets its own registration, profile, and runtime socket.
Litewave never kills an unknown browser or deletes a profile lock. After a verified close it may let Chromium reacquire its own leftover lock only when the recorded owner is absent and the profile evidence matches. Worker death currently loses volatile tab state; saved downloads remain on disk.
Status
Litewave is a development alpha. Browser access and the Phoenix runtime tools work and are covered by contract tests, real-browser suites, and a real MCP client over the socket. Not yet implemented: automatic worker recovery, snapshot references and frames, dialogs, drag and scroll, enforced read-only SQL, and Windows or Linux support. The capability matrix lists what is tested and what remains.
Contributing and licence
Start with CONTRIBUTING.md. Original code is MIT licensed; dependency and upstream notices are in NOTICE. The Phoenix package additionally carries Apache-2.0 attribution for code adapted from Tidewave.
This server cannot be deployed
Maintenance
Related MCP Connectors
Real Chrome for agents: start a browser, read pages as numbered markdown, click, type, hand off.
Provides cloud browser automation capabilities using Stagehand and Browserbase, enabling LLMs to i…
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
- TabfleetOAuthcom.tabfleet
Launch, inspect, control, and share isolated cloud browsers for your agents.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser for automated debugging, performance analysis, and web interaction. It leverages Puppeteer and Chrome DevTools to provide capabilities like network monitoring, console logging, and automated browser actions.-
- AlicenseNot gradedqualityDmaintenanceLets coding agents control and inspect a live Chrome browser via the Model-Context-Protocol, providing advanced browser debugging, performance insights, and reliable automation.5 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and clients to control a real Chromium browser through MCP tool calls, including navigation, clicking, typing, JavaScript evaluation, screenshots, and DOM snapshots. Supports multiple isolated sessions over authenticated HTTP with no disk writes.Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI clients to control the user's already-open, logged-in browser pages in real time over a local WebSocket channel, without Playwright, Puppeteer, Selenium, or any browser driver. Exposes tools for navigation, semantic page snapshots, clicking, form filling, JavaScript evaluation, screenshots, network monitoring, cookie handling, and tab management via the CDP.20MIT