How It Works
Upstash Realtime is powered by Upstash Redis and provides a clean, 100% type-safe API for publishing and subscribing to events:- Your frontend can subscribe to events
- When you emit an event, it’s instantly delivered to live subscribers on the frontend
- You can also replay events that happened in the past
Setup
1. Install Packages
2. Configure Upstash Realtime
Create a Realtime instance inlib/realtime.ts:
lib/realtime.ts
3. Create a Realtime Middleware
Create a custom middleware that will emit events to Realtime atlib/middleware.ts:
lib/middleware.ts
- The
afterExecutioncallback is triggered after each workflow step completes - The
runCompletedcallback is triggered when the entire workflow finishes - We use
context.workflowRunIdto create a unique channel for each workflow run - Events are automatically emitted without needing to manually call emit inside your workflow steps
4. Create a Realtime Endpoint
Create an API route atapp/api/realtime/route.ts to handle Realtime connections:
app/api/realtime/route.ts
5. Add the Realtime Provider
Wrap your application in theRealtimeProvider by updating your root layout at app/layout.tsx:
app/layout.tsx
6. Create a Typed Client Hook
Create a typeduseRealtime hook at lib/realtime-client.ts:
lib/realtime-client.ts
Building the Workflow
1. Create the Workflow Endpoint
Create your workflow atapp/api/workflow/route.ts:
app/api/workflow/route.ts
- Import the
realtimeMiddlewarefrom@/lib/middleware - Pass the middleware in the
middlewaresarray to theservefunction - The middleware automatically emits events after each step and when the workflow completes
2. Create a Trigger Endpoint
Create an endpoint to trigger workflows atapp/api/trigger/route.ts:
app/api/trigger/route.ts
Building the Frontend
1. Create a Custom Hook
Create a React hook to manage the Realtime subscription athooks/useWorkflow.ts:
- Subscribe to multiple events using the
eventsarray:["workflow.stepFinish", "workflow.runFinish"] - The hook manages both triggering the workflow and subscribing to updates
- Type-safe event handling with TypeScript
2. Use the Hook in Your Component
How It All Works Together
- User triggers workflow: The frontend calls
/api/trigger, which returns aworkflowRunId - Frontend subscribes: Using the
workflowRunId, the frontend subscribes to the Realtime channel - Workflow executes: The workflow runs as a background job, emitting events at each step
- Real-time updates: As the workflow emits events, they’re instantly delivered to the frontend via Server-Sent Events
Full Example
For a complete working example with all steps, error handling, and UI components, check out the Upstash Realtime example on GitHub.Next Steps
- Learn about human-in-the-loop workflows with Realtime
- Explore Realtime features
- Check out Workflow configuration options