WebSockets in Hono

From the Hono cheat sheet · Streaming & SSE · verified Jul 2026

WebSockets

Real-time bidirectional communication

typescript
import { Hono } from 'hono'
import { upgradeWebSocket } from 'hono/cloudflare-workers'
// or: 'hono/bun', 'hono/deno'

const app = new Hono()

app.get('/ws', upgradeWebSocket((c) => {
  return {
    onOpen(event, ws) {
      console.log('Client connected')
      ws.send('Welcome!')
    },
    onMessage(event, ws) {
      console.log('Received:', event.data)
      ws.send(\`Echo: \${event.data}\`)
    },
    onClose(event, ws) {
      console.log('Client disconnected')
    },
    onError(event, ws) {
      console.log('Error:', event)
    },
  }
}))
💡 Import upgradeWebSocket from runtime-specific path
⚡ Bun requires exporting websocket with app.fetch
📌 onOpen not supported on Cloudflare Workers
🎯 Use RPC mode for type-safe WebSocket client

More Hono tasks

Back to the full Hono cheat sheet