webvm README

The project's README from github.com/leaningtech/webvm. As one markdown file: README.md.

WebVM

Discord server Issues

This repository hosts the source code for https://webvm.io, a Linux virtual machine that runs in your browser.

Try out the new Alpine / Xorg / i3 graphical environment: https://webvm.io/alpine.html

What is WebVM?

WebVM is a server-less virtual environment running fully client-side in HTML5/WebAssembly. It's designed to be Linux ABI-compatible and runs an unmodified Debian distribution including many native development toolchains.

WebVM is powered by the CheerpX virtualization engine, which provides:

Table of Contents

[!NOTE] Visit https://webvm.io to get started immediately in your browser. No setup required.

For local setup, custom image builds, and fork/deploy guidance, see Development & Customization.

Networking

WebVM supports Tailscale integration. So your browser VM can reach your private network and, with an exit node, the public internet too.

[!NOTE] Some low-level networking operations (especially ICMP used by ping) are not currently available in this environment. For connectivity checks, use curl or wget.

Local network

  1. Open the "Networking" panel from the sidebar
  2. Click "Connect to Tailscale"
  3. Log in (create a free account at tailscale.com if needed)
  4. Click "Connect" when prompted

WebVM now has access to all machines in your Tailscale network!

Internet Usage Tips

[!TIP] On slower connections there may be a short delay before initialisation. Connection status is shown as a colored dot on the button: orange = local network, green = global/internet. The button text shows your Tailscale IP address once connected.

To access the public internet from WebVM, set up an Exit Node on another device in your Tailscale network:

  1. Follow the Tailscale Exit Node quickstart (sections: "Advertise a device as an exit node")
  2. WebVM automatically uses the exit node once advertised

Using an Auth Key

As an alternative to interactive login, add your Tailscale auth key to the URL fragment:

https://webvm.io/#authKey=<your-ephemeral-key>

This is equivalent to Tailscale's --login-server option.

[!TIP] If you also need a custom control server, add controlUrl in the same URL fragment and separate values with &, for example: #authKey=...&controlUrl=....

Self-Hosting Tailscale with Headscale

We also support headscale, a selfhosted open source implementation of the Tailscale control server. Because Headscale does not add CORS headers by default, you will need a proxy in front of it. See the Headscale reverse proxy setup docs for an example.

Once ready, add the following line to your location / block in your nginx config file.

if ($http_origin = "https://yourdomain.com") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true' always;
}

Then access WebVM with:

https://yourdomain.com/#controlUrl=<your-headscale-url>

Development & Customization

[!NOTE] Users have root privileges by default. sudo is not installed though this can easily be added to the Dockerfile if needed.

Deploy to GitHub Pages

This is a simple, beginner-friendly workflow. For local hosting and customization, see below Local Serving & Image Configuration.

Fork the WebVM repository to deploy your own version to GitHub Pages:

deploy_instructions_gif
  1. Fork the repository
  2. Enable GitHub Pages via forked repository in Settings → Pages using "GitHub Actions" as source
  3. Run the Deploy workflow from Actions
  4. After completion, open the URL shown under the deploy_to_github_pages job

The same Deploy workflow also builds custom .ext2 disk images from a Dockerfile. You can point it at dockerfiles/debian_mini or another Dockerfile, then either publish the result as a GitHub Release asset or deploy the Pages build from your fork.

[!NOTE] dockerfiles/debian_large is too large of an image for GitHub pages.

Local Serving & Image Configuration

1. Clone the repository

git clone https://github.com/leaningtech/webvm.git
cd webvm

2. Put your image in custom-disk-images/

This repository includes a persistent custom-disk-images/ directory for local .ext2 files.

To use the official Debian mini image, download it from Releases:

debian_mini_20230519_5022088024.ext2

You can also copy in an image you built yourself.

3. Point WebVM to your local image

Edit config_public_terminal.js:

export const diskImageUrl =
  "/custom-disk-images/debian_mini_20230519_5022088024.ext2";
export const diskImageType = "bytes";

4. Install dependencies and build

npm install
npm run build

5. Start Nginx and open WebVM

nginx -p . -c nginx.conf

Then open http://127.0.0.1:8081 and enjoy your local WebVM!

For the full Alpine desktop environment, see leaningtech/alpine-image.

For more details, see CheerpX Custom Images documentation.

[!TIP] For Python3 REPL, the Deploy workflow takes into account the CMD specified in the Dockerfile.

To build a REPL you can simply change CMD [ "/bin/bash" ] to CMD [ "/usr/bin/python3" ] and deploy.

Claude AI Integration

To access Claude AI, you need an API key. Follow these steps to get started:

1. Create an account

2. Get your API key

3. Log in with your API key

4. Start using Claude AI

"Solve the CTF challenge at /home/user/chall1.bin. Note that the binary reads from stdin."

deploy_instructions_gif

Important: Your API key is private and should never be shared. We do not have access to your key, it is only stored locally in your browser.

Community & Support

Report issues: Use GitHub Issues to report bugs or request features.

Chat with us: Join our Discord community to discuss WebVM, share ideas, and get help.

Learn More

Articles & Resources:

Example Deployment:

Technology Behind WebVM:

This project is powered by:

Versioning:

WebVM uses the CheerpX NPM package, which is updated on every release.

Every build is immutable. If a specific version works well for you today, it will keep working forever.

License

WebVM is released under the Apache License, Version 2.0.

You are welcome to use, modify, and redistribute the contents of this repository.

The public CheerpX deployment is provided as-is and is free to use for technological exploration, testing and use by individuals. Any other use by organizations, including non-profit, academia and the public sector, requires a license. Downloading a CheerpX build for the purpose of hosting it elsewhere is not permitted without a commercial license.

Read more here about our licensing practices.

If you want to build a product on top of CheerpX/WebVM, please see our other licensing options: CheerpX licensing or get in touch: [email protected]

webvm (leaningtech/webvm)

virtual-machine
Searching Database…

17.4K ·GitHub
What is this?WebVM is a Linux virtual machine that runs entirely in your browser — an unmodified Debian distribution with native development toolchains, fully client-side, no install and no server.
So the whole VM really runs on my machine, not on a remote server?Yes — the CheerpX engine does x86-to-WebAssembly JIT compilation, emulates Linux syscalls and provides a virtual block-based file system, all sandboxed inside the browser tab.
How do I try it?Open the hosted WebVM site in your browser — no setup required. For your own copy, fork the repo and run the Deploy workflow to publish it to GitHub Pages, or serve a local image with nginx.
Does the built-in Claude AI integration need an Anthropic API key?Yes — you paste your API key into the robot-icon tab, and it stays on your side: it is only stored locally in your browser, the WebVM team has no access to it.
Can the VM reach the internet from my browser?Only through Tailscale: connect via the Networking panel to reach your private network, and the public internet needs an exit node on another device. ICMP/ping is unavailable — use curl or wget.
Is it really free to use?The repository code is Apache-2.0 and individuals can use the public CheerpX deployment for free, but any organizational use — even non-profit or academia — requires a license, and rehosting CheerpX needs a commercial one.
Is it terminal-only, or is there a graphical desktop?The default Debian image is terminal-only, but there is a newer Alpine / Xorg / i3 graphical environment you can try, with a full desktop running in the browser.
Can I turn it into a Python REPL instead of a bash shell?Yes — change the Dockerfile CMD from /bin/bash to /usr/bin/python3 and deploy; the Deploy workflow respects it and gives you a Python REPL in the browser.
What runs under the hood?CheerpX, the x86-to-WebAssembly JIT compiler by Leaning Technologies; xterm.js for the terminal UI; lwIP as the TCP/IP stack compiled for the Web; and Tailscale for the networking layer.
What are similar projects?quicksand, ProxmoxVE, coop, nvx, qemu, ServerBox, ra2, smolvm
Size
41.3 MB
Stars
17.4K
Age
4y
Commits · 90 Days