Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.vers.sh/llms.txt

Use this file to discover all available pages before exploring further.

Every Vers VM is reachable from the public internet at a predictable hostname, through a proxy that handles TLS, across a wide port range. You don’t configure any of this — it’s automatic the moment you vers run. This page documents what the network looks like from the inside and outside of a VM.

Hostnames

Every VM has a public hostname of the form:
{vm-id}.vm.vers.sh
Where {vm-id} is the ID returned by vers run (e.g. vm-abc123). The hostname resolves to the Vers edge proxy, which routes the connection to your VM. There’s no per-user setup. DNS for *.vm.vers.sh is managed by Vers; wildcard TLS certificates are issued automatically.

Port range

Vers routes TCP traffic to ports 1024 through 10000 on your VM. Any server you run on a port in that range is reachable at:
https://{vm-id}.vm.vers.sh:{port}
Ports below 1024 (privileged ports) and above 10000 are not routed from the public proxy. Bind your services to a port in the routed range.

TLS is handled for you

The Vers proxy terminates TLS for every VM hostname. That means:
  • Your VM serves plain HTTP.
  • Browsers and clients see HTTPS.
  • You do not need to configure a certificate, manage renewal, or run a TLS stack of your own.
A typical Node.js server looks like:
// Bind to all interfaces (see "IPv6 dual-stack" below)
server.listen(3000, "::");
// Reachable at https://{vm-id}.vm.vers.sh:3000
Your server speaks HTTP on port 3000. The proxy handles TLS on the public side. No certificates, no reverse proxy, no Let’s Encrypt dance.

IPv6 dual-stack (important)

The Vers edge proxy reaches your VM over IPv6. If your server binds only to IPv4 (0.0.0.0 or 127.0.0.1), the proxy can’t connect and requests will fail. Bind to all interfaces, dual-stack:
Language / frameworkDual-stack bind
Node.js (net, http, express)server.listen(PORT, "::")
Python (http.server, flask)app.run(host="::", port=PORT)
Go (net/http)http.ListenAndServe(":PORT", handler) — Go binds dual-stack by default
Rust (tokio, axum)Bind to [::]:PORT
Gunicorn / Uvicorn--bind [::]:PORT
If your framework defaults to 0.0.0.0 or 127.0.0.1, override it explicitly. “It works locally but nobody else can reach it” is almost always a missing dual-stack bind.
0.0.0.0 binds only IPv4. :: binds IPv6 and, on most systems, IPv4-mapped addresses — so a dual-stack bind catches both.

SSH

SSH access is how vers connect works. It’s layered a little differently from HTTP:
  • SSH connects over port 443 (not the 1024–10000 range).
  • The SSH connection is tunneled through TLS so corporate firewalls that only permit 443 outbound can still reach your VMs.
  • You don’t manage SSH keys manually. vers connect handles key provisioning, fingerprint verification, and connection setup automatically.
See vers connect for the CLI details and VM access for interactive and programmatic access patterns.

Outbound connectivity

Your VM has unrestricted outbound internet access. DNS, package installs, API calls, cloud storage uploads — all work out of the box, no configuration. Common things that work:
# Package installation
apt-get update && apt-get install -y python3

# Language runtimes
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -

# API calls
curl https://api.example.com/resource

# Cloud storage
aws s3 cp file.bin s3://my-bucket/
No DNS override needed. No proxy configuration. No allow-listing.

Multiple services on one VM

You can run any number of services on different ports in the routed range. Each is independently reachable:
# Terminal 1 inside the VM
python3 -m http.server 8000 --bind ::

# Terminal 2 inside the VM
node server.js  # binds to :: on 3000
Public URLs:
  • https://{vm-id}.vm.vers.sh:8000 → the Python static-file server
  • https://{vm-id}.vm.vers.sh:3000 → your Node.js app
Each branch and each restored VM gets its own hostname, so you can have a tree of VMs all serving different things on the same ports without collision.

Putting it together

A typical full-stack workflow looks like:
# 1. Boot a VM
vers run --vm-alias web

# 2. Connect
vers connect

# 3. Inside the VM, install and run your app
apt-get install -y python3
cat > app.py << 'PY'
from flask import Flask
app = Flask(__name__)
@app.get("/")
def hi(): return "hello from vers\n"
app.run(host="::", port=5000)
PY
python3 app.py &

# 4. Exit back to your host
exit

# 5. Get the VM ID
vers status
# Your VM's hostname is https://{vm-id}.vm.vers.sh:5000
Hit that URL in a browser. Your app is live, HTTPS, no certificate setup.

What’s next

VM access

Interactive SSH, command execution, file transfer.

Agent swarms tutorial

Running real services on branched VMs, including the “serve it” step.

vers connect

CLI details for SSH access.

Architecture

How VMs sit in the tree and what branching means for networking.