WebSocket endpoint

SolidStart v2 uses Nitro v3's cross-platform WebSocket support. Enable the feature in Nitro's Vite configuration and define the endpoint as a Nitro server route.


Enable WebSockets

import { nitro } from "nitro/vite";
import { defineConfig } from "vite";
import { solidStart } from "@solidjs/start/config";
export default defineConfig({
plugins: [solidStart(), nitro()],
nitro: {
serverDir: "./server",
features: {
websocket: true,
},
},
});

Create an endpoint

Files in server/routes use Nitro's file-based server routing. This example handles connections at /ws.

import { defineWebSocketHandler } from "nitro";
export default defineWebSocketHandler({
open(peer) {
console.log("open", peer.id);
peer.send("Connected");
},
message(peer, message) {
console.log("message", peer.id, message.text());
peer.send(message.text());
},
close(peer, details) {
console.log("close", peer.id, details.code, details.reason);
},
error(peer, error) {
console.error("websocket error", peer.id, error);
},
});

Connect with the browser WebSocket API:

const protocol = location.protocol === "https:" ? "wss:" : "ws:";
const socket = new WebSocket(`${protocol}//${location.host}/ws`);
socket.addEventListener("open", () => socket.send("Hello"));
socket.addEventListener("message", (event) => console.log(event.data));

Nitro also supports upgrade hooks, peer context, topics, namespaces, and pub/sub. See the Nitro WebSocket guide.

Last updated: 7/27/26, 1:53 AMEdit this pageReport an issue with this page