Frameworks

Nitro

Configure Workflow Studio with Nitro

Overview

This guide configures Workflow Studio for Nitro applications.

Two settings control behavior:

  • execution.mode controls local vs remote execution.
  • adapter mode controls ingress behavior (passthrough or proxy-trigger).

Mode matrix

execution.modeadapter modeBehavior
remotepassthroughStandard start(...) routes remain unchanged; execution runs on remote compute worker with production reroute env.
remoteproxy-triggerRemote execution plus optional app-host proxy routes for trigger/webhook ingress.
localpassthroughLocal/default execution behavior.
localproxy-triggerLocal execution with optional proxy ingress routes.

Default remote setup

nitro.config.ts
import { defineNitroConfig } from 'nitropack/config';
import { withWorkflowStudioNitro } from 'workflow-studio/nitro';

export default await withWorkflowStudioNitro(defineNitroConfig({}), {
  execution: { mode: 'remote' },
  mode: 'passthrough',
});

Set production reroute in deployment environment:

WORKFLOW_TARGET_WORLD=workflow-studio/world-remote

Optional proxy-trigger routes

nitro.config.ts
import { defineNitroConfig } from 'nitropack/config';
import { withWorkflowStudioNitro } from 'workflow-studio/nitro';

export default await withWorkflowStudioNitro(defineNitroConfig({}), {
  execution: { mode: 'remote' },
  mode: 'proxy-trigger',
});
server/api/workflow.post.ts
import { proxyTriggerFromNitro } from 'workflow-studio/nitro';

export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  return await proxyTriggerFromNitro({
    payload: {
      workflowName: 'send-email',
      input: { userId: body.userId },
    },
  });
});
server/api/webhooks/[provider].post.ts
import { proxyWebhookFromNitro } from 'workflow-studio/nitro';
import { getHeaders, getRouterParam, readRawBody } from 'h3';

export default defineEventHandler(async (event) => {
  const provider = getRouterParam(event, 'provider');
  const rawBody = await readRawBody(event, false);
  const body =
    typeof rawBody === 'string'
      ? new TextEncoder().encode(rawBody)
      : new Uint8Array(rawBody ?? []);

  return await proxyWebhookFromNitro({
    provider: provider!,
    body,
    headers: getHeaders(event),
  });
});

Required production settings

  • WORKFLOW_TARGET_WORLD=workflow-studio/world-remote
  • WORKFLOW_COMPUTE_BASE_URL
  • WORKFLOW_COMPUTE_API_KEY