← ClaudeAtlas

backend-realtimelisted

Implement real-time features using WebSockets, Supabase Realtime, Server-Sent Events, and live data. Use when user wants "real-time", "live updates", "WebSocket", "notifications", "chat", "collaborative", "presence", "live data", or "instant sync".
kensaurus/cursor-kenji · ★ 4 · Web & Frontend · score 80
Install: claude install-skill kensaurus/cursor-kenji
# Real-time Features Skill Implement live, collaborative features using WebSockets, Supabase Realtime, and Server-Sent Events. ## CRITICAL: Check Existing First **Before implementing ANY real-time feature, verify:** 1. **Check for existing real-time setup:** ```bash cat package.json | grep -i "socket\|realtime\|pusher\|ably" rg "supabase.*channel|useSubscription|WebSocket" --type ts --type tsx ``` 2. **Check for existing patterns:** ```bash rg "on\('INSERT'\|on\('UPDATE'\|subscribe\(" --type ts ls -la src/hooks/use*Realtime* src/lib/realtime* 2>/dev/null ``` 3. **Check Supabase config:** ```bash rg "createClient|supabaseUrl" --type ts -l cat .env* | grep -i SUPABASE ``` **Why:** Real-time connections are stateful. Don't create duplicate subscriptions. ## Supabase Realtime ### Subscribe to Database Changes ```tsx 'use client' import { useEffect, useState } from 'react' import { createClient } from '@/lib/supabase/client' export function useRealtimeMessages(roomId: string) { const [messages, setMessages] = useState<Message[]>([]) const supabase = createClient() useEffect(() => { // Initial fetch const fetchMessages = async () => { const { data } = await supabase .from('messages') .select('*') .eq('room_id', roomId) .order('created_at', { ascending: true }) if (data) setMessages(data) } fetchMessages() // Subscribe to changes const channel = supabase .channel(`room:${roomId}`) .on( 'postgres_changes', { event: 'INSERT', schema: 'public', table: