---
title: "Rust WebSocket"
description: "Rust WebSocket Server"
url: "https://vercel.com/templates/axum/rust-websocket"
links:
  repository: "https://github.com/vercel/examples/tree/main/rust/websocket"
  demo: "https://rust-websocket.vercel.app"
  deploy: "https://vercel.com/new/clone?demo-title=Rust+WebSocket&demo-description=Rust+WebSocket+Server&demo-url=https%3A%2F%2Frust-websocket.vercel.app&project-name=rust-websocket&repository-name=rust-websocket&repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fexamples%2Ftree%2Fmain%2Frust%2Fwebsocket&demo-image=%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2FSxBy7ftbrOeyh4SU7prqm%2F8a843be6ef7da3e5685d93d539165ebd%2Frust-dark.png"
---

# Rust WebSocket

Rust WebSocket Server

# Rust WebSocket

This example shows how to run a WebSocket server in Rust on Vercel using the
[Axum](https://github.com/tokio-rs/axum) framework. The Vercel Rust runtime
enables HTTP/1.1 upgrades, so axum's `WebSocketUpgrade` extractor works without
any extra configuration.

## How it works

`api/websocket.rs` serves an Axum router behind the `VercelLayer`:

- `GET /` — an interactive HTML page to connect and exchange messages.
- `GET /ws` — the WebSocket endpoint. The handler upgrades the connection and
  then runs two concurrent tasks over a single writer:
  - a **heartbeat** that pushes a `tick` event to the client every second
    (server-initiated messages), and
  - an **echo** loop that mirrors any message the client sends back to it
    (client-initiated messages).

A single writer task owns the WebSocket sink and is fed by an `mpsc` channel, so
both the heartbeat and echo loops can send frames without sharing the
non-clonable sink.

All server messages are JSON tagged with a `type` field (`welcome`, `echo`,
`tick`), which the front-end renders in the live log.

## Project Structure

- `api/websocket.rs` — Axum application with the WebSocket handler
- `index.html` — interactive WebSocket client (embedded via `include_str!`)
- `Cargo.toml` — Rust dependencies and binary configuration
- `vercel.json` — rewrites all routes to the function

## Development

Clone the repository:

```bash
git clone https://github.com/vercel/examples.git
cd examples/rust/websocket
```

Install Rust if you haven't already:

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

Test locally:

```bash
vc dev
```

Then open the printed URL, click **Connect**, and send a message. You'll see the
`welcome` event, periodic `tick` heartbeats, and your `echo` replies in the log.

## Related Templates

### [Rust Wait Until](https://vercel.com/templates/axum/rust-wait-until)

Run background work after the response is sent using waitUntil in the Vercel Rust runtime.

### [Rust Hello World](https://vercel.com/templates/other/rust-hello-world)

Simple Rust serverless functions demonstrating basic HTTP handling and performance benchmarks.

### [Rust Axum](https://vercel.com/templates/other/rust-axum)

A Rust web application using the Axum framework with streaming capabilities on Vercel.

---

## Additional documentation

The [Vercel Knowledge Base](https://vercel.com/kb) contains guides and answers to common questions about Vercel, including deployment, framework configuration, domains, caching, and troubleshooting.
