mcpbeat

Trigger Realtime And Frontend

triggerdotdev/trigger-realtime-and-frontend

> (runs.subscribeToRun and the @trigger.dev/react-hooks hook useRealtimeRun), consume metadata and AI/text streams in React (useRealtimeStream), trigger tasks from the browser (useTaskTrigger, useRealtimeTaskTrigger), and mint scoped frontend credentials with auth.createPublicToken / auth.createTriggerPublicToken. Load when wiring a frontend (React/Next.js/Remix) or backend-for-frontend to show live run progress, status badges, token streams, trigger buttons, or wait-token approval UIs. NOT for writing the backend task itself (streams.define / metadata.set is trigger-authoring-tasks territory); this is the consumer side.

916 tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
15884
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/triggerdotdev/trigger.dev --skill trigger-realtime-and-frontend

The instruction itself

3 sections, as written by the author

Realtime and Frontend

The full, version-pinned reference ships inside your installed @trigger.dev/sdk. Read it before writing code — it always matches the SDK version in this project, so it never drifts:

  • Skill: node_modules/@trigger.dev/sdk/skills/trigger-realtime-and-frontend/SKILL.md — run subscriptions, @trigger.dev/react-hooks, streams, frontend triggering, and scoped tokens.
  • Docs: the full, version-pinned docs ship bundled at node_modules/@trigger.dev/sdk/docs/realtime/; the skill above lists the exact pages it draws from in its sources: frontmatter. Grep for a hook, e.g. grep -rl "useRealtimeRun" node_modules/@trigger.dev/sdk/docs/.

If those paths don't exist, @trigger.dev/sdk isn't installed yet — install it first. In a non-hoisted layout, resolve the package with node -p "require.resolve('@trigger.dev/sdk/package.json')" and read skills/ + docs/ beside it.

Common mistakes

  • CRITICAL: Triggering from the browser with a Public Access Token. The

read token from createPublicToken cannot trigger tasks.

  • Wrong: useTaskTrigger("my-task", { accessToken: publicAccessTokenFromCreatePublicToken })
  • Correct: mint a single-use Trigger Token with auth.createTriggerPublicToken("my-task") and pass that.
  • Token with no scopes. A scopeless token authorizes nothing, so every subscribe 403s.
  • Wrong: await auth.createPublicToken()
  • Correct: await auth.createPublicToken({ scopes: { read: { runs: ["run_1234"] } } })
  • Polling with useRun/SWR for live updates. useRun is the SWR-based

management-API hook (not recommended for live state); set refreshInterval: 0

to stop polling if you do use it.

  • Wrong: useRun(runId, { refreshInterval: 1000 }) to track progress
  • Correct: useRealtimeRun(runId, { accessToken }) (no polling, no WebSocket setup)
  • Forgetting "use client". Realtime/trigger hooks cannot run in a server component.
  • Wrong: a Next.js App Router server component using useRealtimeRun
  • Correct: put "use client"; at the top of any component using these hooks.
  • Shipping payload/output you do not render.
  • Wrong: useRealtimeRun(runId, { accessToken }) for a status badge (large payloads over the wire)
  • Correct: useRealtimeRun(runId, { accessToken, skipColumns: ["payload", "output"] })
  • Subscribing before the handle exists.
  • Wrong: useRealtimeRun(handle, { accessToken: handle?.publicAccessToken }) with no guard
  • Correct: add enabled: !!handle so it subscribes only once the trigger returns a handle.

References

Sibling skills: trigger-authoring-tasks (the task side: streams.define(), metadata.set(), wait.createToken), trigger-authoring-chat-agent and trigger-chat-agent-advanced (chat agents build on these realtime streams).

How to use it

Copy the folder

Take triggerdotdev/trigger-realtime-and-frontend from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.