Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsBlogPro
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Authors
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges
  • Chrome Extension
  • Skill Manager

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

ProTermsPrivacyRefunds
Back to skills

Websocket Patterns

ASecurity

WebSocket patterns for web apps: robust clients, reconnection, resync, multiplexing, and scaling realtime features. Use when adding live features to web frontends.

2 stars
0 votes
0 copies
0 views
Added 9/29/2026
ai-agentsgodebuggingfrontendbackend

Works with

cursorcli

Security Analysis

A100/100

Scanned 9/29/2026

$npx -y skills add aicodedecode/awesome-muse-skills --skill websocket-patterns --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Websocket Patterns?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Websocket Patterns
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aicodedecode-websocket-patterns/badge)](https://www.skillsdirectory.com/skills/aicodedecode-websocket-patterns)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
Files
SKILL.md
---
name: websocket-patterns
description: WebSocket patterns for web apps: robust clients, reconnection, resync, multiplexing, and scaling realtime features. Use when adding live features to web frontends.
category: web-development
---

# WebSocket Patterns

A frontend-focused companion to WebSocket fundamentals: the client-side patterns for reliable realtime web features — connection management, reconnection with resync, multiplexing topics, and scaling considerations from the web app's perspective.

## Overview

From the web app's side, WebSockets are deceptively simple (`new WebSocket(url)`) and deceptively fragile (networks drop, servers restart, messages get missed). This skill covers the **client patterns** that make realtime features feel solid: a robust socket wrapper, reconnection with backoff and resync, topic multiplexing over one connection, and graceful degradation — plus what to ask of the backend.

## When to use

- Adding live updates, chat, notifications, or presence to a web app.
- Building a reusable realtime client layer.
- Debugging missed messages after reconnects.
- Deciding message protocol and topic structure with the backend team.

## Core concepts

- **One connection, many topics.** Multiplex: a single socket carrying subscriptions (`{ type: 'subscribe', topic: 'orders:123' }`) rather than a socket per feature. Fewer handshakes, simpler lifecycle, one reconnect path.
- **Message envelope.** `{ type, topic?, id, payload, ts }` — types route to handlers, ids enable dedup/acks, timestamps help ordering and debugging.
- **Reconnection with backoff + jitter.** Exponential backoff (1s → 2s → 4s..., capped ~30s) with random jitter prevents thundering herds after server restarts.
- **Resync cursors.** Track the last-seen message id per topic; on reconnect, send cursors and let the server replay what was missed — or trigger a full refresh of affected UI state.
- **Connection state machine.** `connecting → open → (reconnecting) → open → closed`. Expose state to the UI (live indicator, "reconnecting…" banner, queued-action counts).
- **Heartbeat.** Application-level ping every ~25s (in addition to protocol ping/pong) to detect half-open connections through proxies.
- **Graceful degradation.** If the socket can't connect after N tries: fall back to polling or show stale data with a clear "offline" state — never a silently dead UI.

## Practical workflow

**1. Build the client wrapper.**
```ts
type Handler = (msg: Envelope) => void;

class RealtimeClient {
  private ws?: WebSocket;
  private retry = 0;
  private subs = new Map<string, Handler[]>();
  private cursors = new Map<string, string>();
  state: 'connecting' | 'open' | 'reconnecting' | 'closed' = 'connecting';

  constructor(private url: string) { this.connect(); }

  connect() {
    this.state = this.retry ? 'reconnecting' : 'connecting';
    const ws = new WebSocket(this.url);
    ws.onopen = () => {
      this.retry = 0; this.state = 'open';
      // re-auth + resubscribe with cursors
      ws.send(JSON.stringify({ type: 'hello', subs: [...this.subs.keys()],
        cursors: Object.fromEntries(this.cursors) }));
      this.heartbeat();
    };
    ws.onmessage = (e) => this.route(JSON.parse(e.data));
    ws.onclose = () => this.reconnect();
    this.ws = ws;
  }

  private reconnect() {
    this.state = 'reconnecting';
    const delay = Math.min(1000 * 2 ** this.retry++, 30000) * (0.5 + Math.random());
    setTimeout(() => this.connect(), delay);
  }

  subscribe(topic: string, fn: Handler) {
    const list = this.subs.get(topic) ?? [];
    list.push(fn); this.subs.set(topic, list);
    this.send({ type: 'subscribe', topic });
    return () => this.unsubscribe(topic, fn);
  }
  // route(): dispatch by topic, update cursors, dedupe by id
}
```

**2. Wire into the app.** Provide via context/hook (`useSubscription('orders:123', handler)`); components subscribe declaratively and clean up on unmount.

**3. Show connection state.** A subtle status indicator (live / reconnecting / offline); disable or queue mutating actions while offline ("will send when reconnected").

**4. Coordinate with the backend.** Agree on: envelope format, `hello` resync semantics, heartbeat interval, auth (cookie session or first-message token — not long-lived tokens in the URL), per-topic authorization.

**5. Test the failure modes.** Kill the server mid-session; throttle to offline in DevTools; sleep/wake the laptop. Verify: reconnects, resubscribes, resyncs, no duplicates rendered, UI state honest throughout.

## Common pitfalls

- **Naked `new WebSocket`.** No reconnection, no resync, no state — the #1 realtime bug. Always wrap.
- **Fixed retry delay.** 10k clients retrying every 5s after a deploy = self-inflicted DDoS. Backoff + jitter.
- **No resync.** Reconnected clients silently miss messages. Cursors + replay, or explicit refresh.
- **Duplicate rendering.** Replayed messages rendered twice. Dedupe by message id client-side.
- **Socket per component.** N components × N sockets = N handshakes, N reconnect paths. One multiplexed connection.
- **Leaking subscriptions.** Components unmounting without unsubscribing = handlers firing on dead components. Return cleanup functions; enforce in review.
- **State lies.** UI showing "live" while the socket has been dead for minutes. Drive indicators from the real connection state machine.
- **Auth token in URL.** `wss://...?token=secret` leaks into logs/proxies. Cookie sessions or post-connect auth frames.
- **No offline queue.** User actions during disconnect vanish. Queue mutations locally, flush on reconnect, show pending state.
- **Ignoring the fallback.** Some networks block websockets entirely. Have a polling/SSE fallback path for critical features, or at minimum a clear degraded state.

Attribution

aicodedecodeaicodedecode
View sourceSee grades on GitHubMore from aicodedecode →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Caveman

Terse caveman voice: answer first, fluff gone, every technical fact kept. Use for /caveman, "caveman mode", "talk like caveman", "be brief", "less tokens". Stays on until "stop caveman" or "normal mode".

1100021 votes

Hyperplan

Adversarial multi-agent planning skill. Self-orchestrates 5 hostile category members (unspecified-low, unspecified-high, deep, ultrabrain, artistry) via team-mode for ruthless cross-critique debate, distills only the defensible insights, then MANDATORILY hands the distilled insight bundle to the `plan` agent for executable plan formalization. Use when planning needs maximum rigor and surfacing of weak assumptions, blind spots, and over-engineering. Triggers: 'hyperplan', 'hpp', '/hyperplan', ...

698461 votes

Writing Skills

Create and manage Claude Code skills in HASH repository following Anthropic best practices. Use when creating new skills, modifying skill-rules.json, understanding trigger patterns, working with hooks, debugging skill activation, or implementing progressive disclosure. Covers skill structure, YAML frontmatter, trigger types (keywords, intent patterns), UserPromptSubmit hook, and the 500-line rule. Includes validation and debugging with SKILL_DEBUG. Examples include rust-error-stack, cargo-dep...

3931 votes

Mcp Code Execution

Routes multi-tool workflows through MCP servers for large datasets and pipelines. Use when Bash tool overhead is limiting throughput on data-heavy tasks.

3421 votes

catchup

Recovers the conversation and failed tool calls of a previous Codex, Amp, Claude Code, Antigravity, Cline, Copilot CLI, Cursor, DeepSeek Harness, Grok Build, Kimi, OpenCode, Pi Agent, or ZCode session. Use when the user says "catch up", "what did the last session do", "get me up to speed", "I switched agents", asks to recover/summarize a previous session before continuing, or asks to diagnose or report a catchup failure. Do NOT use for the current conversation, git history, or any non-agent log.

741 votes
View all in ai-agents →