> temporal
Build reliable distributed workflows with Temporal. Use when a user asks to orchestrate microservices, handle long-running workflows, implement saga patterns, build reliable background jobs, or create fault-tolerant distributed systems.
curl "https://skillshub.wtf/TerminalSkills/skills/temporal?format=md"Temporal
Overview
Temporal is a durable execution platform for building reliable distributed systems. Workflows survive crashes, retries are automatic, and long-running processes (days, months) just work. Used by Netflix, Snap, and Stripe for mission-critical workflows.
Instructions
Step 1: Setup
# Start Temporal server locally
brew install temporal
temporal server start-dev
# Initialize TypeScript project
npx @temporalio/create@latest my-workflows --sample hello-world
cd my-workflows
Step 2: Define Workflow
// src/workflows.ts — Order processing workflow
import { proxyActivities, sleep } from '@temporalio/workflow'
import type * as activities from './activities'
const { processPayment, reserveInventory, sendConfirmation, shipOrder } = proxyActivities<typeof activities>({
startToCloseTimeout: '30 seconds',
retry: { maximumAttempts: 3 },
})
export async function orderWorkflow(orderId: string, items: Item[]): Promise<OrderResult> {
// Step 1: Reserve inventory (retries automatically on failure)
const reservation = await reserveInventory(orderId, items)
// Step 2: Process payment
const payment = await processPayment(orderId, reservation.total)
// Step 3: Wait for warehouse confirmation (could take hours)
await sleep('2 hours')
// Step 4: Ship and notify
const tracking = await shipOrder(orderId)
await sendConfirmation(orderId, tracking)
return { orderId, tracking, total: reservation.total }
}
// If the server crashes at step 3, Temporal resumes from exactly where it stopped.
// No data loss, no duplicate payments, no orphaned orders.
Step 3: Define Activities
// src/activities.ts — Business logic (can fail and retry)
export async function processPayment(orderId: string, amount: number) {
const result = await stripe.charges.create({
amount: Math.round(amount * 100),
currency: 'usd',
metadata: { orderId },
})
return { chargeId: result.id, status: result.status }
}
export async function reserveInventory(orderId: string, items: Item[]) {
// Check stock, create reservation
const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0)
return { reservationId: `res_${orderId}`, total }
}
export async function sendConfirmation(orderId: string, tracking: string) {
await sendEmail({ to: orderEmail, subject: `Order ${orderId} shipped`, body: `Tracking: ${tracking}` })
}
Step 4: Start Workflow
// src/client.ts — Start a workflow from your API
import { Client } from '@temporalio/client'
const client = new Client()
// Start workflow (returns immediately, workflow runs in background)
const handle = await client.workflow.start(orderWorkflow, {
taskQueue: 'orders',
workflowId: `order-${orderId}`,
args: [orderId, items],
})
// Check status
const result = await handle.result() // waits for completion
const status = await handle.describe() // current status
Guidelines
- Temporal guarantees exactly-once execution of workflow steps — even through crashes and deployments.
- Use for anything that spans multiple services or takes more than a few seconds.
- Activities are the only way to interact with the outside world from workflows.
- Temporal Cloud (hosted) starts free for development. Self-hosted is free with Docker.
- Don't use Temporal for simple cron jobs — it's designed for complex, stateful workflows.
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> xero-accounting
Integrate with the Xero accounting API to sync invoices, expenses, bank transactions, and contacts — and generate financial reports like P&L and balance sheet. Use when: connecting apps to Xero, automating bookkeeping workflows, syncing accounting data, or pulling financial reports programmatically.
> windsurf-rules
Configure Windsurf AI coding assistant with .windsurfrules and workspace rules. Use when: customizing Windsurf for a project, setting AI coding standards, creating team-shared Windsurf configurations, or tuning Cascade AI behavior.