Token导航 LogoToken导航

Agent Skill · 研究检索

upstash-qstash(upstash qstash 搜索)

upstash-qstash 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

upstash-qstash 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为接触敏感数据;许可证为 MIT,第三方扫描有提醒项,按安装量在研究检索类的 73,674 个 Skill 里排第 13,481。

总安装 9,337周安装 397GitHub Stars 35,690下载 3,271核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:upstash-qstash(upstash qstash 搜索)
来源仓库:https://github.com/sickn33/antigravity-awesome-skills
仓库路径:skills/upstash-qstash
安装命令:
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill upstash-qstash
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill upstash-qstash

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

Upstash QStash 搜索技能用于查找、检索和筛选相关信息。适用于 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果的任务。通过 npx skills add 命令从指定 GitHub 仓库安装,需结合原始 README 核验具体用法。

安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写操作。该技能适合在需要自动化信息检索和筛选的场景中使用。

来源仓库内路径:skills/upstash-qstash

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill ups…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

upstash-qstash 怎么安装?

在终端执行 npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill upstash-qstas…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

upstash-qstash 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

upstash-qstash 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

upstash-qstash 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

upstash-qstash 用的人多吗?

公开数据是累计安装 9,337 次,近一周安装 397 次,下载 3,271 次,GitHub 35,690 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

upstash-qstash 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。
  • 来源仓库有 35,690 星,维护活跃度相对可查。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
upstash-qstash

upstash qstash 搜索 · 本页

9,33735,690接触敏感数据MIT有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Upstash QStash

Upstash QStash expert for serverless message queues, scheduled jobs, and reliable HTTP-based task delivery without managing infrastructure.

Principles

  • HTTP is the interface - if it speaks HTTPS, it speaks QStash
  • Endpoints must be public - QStash calls your URLs from the cloud
  • Verify signatures always - never trust unverified webhooks
  • Schedules are fire-and-forget - QStash handles the cron
  • Retries are built-in - but configure them for your use case
  • Delays are free - schedule seconds to days in the future
  • Callbacks complete the loop - know when delivery succeeds or fails
  • Deduplication prevents double-processing - use message IDs

Capabilities

  • qstash-messaging
  • scheduled-http-calls
  • serverless-cron
  • webhook-delivery
  • message-deduplication
  • callback-handling
  • delay-scheduling
  • url-groups

Scope

  • complex-workflows -> inngest
  • redis-queues -> bullmq-specialist
  • event-sourcing -> event-architect
  • workflow-orchestration -> temporal-craftsman

Tooling

Core

  • qstash-sdk
  • upstash-console

Frameworks

  • nextjs
  • cloudflare-workers
  • vercel-functions
  • aws-lambda
  • netlify-functions

Patterns

  • scheduled-jobs
  • delayed-messages
  • webhook-fanout
  • callback-verification

Related

  • upstash-redis
  • upstash-kafka

Patterns

Basic Message Publishing

Sending messages to be delivered to endpoints

When to use: Need reliable async HTTP calls

import {Client} from '@upstash/qstash';

const qstash = new Client({token: process.env.QSTASH_TOKEN!,});

// Simple message to endpoint await qstash.publishJSON({url: 'https://myapp.com/api/process', body: {userId: '123', action: 'welcome-email',},});

// With delay (process in 1 hour) await qstash.publishJSON({url: 'https://myapp.com/api/reminder', body: {userId: '123'}, delay: 60 * 60, // seconds});

// With specific delivery time await qstash.publishJSON({url: 'https://myapp.com/api/scheduled', body: {report: 'daily'}, notBefore: Math.floor(Date.now() / 1000) + 86400, // tomorrow});

Scheduled Cron Jobs

Setting up recurring scheduled tasks

When to use: Need periodic background jobs without infrastructure

import {Client} from '@upstash/qstash';

const qstash = new Client({token: process.env.QSTASH_TOKEN!,});

// Create a scheduled job const schedule = await qstash.schedules.create({destination: 'https://myapp.com/api/cron/daily-report', cron: '0 9 * * *', // Every day at 9 AM UTC body: JSON.stringify({type: 'daily'}), headers: {'Content-Type': 'application/json',},});

console.log('Schedule created:', schedule.scheduleId);

// List all schedules const schedules = await qstash.schedules.list();

// Delete a schedule await qstash.schedules.delete(schedule.scheduleId);

Signature Verification

Verifying QStash message signatures in your endpoint

When to use: Any endpoint receiving QStash messages (always!)

// app/api/webhook/route.ts (Next.js App Router) import {Receiver} from '@upstash/qstash'; import {NextRequest, NextResponse} from 'next/server';

const receiver = new Receiver({currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY!, nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY!,});

export async function POST(req: NextRequest) {const signature = req.headers.get('upstash-signature'); const body = await req.text();

// ALWAYS verify signature const isValid = await receiver.verify({signature: signature!, body, url: req.url,});

if (!isValid) {return NextResponse.json({error: 'Invalid signature'}, {status: 401});}

// Safe to process const data = JSON.parse(body); await processMessage(data);

return NextResponse.json({success: true});}

Callback for Delivery Status

Getting notified when messages are delivered or fail

When to use: Need to track delivery status for critical messages

import {Client} from '@upstash/qstash';

const qstash = new Client({token: process.env.QSTASH_TOKEN!,});

// Publish with callback await qstash.publishJSON({url: 'https://myapp.com/api/critical-task', body: {taskId: '456'}, callback: 'https://myapp.com/api/qstash-callback', failureCallback: 'https://myapp.com/api/qstash-failed',});

// Callback endpoint receives delivery status // app/api/qstash-callback/route.ts export async function POST(req: NextRequest) {// Verify signature first! const data = await req.json();

// data contains: // - sourceMessageId: original message ID // - url: destination URL // - status: HTTP status code // - body: response body

if (data.status >= 200 && data.status < 300) {await markTaskComplete(data.sourceMessageId);}

return NextResponse.json({received: true});}

URL Groups (Fan-out)

Sending messages to multiple endpoints at once

When to use: Need to notify multiple services about an event

import {Client} from '@upstash/qstash';

const qstash = new Client({token: process.env.QSTASH_TOKEN!,});

// Create a URL group await qstash.urlGroups.addEndpoints({name: 'order-processors', endpoints: {url: '[https://inventory.myapp.com/api/process'}, {url: 'https://shipping.myapp.com/api/process'}, {url: 'https://analytics.myapp.com/api/track'},],});

// Publish to the group - all endpoints receive the message await qstash.publishJSON({urlGroup: 'order-processors', body: {orderId: '789', event: 'order.placed',},});

Message Deduplication

Preventing duplicate message processing

When to use: Idempotency is critical (payments, notifications)

import {Client} from '@upstash/qstash';

const qstash = new Client({token: process.env.QSTASH_TOKEN!,});

// Deduplicate by custom ID (within deduplication window) await qstash.publishJSON({url: 'https://myapp.com/api/charge', body: {orderId: '123', amount: 5000}, deduplicationId: 'charge-order-123', // Won't send again within window});

// Content-based deduplication await qstash.publishJSON({url: 'https://myapp.com/api/notify', body: {userId: '456', message: 'Hello'}, contentBasedDeduplication: true, // Hash of body used as ID});

Sharp Edges

Not verifying QStash webhook signatures

Severity: CRITICAL

Situation: Endpoint accepts any POST request. Attacker discovers your callback URL. Fake messages flood your system. Malicious payloads processed as trusted.

Symptoms:

  • No Receiver import in webhook handler
  • Missing upstash-signature header check
  • Processing request before verification

Why this breaks: QStash endpoints are public URLs. Without signature verification, anyone can send requests. This is a direct path to unauthorized message processing and potential data manipulation.

Recommended fix:

Always verify signatures with both keys:

import { Receiver } from '@upstash/qstash';

const receiver = new Receiver({
  currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY!,
  nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY!,
});

export async function POST(req: NextRequest) {
  const signature = req.headers.get('upstash-signature');
  const body = await req.text();  // Raw body required

  const isValid = await receiver.verify({
    signature: signature!,
    body,
    url: req.url,
  });

  if (!isValid) {
    return NextResponse.json({ error: 'Invalid signature' }, { status: 401 });
  }

  // Safe to process
}

Why two keys?

  • QStash rotates signing keys
  • nextSigningKey becomes current during rotation
  • Both must be checked for seamless key rotation

Callback endpoint taking too long to respond

Severity: HIGH

Situation: Webhook handler does heavy processing. Takes 30+ seconds. QStash times out. Marks message as failed. Retries. Double processing begins.

Symptoms:

  • Webhook timeouts in QStash dashboard
  • Messages marked failed then retried
  • Duplicate processing of same message

Why this breaks: QStash has a 30-second timeout for callbacks. If your endpoint doesn't respond in time, QStash considers it failed and retries. Long-running handlers create duplicate message processing and wasted retries.

Recommended fix:

Design for fast acknowledgment:

export async function POST(req: NextRequest) {
  // 1. Verify signature first (fast)
  // 2. Parse and validate message (fast)
  // 3. Queue for async processing (fast)

  const message = await parseMessage(req);

  // Don't do this:
  // await processHeavyWork(message);  // Could timeout!

  // Do this instead:
  await db.jobs.create({ data: message, status: 'pending' });
  // Or use another QStash message for the heavy work

  return NextResponse.json({ queued: true });  // Respond fast
}

Alternative: Use QStash for the heavy work

// Webhook receives trigger
await qstash.publishJSON({
  url: 'https://myapp.com/api/heavy-process',
  body: { jobId: message.id },
});
return NextResponse.json({ delegated: true });

For Vercel: Consider using Edge runtime for faster cold starts

Hitting QStash rate limits unexpectedly

Severity: HIGH

Situation: Burst of events triggers mass message publishing. QStash rate limit hit. Messages rejected. Users don't get notifications. Critical tasks delayed.

Symptoms:

  • 429 errors from QStash
  • Messages not being delivered
  • Sudden drop in processing during peak times

Why this breaks: QStash has plan-based rate limits. Free tier: 500 messages/day. Pro: higher but still limited. Bursts can exhaust limits quickly. Without monitoring, you won't know until users complain.

Recommended fix:

Check your plan limits:

  • Free: 500 messages/day
  • Pay as you go: Check dashboard
  • Pro: Higher limits, check dashboard

Implement rate limit handling:

try {
  await qstash.publishJSON({ url, body });
} catch (error) {
  if (error.message?.includes('rate limit')) {
    // Queue locally and retry later
    await localQueue.add('qstash-retry', { url, body });
  }
  throw error;
}

Batch messages when possible:

// Instead of 100 individual publishes
await qstash.batchJSON({
  messages: items.map(item => ({
    url: 'https://myapp.com/api/process',
    body: { itemId: item.id },
  })),
});

Monitor in dashboard:

Upstash Console shows usage and limits

Not using deduplication for critical operations

Severity: HIGH

Situation: Network hiccup during publish. SDK retries. Same message sent twice. Customer charged twice. Email sent twice. Data corrupted.

Symptoms:

  • Duplicate charges or emails
  • Double processing of same event
  • User complaints about duplicates

Why this breaks: Network failures and retries happen. Without deduplication, the same logical message can be sent multiple times. QStash provides deduplication, but you must use it for critical operations.

Recommended fix:

Use deduplication for critical messages:

// Custom ID (best for business operations)
await qstash.publishJSON({
  url: 'https://myapp.com/api/charge',
  body: { orderId: '123', amount: 5000 },
  deduplicationId: `charge-${orderId}`,  // Same ID = same message
});

// Content-based (good for notifications)
await qstash.publishJSON({
  url: 'https://myapp.com/api/notify',
  body: { userId: '456', type: 'welcome' },
  contentBasedDeduplication: true,  // Hash of body
});

Deduplication window:

  • Default: 60 seconds
  • Messages with same ID in window are deduplicated
  • Plan for this in your retry logic

Also make endpoints idempotent:

Check if operation already completed before processing

Expecting QStash to reach private/localhost endpoints

Severity: CRITICAL

Situation: Development works with local server. Deploy to production with internal URL. QStash can't reach it. All messages fail silently. No processing happens.

Symptoms:

  • Messages show "failed" in QStash dashboard
  • Works locally but fails in "production"
  • Using http:// instead of https://

Why this breaks: QStash runs in Upstash's cloud. It can only reach public, internet-accessible URLs. localhost, internal IPs, and private networks are unreachable. This is a fundamental architecture requirement, not a configuration issue.

Recommended fix:

Production requirements:

  • URL must be publicly accessible
  • HTTPS required (HTTP will fail)
  • No localhost, 127.0.0.1, or private IPs

Local development options:

Option 1: ngrok/localtunnel

ngrok http 3000
# Use the ngrok URL for QStash testing

Option 2: QStash local development mode

// In development, skip QStash and call directly
if (process.env.NODE_ENV === 'development') {
  await fetch('http://localhost:3000/api/process', {
    method: 'POST',
    body: JSON.stringify(data),
  });
} else {
  await qstash.publishJSON({ url, body: data });
}

Option 3: Use Vercel preview URLs

Preview deploys give you public URLs for testing

Using default retry behavior for all message types

Severity: MEDIUM

Situation: Critical payment webhook uses defaults. 3 retries over minutes. Payment processor is temporarily down for 15 minutes. Message marked as failed. Payment reconciliation manual work required.

Symptoms:

  • Critical messages marked failed
  • Manual intervention needed for retries
  • Temporary outages causing permanent failures

Why this breaks: Default retry behavior (3 attempts, short backoff) works for many cases but not all. Some endpoints need more attempts, longer backoff, or different strategies. One size doesn't fit all.

Recommended fix:

Configure retries per message:

// Critical operations: more retries, longer backoff
await qstash.publishJSON({
  url: 'https://myapp.com/api/payment-webhook',
  body: { paymentId: '123' },
  retries: 5,
  // Backoff: 10s, 30s, 1m, 5m, 30m
});

// Non-critical notifications: fewer retries
await qstash.publishJSON({
  url: 'https://myapp.com/api/analytics',
  body: { event: 'pageview' },
  retries: 1,  // Fail fast, not critical
});

Consider your endpoint's recovery time:

  • Database down: May need 5+ minutes
  • Third-party API: May need hours
  • Internal service: Usually quick

Use failure callbacks for dead letter handling:

await qstash.publishJSON({
  url: 'https://myapp.com/api/critical',
  body: data,
  failureCallback: 'https://myapp.com/api/dead-letter',
});

Sending large payloads instead of references

Severity: MEDIUM

Situation: Message contains entire document (5MB). QStash rejects - body too large. Even if accepted, slow to transmit. Expensive. Wastes bandwidth.

Symptoms:

  • Message publish failures
  • Slow message delivery
  • High bandwidth costs

Why this breaks: QStash has message size limits (around 500KB body). Large payloads slow delivery, increase costs, and can fail entirely. Messages should be lightweight triggers, not data carriers.

Recommended fix:

Send references, not data:

// BAD: Large payload
await qstash.publishJSON({
  url: 'https://myapp.com/api/process',
  body: { document: largeDocumentContent },  // 5MB!
});

// GOOD: Reference only
await qstash.publishJSON({
  url: 'https://myapp.com/api/process',
  body: { documentId: 'doc_123' },  // Fetch in handler
});

In your handler:

export async function POST(req: NextRequest) {
  const { documentId } = await req.json();
  const document = await storage.get(documentId);  // Fetch actual data
  await processDocument(document);
}

Large data storage options:

  • S3/R2/Blob storage for files
  • Database for structured data
  • Redis for temporary data (Upstash Redis pairs well)

Not using callback/failureCallback for critical flows

Severity: MEDIUM

Situation: Important task published. QStash delivers. Endpoint processes. But your system doesn't know it succeeded. User stuck waiting. No feedback loop.

Symptoms:

  • No visibility into message delivery
  • Users waiting for actions that completed
  • No alerting on failures

Why this breaks: QStash is fire-and-forget by default. Without callbacks, you don't know if messages were delivered successfully. For critical flows, you need the feedback loop to update state and handle failures.

Recommended fix:

Use callbacks for critical operations:

await qstash.publishJSON({
  url: 'https://myapp.com/api/send-email',
  body: { userId: '123', template: 'welcome' },
  callback: 'https://myapp.com/api/email-callback',
  failureCallback: 'https://myapp.com/api/email-failed',
});

Handle the callback:

// app/api/email-callback/route.ts
export async function POST(req: NextRequest) {
  // Verify signature first!
  const data = await req.json();

  // data.sourceMessageId - original message
  // data.status - HTTP status code
  // data.body - response from endpoint

  await db.emailLogs.update({
    where: { messageId: data.sourceMessageId },
    data: { status: 'delivered' },
  });

  return NextResponse.json({ received: true });
}

Failure callback for alerting:

// app/api/email-failed/route.ts
export async function POST(req: NextRequest) {
  const data = await req.json();
  await alerting.notify(`Email failed: ${data.sourceMessageId}`);
  await db.emailLogs.update({
    where: { messageId: data.sourceMessageId },
    data: { status: 'failed', error: data.body },
  });
}

Cron schedules using wrong timezone

Severity: MEDIUM

Situation: Scheduled daily report at "9am". But 9am in which timezone? QStash uses UTC. Report runs at 4am local time. Users confused. Support tickets filed.

Symptoms:

  • Schedules running at unexpected times
  • Off-by-one-hour issues during DST
  • User complaints about report timing

Why this breaks: QStash cron schedules run in UTC. If you think in local time but configure in UTC, schedules will run at unexpected times. This is especially tricky with daylight saving time changes.

Recommended fix:

QStash uses UTC:

// This runs at 9am UTC, not local time
await qstash.schedules.create({
  destination: 'https://myapp.com/api/daily-report',
  cron: '0 9 * * *',  // 9am UTC
});

Convert to UTC:

  • 9am EST = 2pm UTC (winter) / 1pm UTC (summer)
  • 9am PST = 5pm UTC (winter) / 4pm UTC (summer)

Document timezone in schedule name:

await qstash.schedules.create({
  destination: 'https://myapp.com/api/daily-report',
  cron: '0 14 * * *',  // 9am EST (14:00 UTC)
  body: JSON.stringify({
    timezone: 'America/New_York',
    localTime: '9:00 AM',
  }),
});

Handle DST programmatically if needed:

Update schedules when DST changes, or accept UTC timing

URL groups with dead or outdated endpoints

Severity: MEDIUM

Situation: URL group has 5 endpoints. One service deprecated months ago. Messages still fan out to it. Failures in dashboard. Wasted attempts. Slower delivery.

Symptoms:

  • Failed deliveries in URL groups
  • Messages to deprecated services
  • Slow fan-out due to timeouts

Why this breaks: URL groups persist until explicitly updated. When services change, endpoints become stale. QStash tries to deliver to dead URLs, wastes retries, and the failure noise obscures real issues.

Recommended fix:

Audit URL groups regularly:

const groups = await qstash.urlGroups.list();
for (const group of groups) {
  console.log(`Group: ${group.name}`);
  for (const endpoint of group.endpoints) {
    // Check if endpoint is still valid
    try {
      await fetch(endpoint.url, { method: 'HEAD' });
      console.log(`  OK: ${endpoint.url}`);
    } catch {
      console.log(`  DEAD: ${endpoint.url}`);
    }
  }
}

Update groups when services change:

// Remove dead endpoint
await qstash.urlGroups.removeEndpoints({
  name: 'order-processors',
  endpoints: [{ url: 'https://old-service.myapp.com/api/process' }],
});

Automate in CI/CD:

Check URL group health as part of deployment

Validation Checks

Webhook signature verification

Severity: CRITICAL

Message: QStash webhook handlers must verify signatures using Receiver

Fix action: Add signature verification: const receiver = new Receiver({currentSigningKey, nextSigningKey}); await receiver.verify({signature, body, url})

Both signing keys configured

Severity: CRITICAL

Message: QStash Receiver must have both currentSigningKey and nextSigningKey for key rotation

Fix action: Configure both keys: new Receiver({currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY, nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY})

QStash token hardcoded

Severity: CRITICAL

Message: QStash token must not be hardcoded - use environment variables

Fix action: Use process.env.QSTASH_TOKEN

QStash signing keys hardcoded

Severity: CRITICAL

Message: QStash signing keys must not be hardcoded

Fix action: Use process.env.QSTASH_CURRENT_SIGNING_KEY and process.env.QSTASH_NEXT_SIGNING_KEY

Localhost URL in QStash publish

Severity: CRITICAL

Message: QStash cannot reach localhost - endpoints must be publicly accessible

Fix action: Use a public URL (e.g., your deployed domain or ngrok for testing)

HTTP URL instead of HTTPS

Severity: ERROR

Message: QStash requires HTTPS URLs for security

Fix action: Change http:// to https://

QStash publish without error handling

Severity: ERROR

Message: QStash publish calls should have error handling for rate limits and failures

Fix action: Wrap in try/catch and handle errors appropriately

Using parsed JSON for signature verification

Severity: CRITICAL

Message: Signature verification requires raw body (req.text()), not parsed JSON

Fix action: Use await req.text() to get raw body for verification

Callback endpoint without signature verification

Severity: CRITICAL

Message: Callback endpoints must also verify signatures - they receive QStash requests too

Fix action: Add Receiver signature verification to callback handlers

Schedule without destination URL

Severity: ERROR

Message: QStash schedules require a destination URL

Fix action: Add destination: 'https://your-app.com/api/endpoint' to schedule options

Collaboration

Delegation Triggers

  • complex workflow|multi-step|state machine -> inngest (Need durable step functions with checkpointing)
  • redis queue|worker process|job priority -> bullmq-specialist (Need traditional queue with workers)
  • ai background|long running ai|model inference -> trigger-dev (Need AI-specific background processing)
  • deploy|vercel|production|environment -> vercel-deployment (Need deployment configuration for QStash)
  • database|persistence|state|sync -> supabase-backend (Need database for job state)
  • auth|user context|session -> nextjs-supabase-auth (Need user context in message handlers)

Serverless Background Jobs

Skills: upstash-qstash, nextjs-app-router, vercel-deployment

Workflow:

1. Define API route handlers (nextjs-app-router)
2. Configure QStash integration (upstash-qstash)
3. Deploy with environment vars (vercel-deployment)

Reliable Webhooks

Skills: upstash-qstash, stripe-integration, supabase-backend

Workflow:

1. Receive webhooks from Stripe (stripe-integration)
2. Queue for reliable processing (upstash-qstash)
3. Persist state to database (supabase-backend)

Scheduled Reports

Skills: upstash-qstash, email-systems, supabase-backend

Workflow:

1. Configure cron schedule (upstash-qstash)
2. Query data for report (supabase-backend)
3. Send via email system (email-systems)

Fan-out Notifications

Skills: upstash-qstash, email-systems, slack-bot-builder

Workflow:

1. Publish to URL group (upstash-qstash)
2. Email handler receives (email-systems)
3. Slack handler receives (slack-bot-builder)

Gradual Migration to Workflows

Skills: upstash-qstash, inngest

Workflow:

1. Start with simple QStash messages (upstash-qstash)
2. Identify multi-step patterns
3. Migrate complex flows to Inngest (inngest)
4. Keep simple schedules in QStash

Related Skills

Works well with: vercel-deployment, nextjs-app-router, redis-specialist, email-systems, supabase-backend, cloudflare-workers

When to Use

  • User mentions or implies: qstash
  • User mentions or implies: upstash queue
  • User mentions or implies: serverless cron
  • User mentions or implies: scheduled http
  • User mentions or implies: message queue serverless
  • User mentions or implies: vercel cron
  • User mentions or implies: delayed message

Limitations

  • Use this skill only when the task clearly matches the scope described above.
  • Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
  • Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.

平台分布

Claude Code

26.02%
按下载量换算851

OpenCode

22.66%
按下载量换算741

Antigravity

18.12%
按下载量换算593

Gemini CLI

12.43%
按下载量换算407

Cursor

7.99%
按下载量换算261

Codex

3.72%
按下载量换算122

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

可疑

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。

继续浏览同类 Skills