Open WebIDE

A self-hosted browser IDE for coding with local LLMs: edit files, run an agent, review its changes, and use Git and a terminal in one workspace. Connect to Ollama or OpenAI-compatible model servers such as llama.cpp and LM Studio.

The Rust frontend and backend run on WebAssembly; a native execution bridge provides terminals, commands, Git operations, and persistent agent runs. Projects, sessions, and preferences live in SQLite, so you can resume from another browser.

What you can do

See the roadmap for remaining work and the changelog for completed changes.

The project site guide explains how the landing page and documentation are built and published to GitHub Pages from this repository.

Run with Docker

From a checkout of this repository:

docker compose up --build

Open http://localhost:8080/ and register the first account. Compose mounts ~/source as /workspace, persists the database in the openwebide-data volume, and exposes the bundled bridge on port 3001. Choose a different workspace with:

OPENWEBIDE_WORKSPACE=/path/to/projects docker compose up --build

For a standalone container:

docker build -t open-webide .
docker run -d --name open-webide \
  -p 8080:3000 -p 3001:3001 \
  -v openwebide-data:/app/.spin -v ~/source:/workspace open-webide

The workspace mount is accessible to file tools and the agent; choose its scope accordingly. .spin/ is excluded from file access. The bundled bridge persists its secret at /app/.spin/bridge-secret; set OPENWEBIDE_BRIDGE=0 to disable it and use SSE chat instead. If overriding the container command, retain spin up --direct-mounts --allow-transient-write so edits reach the mounted files. Legacy remote paths are migrated automatically on startup.

For Linux services, see the Podman quadlet guide. For private HTTPS access from phones and other devices, the recommended approach is Tailscale Serve in a separate container.

Run from source

Install Rust, Spin 4.x, and Trunk. Rust's toolchain and WASM targets are pinned in rust-toolchain.toml and installed by rustup on first build. The browser syntax parser also needs Clang (Xcode Command Line Tools on macOS; sudo apt-get install clang on Debian/Ubuntu). Rust's pinned llvm-tools component supplies the WASM archiver; the build selects it automatically, including on macOS where Apple's archiver does not retain WASM objects. Host Git operations require Git 2.23 or newer.

Build from the repository root:

NO_COLOR=true spin build
cargo build -p openwebide-bridge

Start Spin and the bridge in separate terminals:

spin up --direct-mounts --allow-transient-write
./target/debug/openwebide-bridge --port 3001 --workspace ../.. --host 127.0.0.1 \
  --backend-url http://127.0.0.1:3000/api --secret-file /tmp/openwebide-bridge-secret

Open http://localhost:3000/. The bridge workspace must match the backend's files.source in spin.toml (currently ../..). Both services need normal host filesystem access: launching them inside a coding agent's sandbox can prevent writes to other projects. Keep the Spin flags above to avoid editing a temporary copy of the workspace.

Open a project

After signing in, add your model server in Settings, choose a primary model, and open a project. Both workspace modes share the editor and agent features:

Mode Folder picker File access
Remote Folders on the Open WebIDE host Backend workspace mount
Local Folders on the browser's device Chromium File System Access API

Local mode stores browser directory handles in IndexedDB. For commands and Git, a bridge on that device must also see the selected folder: start it inside the project or with a workspace containing it within five directory levels. A temporary probe file verifies the match and is removed afterward. If the folder is unreachable, those tools are hidden and chat explains how to enable them. An interrupted local run can be continued with Resume.

Connect over the LAN

Use http://<host-ip>:8080 for Docker or port 3000 for a source build. For a native bridge, bind it to 0.0.0.0 instead of 127.0.0.1 so browsers can reach port 3001.

When using a custom hostname, set OPENWEBIDE_BRIDGE_ALLOWED_HOSTS=<hostname>. If the page and bridge use different hostnames, also set OPENWEBIDE_BRIDGE_ALLOWED_ORIGINS=http://<page-host>:<port>. Both accept comma-separated lists and are passed through by Compose. A backend connecting to a bridge over a non-loopback address also needs an explicitly configured shared secret; see the bridge reference.

Accounts and agent execution

Accounts use argon2id password hashing and HttpOnly session cookies. Registration closes after the first account. Logging out invalidates that user's sessions across devices. Preferences and session state are database-backed rather than localStorage.

File tools are confined to the workspace; commands and Git run as the bridge's host user. Approval modes control when the agent asks permission. Before overwriting binary or large files, the agent keeps originals in .openwebide/backups/ so Reject can restore them; retain those backups until the edits no longer need restoration.

The backend can reach LAN and public model servers, search, and documentation pages. Web fetching blocks cloud metadata addresses. fetch_web_page goes through the approval policy; search_web is auto-approved. The bridge checks request hosts, origins, and authentication to protect against malicious browser tabs.

Development

cargo test -p openwebide-storage -p openwebide-core -p openwebide-auth -p openwebide-agent -p openwebide-llm -p openwebide-bridge -p openwebide-backend
cargo test -p openwebide-frontend --lib
CHROMEDRIVER=<path> cargo test -p openwebide-frontend --target wasm32-unknown-unknown

Browser tests require Chrome, chromedriver, and wasm-bindgen-cli matching Cargo.lock. For frontend-only development, run cd frontend && trunk serve and open http://localhost:8080/?api=http://localhost:3000/api with Spin running. Use the same hostname for both services so session cookies work; the API override is accepted only from localhost:8080 or 127.0.0.1:8080.

Directory Purpose
frontend/ Leptos WASM app, built with Trunk
backend/ Spin REST/SSE component
bridge/ Native terminals, execution, and agent hosting
crates/ Shared domain, agent, provider, authentication, and storage code

Further reference: architecture, execution bridge, and API examples.

License

MIT.