diff --git a/box/overall/quickstart.mdx b/box/overall/quickstart.mdx
index dff9846b..12f1cb61 100644
--- a/box/overall/quickstart.mdx
+++ b/box/overall/quickstart.mdx
@@ -2,11 +2,13 @@
title: "Quickstart"
---
+import { Catalog } from "/snippets/catalog.jsx";
+
**Upstash Box lets you give your AI agents a computer.**
Every Upstash Box is a **secure, isolated cloud container with an AI Agent built-in**. Spin up as many as you want in parallel. Each one includes a full environment with a filesystem, shell, git, and a runtime. Your agent can read files, write code, and execute tasks inside it.
-Upstash Box is in developer preview — APIs and pricing may change.
+Upstash Box is in developer preview. APIs and pricing may change.
### 1. Get your API key
@@ -244,3 +246,11 @@ Great example use cases:
Boxes have Claude Code, Codex or OpenCode built-in.
+
+## SDKs
+
+
+
+## Guides
+
+
diff --git a/img/icons/box.svg b/img/icons/box.svg
new file mode 100644
index 00000000..3bffb3c9
--- /dev/null
+++ b/img/icons/box.svg
@@ -0,0 +1,11 @@
+
diff --git a/img/icons/context7.svg b/img/icons/context7.svg
new file mode 100644
index 00000000..b0ae11ed
--- /dev/null
+++ b/img/icons/context7.svg
@@ -0,0 +1,7 @@
+
diff --git a/img/icons/lang/python.svg b/img/icons/lang/python.svg
new file mode 100644
index 00000000..3af725cf
--- /dev/null
+++ b/img/icons/lang/python.svg
@@ -0,0 +1,8 @@
+
diff --git a/img/icons/lang/ruby.png b/img/icons/lang/ruby.png
new file mode 100644
index 00000000..797167a7
Binary files /dev/null and b/img/icons/lang/ruby.png differ
diff --git a/img/icons/lang/typescript.svg b/img/icons/lang/typescript.svg
new file mode 100644
index 00000000..15985c42
--- /dev/null
+++ b/img/icons/lang/typescript.svg
@@ -0,0 +1,7 @@
+
diff --git a/img/icons/qstash.svg b/img/icons/qstash.svg
new file mode 100644
index 00000000..7dc08adf
--- /dev/null
+++ b/img/icons/qstash.svg
@@ -0,0 +1,4 @@
+
diff --git a/img/icons/redis.svg b/img/icons/redis.svg
new file mode 100644
index 00000000..04757d34
--- /dev/null
+++ b/img/icons/redis.svg
@@ -0,0 +1,7 @@
+
diff --git a/img/icons/search.svg b/img/icons/search.svg
new file mode 100644
index 00000000..c5849e3d
--- /dev/null
+++ b/img/icons/search.svg
@@ -0,0 +1,11 @@
+
diff --git a/img/icons/vector.svg b/img/icons/vector.svg
new file mode 100644
index 00000000..339ece55
--- /dev/null
+++ b/img/icons/vector.svg
@@ -0,0 +1,8 @@
+
diff --git a/img/icons/workflow.svg b/img/icons/workflow.svg
new file mode 100644
index 00000000..657ee0bd
--- /dev/null
+++ b/img/icons/workflow.svg
@@ -0,0 +1,4 @@
+
diff --git a/introduction.mdx b/introduction.mdx
index 41dc6bd4..148960c0 100644
--- a/introduction.mdx
+++ b/introduction.mdx
@@ -1,52 +1,24 @@
---
title: Get Started
+description: "Serverless data and messaging for developers: Redis, Vector, QStash, Workflow, Search, and Box, with SDKs, integrations, and a full-featured console."
+mode: frame
---
-
-
- Create a Redis Database within seconds
-
-
- Create a Vector Database for AI & LLMs
-
-
- Publish your first message
-
-
- Write durable serverless functions
-
-
- Run AI agents and code in secure sandboxes
-
-
+import { Hero, SectionHead, ProductGrid, AgentResources, Concepts, Community } from "/snippets/landing.jsx";
-## Concepts
+
-
-
- Upstash is serverless. You don't need to provision any infrastructure. Just
- create a database and start using it.
-
-
- Price scales to zero. You don't pay for idle or unused resources. You pay
- only for what you use.
-
-
- Upstash Redis replicates your data for the best latency all over the world.
-
-
- Upstash REST APIs enable access from all types of runtimes.
-
-
+
+
+
+
-## Get In touch
+
+
-
-
- Follow us on X for the latest news and updates.
-
-
- Join our Discord Community and ask your questions to the team and other
- developers.
-
-
+
+
+
+
+
+
diff --git a/llms-full.txt b/llms-full.txt
index 3de69788..8483a55a 100644
--- a/llms-full.txt
+++ b/llms-full.txt
@@ -5124,11 +5124,13 @@ Please check our [pricing page](https://upstash.com/pricing/box) for the most up
# Quickstart
Source: https://upstash.com/docs/box/overall/quickstart
+import { Catalog } from "/snippets/catalog.jsx";
+
**Upstash Box lets you give your AI agents a computer.**
Every Upstash Box is a **secure, isolated cloud container with an AI Agent built-in**. Spin up as many as you want in parallel. Each one includes a full environment with a filesystem, shell, git, and a runtime. Your agent can read files, write code, and execute tasks inside it.
-Upstash Box is in developer preview — APIs and pricing may change.
+Upstash Box is in developer preview. APIs and pricing may change.
### 1. Get your API key
@@ -5365,6 +5367,14 @@ Great example use cases:
+## SDKs
+
+
+
+## Guides
+
+
+
# Schedules
Source: https://upstash.com/docs/box/overall/schedules
@@ -8588,54 +8598,24 @@ Secondary: #00E9A3 (Cyan Green)
# Get Started
Source: https://upstash.com/docs/introduction
-
-
- Create a Redis Database within seconds
-
-
- Create a Vector Database for AI & LLMs
-
-
- Publish your first message
-
-
- Write durable serverless functions
-
-
- Run AI agents and code in secure sandboxes
-
-
+import { Hero, SectionHead, ProductGrid, AgentResources, Concepts, Community } from "/snippets/landing.jsx";
-## Concepts
+
-
-
- Upstash is serverless. You don't need to provision any infrastructure. Just
- create a database and start using it.
-
-
- Price scales to zero. You don't pay for idle or unused resources. You pay
- only for what you use.
-
-
- Upstash Redis replicates your data for the best latency all over the world.
-
-
- Upstash REST APIs enable access from all types of runtimes.
-
-
+
+
+
+
-## Get In touch
+
+
-
-
- Follow us on X for the latest news and updates.
-
-
- Join our Discord Community and ask your questions to the team and other
- developers.
-
-
+
+
+
+
+
+
# Bulk Delete DLQ messages
Source: https://upstash.com/docs/qstash/api-reference/dlq/bulk-delete-dlq-messages
@@ -13868,6 +13848,8 @@ Enterprise customers receive dedicated resources to ensure isolation and consist
# Getting Started
Source: https://upstash.com/docs/qstash/overall/getstarted
+import { Catalog } from "/snippets/catalog.jsx";
+
QStash is a **serverless messaging and scheduling solution**. It fits easily into your existing workflow and allows you to build reliable systems without managing infrastructure.
Instead of calling an endpoint directly, QStash acts as a middleman between you and an API to guarantee delivery, perform automatic retries on failure, and more.
@@ -14016,6 +13998,14 @@ Learn more about different states [here](/docs/qstash/howto/debug-logs).
+## SDKs
+
+
+
+## Integrations
+
+
+
# llms.txt
Source: https://upstash.com/docs/qstash/overall/llms-txt
@@ -21058,6 +21048,8 @@ A Business Associate Agreement (BAA) and HIPAA compliance enablement is availabl
# Getting Started
Source: https://upstash.com/docs/redis/overall/getstarted
+import { Catalog } from "/snippets/catalog.jsx";
+
Upstash Redis is a **highly available, infinitely scalable** Redis-compatible database:
* 99.99% uptime guarantee with auto-scaling ([Prod Pack](/docs/redis/overall/enterprise#prod-pack-features))
@@ -21135,6 +21127,18 @@ Manage Upstash Redis databases from Claude and other AI tools by using our [MCP
* [REST API](/docs/redis/features/restapi): connect from edge and serverless runtimes where TCP is restricted.
* [Pricing & Billing](/docs/redis/overall/billing): free tier, Pay-As-You-Go, and Fixed plan limits, plus how billing works.
+## SDKs
+
+
+
+## Integrations
+
+
+
+## Featured Demos
+
+
+
# llms.txt
Source: https://upstash.com/docs/redis/overall/llms-txt
@@ -28815,6 +28819,8 @@ SEARCH.QUERY products '{"name": "new"}'
# Introduction
Source: https://upstash.com/docs/redis/search/introduction
+import { Catalog } from "/snippets/catalog.jsx";
+
Upstash Redis Search is our first extension beyond the official Redis spec. Using the Rust-based Tantivy under the hood, we provide an extremely fast way to search through Redis data.
@@ -28858,6 +28864,10 @@ Upstash Redis Search is our first extension beyond the official Redis spec. Usin
+## Demos
+
+
+
# $boost
Source: https://upstash.com/docs/redis/search/query-operators/boolean-operators/boost
@@ -33297,6 +33307,8 @@ For more details on how this integration works, check out [the official reposito
# Getting Started
Source: https://upstash.com/docs/search/overall/getstarted
+import { Catalog } from "/snippets/catalog.jsx";
+
***
+
+## Integrations
+
+
+
# Pricing & Limits
Source: https://upstash.com/docs/search/overall/pricing
@@ -41343,6 +41363,8 @@ Source: https://upstash.com/docs/vector/overall/compare
# Getting Started
Source: https://upstash.com/docs/vector/overall/getstarted
+import { Catalog } from "/snippets/catalog.jsx";
+
**Prerequisite**
@@ -41559,6 +41581,14 @@ You can also query your index with a simple UI:
+## SDKs
+
+
+
+## Integrations
+
+
+
# llms.txt
Source: https://upstash.com/docs/vector/overall/llms-txt
@@ -48846,6 +48876,8 @@ Choose webhooks when integrating with external services that support callback UR
# Overview
Source: https://upstash.com/docs/workflow/getstarted
+import { Catalog } from "/snippets/catalog.jsx";
+
Upstash Workflow lets you write **durable, reliable and performant serverless functions**. Get delivery guarantees, automatic retries on failure, scheduling and more without managing any infrastructure.
+
+## Demos
+
+
+
# Cancel a Run
Source: https://upstash.com/docs/workflow/howto/cancel
diff --git a/llms.txt b/llms.txt
index 78adbe7e..79e28f61 100644
--- a/llms.txt
+++ b/llms.txt
@@ -140,7 +140,7 @@
- [upstash_redis_database](https://upstash.com/docs/devops/terraform/resources/upstash_redis_database.md): Create and manage Upstash Redis databases.
- [upstash_team](https://upstash.com/docs/devops/terraform/resources/upstash_team.md): Create and manage teams on Upstash.
- [Bg color codes](https://upstash.com/docs/img/bg-color-codes.md)
-- [Get Started](https://upstash.com/docs/introduction.md)
+- [Get Started](https://upstash.com/docs/introduction.md): Serverless data and messaging for developers: Redis, Vector, QStash, Workflow, Search, and Box, with SDKs, integrations, and a full-featured console.
- [Bulk Delete DLQ messages](https://upstash.com/docs/qstash/api-reference/dlq/bulk-delete-dlq-messages.md): Delete multiple messages from the DLQ
- [Bulk Retry DLQ messages](https://upstash.com/docs/qstash/api-reference/dlq/bulk-retry-dlq-messages.md): Retry delivery of multiple messages from the DLQ
- [Delete a DLQ message](https://upstash.com/docs/qstash/api-reference/dlq/delete-a-dlq-message.md): Manually remove a message from the DLQ
diff --git a/qstash/overall/getstarted.mdx b/qstash/overall/getstarted.mdx
index da759d35..e4afe417 100644
--- a/qstash/overall/getstarted.mdx
+++ b/qstash/overall/getstarted.mdx
@@ -2,6 +2,8 @@
title: "Getting Started"
---
+import { Catalog } from "/snippets/catalog.jsx";
+
QStash is a **serverless messaging and scheduling solution**. It fits easily into your existing workflow and allows you to build reliable systems without managing infrastructure.
Instead of calling an endpoint directly, QStash acts as a middleman between you and an API to guarantee delivery, perform automatic retries on failure, and more.
@@ -159,3 +161,11 @@ Learn more about different states [here](/qstash/howto/debug-logs).
+## SDKs
+
+
+
+## Integrations
+
+
+
diff --git a/redis/overall/getstarted.mdx b/redis/overall/getstarted.mdx
index e4c38d63..d7f45980 100755
--- a/redis/overall/getstarted.mdx
+++ b/redis/overall/getstarted.mdx
@@ -3,6 +3,8 @@ title: Getting Started
description: Create an Upstash Redis database in seconds
---
+import { Catalog } from "/snippets/catalog.jsx";
+
Upstash Redis is a **highly available, infinitely scalable** Redis-compatible database:
- 99.99% uptime guarantee with auto-scaling ([Prod Pack](/redis/overall/enterprise#prod-pack-features))
@@ -85,3 +87,15 @@ Manage Upstash Redis databases from Claude and other AI tools by using our [MCP
- [Upstash Redis Search](/redis/search/introduction): full-text search built into Upstash Redis.
- [REST API](/redis/features/restapi): connect from edge and serverless runtimes where TCP is restricted.
- [Pricing & Billing](/redis/overall/billing): free tier, Pay-As-You-Go, and Fixed plan limits, plus how billing works.
+
+## SDKs
+
+
+
+## Integrations
+
+
+
+## Featured Demos
+
+
diff --git a/redis/search/introduction.mdx b/redis/search/introduction.mdx
index 1a4619da..f0256bbe 100644
--- a/redis/search/introduction.mdx
+++ b/redis/search/introduction.mdx
@@ -2,6 +2,8 @@
title: Introduction
---
+import { Catalog } from "/snippets/catalog.jsx";
+
Upstash Redis Search is our first extension beyond the official Redis spec. Using the Rust-based Tantivy under the hood, we provide an extremely fast way to search through Redis data.
@@ -44,3 +46,7 @@ Upstash Redis Search is our first extension beyond the official Redis spec. Usin
Complete, real-world examples you can adapt to your own use cases
+
+## Demos
+
+
diff --git a/search/overall/getstarted.mdx b/search/overall/getstarted.mdx
index 269b93d9..2f6b9261 100644
--- a/search/overall/getstarted.mdx
+++ b/search/overall/getstarted.mdx
@@ -3,6 +3,8 @@ title: Getting Started
description: Creating an Upstash Search Database
---
+import { Catalog } from "/snippets/catalog.jsx";
+
---
+
+## Integrations
+
+
diff --git a/snippets/catalog.jsx b/snippets/catalog.jsx
new file mode 100644
index 00000000..ccafa3aa
--- /dev/null
+++ b/snippets/catalog.jsx
@@ -0,0 +1,113 @@
+// Single source of truth for SDKs, integrations, and demos across the docs.
+//
+// Renders custom-styled cards (see .u-card in style.css) with a programming-language
+// icon per card. Used on each product landing (filtered via the `product` prop).
+//
+// NOTE (Mintlify constraint, validated): an exported component CANNOT reference a
+// sibling module-level `export const`. Mintlify compiles each export in isolation,
+// so the data array MUST live inside the component's own function body.
+//
+// Fields: { title, description, href, product, type, lang, featured? }
+// product: "redis" | "vector" | "qstash" | "workflow" | "search" | "box" (or an array)
+// type: "sdk" | "integration" | "demo"
+// lang: "typescript" | "python" | "ruby" (icon in img/icons/lang/.svg)
+
+export const Catalog = ({ product, type, featured, search, cols = 3 }) => {
+ const catalog = [
+ // ---------- SDKs ----------
+ { title: "@upstash/redis", description: "HTTP-based Redis client for serverless and edge.", href: "/redis/sdks/ts/overview", product: "redis", type: "sdk", lang: "typescript", featured: true },
+ { title: "upstash-redis (Python)", description: "Serverless Redis client for Python.", href: "/redis/sdks/py/overview", product: "redis", type: "sdk", lang: "python" },
+ { title: "@upstash/ratelimit", description: "Rate limiting for serverless, built on Redis.", href: "/redis/sdks/ratelimit-ts/overview", product: "redis", type: "sdk", lang: "typescript", featured: true },
+ { title: "ratelimit (Python)", description: "Rate limiting SDK for Python.", href: "/redis/sdks/ratelimit-py/overview", product: "redis", type: "sdk", lang: "python" },
+ { title: "Realtime", description: "Add realtime features to any Next.js app.", href: "/realtime/overall/quickstart", product: "redis", type: "sdk", lang: "typescript" },
+ { title: "AgentKit", description: "Agent memory, RAG, and chat history on Redis.", href: "/redis/sdks/agentkit/ai-sdk", product: "redis", type: "sdk", lang: "typescript" },
+ { title: "Redis Analytics", description: "Event tracking, flags, and A/B testing, powered by Redis.", href: "https://github.com/upstash/redis-analytics", product: "redis", type: "sdk", lang: "typescript" },
+ { title: "Agent Analytics", description: "Track AI agent traffic hitting your website.", href: "https://github.com/upstash/agent-analytics", product: "redis", type: "sdk", lang: "typescript" },
+ { title: "@upstash/vector", description: "Vector database client for AI and LLM apps.", href: "/vector/sdks/ts/getting-started", product: "vector", type: "sdk", lang: "typescript", featured: true },
+ { title: "upstash-vector (Python)", description: "Vector database client for Python.", href: "/vector/sdks/py/gettingstarted", product: "vector", type: "sdk", lang: "python" },
+ { title: "@upstash/qstash", description: "Publish messages and schedule jobs over HTTP.", href: "/qstash/sdks/ts/overview", product: "qstash", type: "sdk", lang: "typescript", featured: true },
+ { title: "qstash-py", description: "QStash messaging and scheduling for Python.", href: "/qstash/sdks/py/overview", product: "qstash", type: "sdk", lang: "python" },
+ { title: "@upstash/workflow", description: "Durable serverless functions and workflows.", href: "https://github.com/upstash/workflow-js", product: "workflow", type: "sdk", lang: "typescript", featured: true },
+ { title: "workflow-py", description: "Durable workflows for Python.", href: "https://github.com/upstash/workflow-py", product: "workflow", type: "sdk", lang: "python" },
+ { title: "Workflow Agents", description: "Reliable single and multi-agent workflows.", href: "/workflow/agents/overview", product: "workflow", type: "sdk", lang: "typescript" },
+ { title: "@upstash/search", description: "Full-text and semantic search client.", href: "/search/sdks/ts/getting-started", product: "search", type: "sdk", lang: "typescript", featured: true },
+ { title: "upstash-search (Python)", description: "Search client for Python.", href: "/search/sdks/py/gettingstarted", product: "search", type: "sdk", lang: "python" },
+ { title: "@upstash/box", description: "TypeScript SDK for Upstash Box.", href: "https://github.com/upstash/box/tree/main/packages/sdk", product: "box", type: "sdk", lang: "typescript", featured: true },
+ { title: "box (Python)", description: "Python SDK for Upstash Box.", href: "https://github.com/upstash/box/tree/main/packages/python-sdk", product: "box", type: "sdk", lang: "python" },
+ { title: "Box CLI", description: "Create and manage boxes from your terminal.", href: "https://github.com/upstash/box/tree/main/packages/cli", product: "box", type: "sdk", lang: "typescript" },
+
+ // ---------- Integrations ----------
+ { title: "BullMQ", description: "Message queue built on Redis.", href: "/redis/integrations/bullmq", product: "redis", type: "integration", lang: "typescript", featured: true },
+ { title: "Drizzle", description: "Cache Drizzle ORM queries with Upstash Redis.", href: "/redis/integrations/drizzle", product: "redis", type: "integration", lang: "typescript", featured: true },
+ { title: "Celery", description: "Use Upstash Redis as a Celery broker.", href: "/redis/integrations/celery", product: "redis", type: "integration", lang: "python" },
+ { title: "Sidekiq", description: "Background jobs for Ruby on Upstash Redis.", href: "/redis/integrations/sidekiq", product: "redis", type: "integration", lang: "ruby" },
+ { title: "MCP Server", description: "Manage Upstash Redis from AI agents via MCP.", href: "/agent-resources/mcp", product: "redis", type: "integration", lang: "typescript" },
+ { title: "n8n (Redis)", description: "Automate workflows with Redis nodes in n8n.", href: "/redis/integrations/n8n", product: "redis", type: "integration", lang: "typescript" },
+ { title: "Prometheus (Redis)", description: "Scrape Upstash Redis metrics into Prometheus.", href: "/redis/integrations/prometheus", product: "redis", type: "integration", lang: "typescript" },
+ { title: "LangChain", description: "Vector store integration for LLM apps.", href: "/vector/integrations/langchain", product: "vector", type: "integration", lang: "python", featured: true },
+ { title: "Vercel AI SDK", description: "Back the AI SDK with Upstash Vector.", href: "/vector/integrations/ai-sdk", product: "vector", type: "integration", lang: "typescript", featured: true },
+ { title: "LlamaIndex", description: "Use Upstash Vector as a LlamaIndex store.", href: "/vector/integrations/llamaindex", product: "vector", type: "integration", lang: "python" },
+ { title: "Flowise", description: "Build LLM flows on Upstash Vector.", href: "/vector/integrations/flowise", product: "vector", type: "integration", lang: "typescript" },
+ { title: "Langflow", description: "Visual LLM apps backed by Upstash Vector.", href: "/vector/integrations/langflow", product: "vector", type: "integration", lang: "python" },
+ { title: "LlamaParse", description: "Parse and index documents into Upstash Vector.", href: "/vector/integrations/llamaparse", product: "vector", type: "integration", lang: "python" },
+ { title: "Resend", description: "Send emails from QStash workflows.", href: "/qstash/integrations/resend", product: "qstash", type: "integration", lang: "typescript", featured: true },
+ { title: "Anthropic", description: "Call Claude reliably through QStash.", href: "/qstash/integrations/anthropic", product: "qstash", type: "integration", lang: "typescript" },
+ { title: "LLM APIs", description: "Queue and retry LLM calls with QStash.", href: "/qstash/integrations/llm", product: "qstash", type: "integration", lang: "typescript" },
+ { title: "Datadog", description: "Monitor QStash with Datadog.", href: "/qstash/integrations/datadog", product: "qstash", type: "integration", lang: "typescript" },
+ { title: "Pipedream", description: "Trigger Pipedream workflows from QStash.", href: "/qstash/integrations/pipedream", product: "qstash", type: "integration", lang: "typescript" },
+ { title: "n8n (QStash)", description: "Publish QStash messages from n8n.", href: "/qstash/integrations/n8n", product: "qstash", type: "integration", lang: "typescript" },
+ { title: "Docusaurus", description: "Add full-text search to a Docusaurus site.", href: "/search/integrations/docusaurus", product: "search", type: "integration", lang: "typescript" },
+ { title: "Documentation Crawler", description: "Crawl docs and feed them into Upstash Search.", href: "/search/tools/documentationcrawler", product: "search", type: "integration", lang: "typescript" },
+ { title: "Database Migrator", description: "Migrate your data into Upstash Search.", href: "/search/tools/databasemigrator", product: "search", type: "integration", lang: "typescript" },
+
+ // ---------- Demos ----------
+ { title: "Hacker News Trends", description: "Trend search over Hacker News, built on Upstash.", href: "https://hackernewstrends.com", product: "redis", type: "demo", lang: "typescript", search: true, featured: true },
+ { title: "Eve: Hacker News Agent", description: "A Hacker News agent built with the Vercel Eve framework.", href: "https://upstash-hackernews-eve-agent.vercel.app", product: "redis", type: "demo", lang: "typescript", search: true, featured: true },
+ { title: "OpenClaw", description: "Run OpenClaw inside an Upstash Box.", href: "/box/guides/openclaw-setup", product: "box", type: "guide" },
+ { title: "Hermes", description: "Run the Hermes agent inside a Box.", href: "/box/guides/hermes-setup", product: "box", type: "guide" },
+ { title: "Crabbox", description: "Run your test suite in a Box from your local CLI.", href: "/box/guides/crabbox-setup", product: "box", type: "guide" },
+ { title: "Web Scraping with Playwright", description: "Scrape dynamic websites with Playwright.", href: "/box/guides/web-scraping-playwright", product: "box", type: "guide" },
+ { title: "E-commerce Order Fulfillment", description: "Durable order processing with Workflow.", href: "/workflow/examples/eCommerceOrderFulfillment", product: "workflow", type: "demo", lang: "typescript", featured: true },
+ { title: "Image Processing", description: "Fan-out image jobs with Workflow.", href: "/workflow/examples/imageProcessing", product: "workflow", type: "demo", lang: "typescript", featured: true },
+ { title: "Customer Onboarding", description: "Multi-step onboarding flow with delays.", href: "/workflow/examples/customerOnboarding", product: "workflow", type: "demo", lang: "typescript" },
+ { title: "Payment Retry", description: "Retry failed payments with backoff.", href: "/workflow/examples/paymentRetry", product: "workflow", type: "demo", lang: "typescript" },
+ { title: "Wait for Event", description: "Pause a workflow until an external event.", href: "/workflow/examples/waitForEvent", product: "workflow", type: "demo", lang: "typescript" },
+ { title: "Auth Webhook", description: "Handle auth webhooks durably.", href: "/workflow/examples/authWebhook", product: "workflow", type: "demo", lang: "typescript" },
+ ];
+
+ const matchesProduct = (entry) =>
+ !product ||
+ (Array.isArray(entry.product)
+ ? entry.product.includes(product)
+ : entry.product === product);
+
+ const items = catalog.filter(
+ (entry) =>
+ matchesProduct(entry) &&
+ (!type || entry.type === type) &&
+ (!featured || entry.featured) &&
+ (!search || entry.search),
+ );
+
+ const gridClass = "u-grid " + (cols >= 3 ? "u-grid--3" : "u-grid--2");
+
+ return (
+