Local

@workflow/world-local

Zero-config world bundled with Workflow for local development. No external services required.

The Local World is bundled with workflow and used automatically during local development. No installation or configuration required.

To explicitly use the local world in any environment, set the environment variable:

WORKFLOW_TARGET_WORLD=local

Observability

The workflow CLI uses the local world by default. Running these commands inside your workflow project will show your local development workflows:

# List recent workflow runs
npx workflow inspect runs

# Launch the web UI
npx workflow web

Learn more in the Observability documentation.

Testing & Performance

E2E Tests

Passing100% passing

Spec compliance is tested against Next.js (Turbopack) built in production mode and started with `next start`. View CI run →

361
Passed
0
Failed
74
Skipped
435
Total
View comprehensive E2E test results against all frameworks/configurations
1957
Passed
0
Failed
392
Skipped
2349
Total

Benchmarks

Click on a benchmark to view performance history over the last 30 commits.

Benchmark
Time
MinMaxSamples
Promise.all with 10 concurrent steps
1.55s1.50s1.69s15
Promise.all with 25 concurrent steps
3.16s3.06s3.35s8
Promise.all with 50 concurrent steps
8.95s8.70s9.45s4
Promise.race with 10 concurrent steps
1.57s1.48s1.65s15
Promise.race with 25 concurrent steps
3.15s3.04s3.24s8
Promise.race with 50 concurrent steps
9.30s9.23s9.43s3
workflow with 1 step
1.13s1.12s1.17s10
workflow with 10 concurrent data payload steps (10KB)
623ms467ms1.26s59
workflow with 10 sequential data payload steps (10KB)
1.02s986ms1.07s34
workflow with 10 sequential steps
11.01s11.00s11.03s3
workflow with 25 concurrent data payload steps (10KB)
2.59s2.37s2.93s30
workflow with 25 sequential data payload steps (10KB)
3.09s3.01s3.15s23
workflow with 25 sequential steps
15.07s15.03s15.11s4
workflow with 50 concurrent data payload steps (10KB)
11.55s11.14s11.68s10
workflow with 50 sequential data payload steps (10KB)
9.43s9.20s9.70s12
workflow with 50 sequential steps
16.98s16.87s17.05s6
workflow with no steps
44ms38ms64ms10

Stream Benchmarks

Benchmark
Time
TTFB
Slurp
MinMaxSamples
10 parallel streams (1MB each)1.31s2.02s0ms1.23s1.37s30
fan-out fan-in 10 streams (1MB each)3.73s4.10s0ms3.46s4.05s15
stream pipeline with 5 transform steps (1MB)765ms1.01s10ms730ms873ms59
workflow with stream214ms1.00s13ms209ms230ms10

Last updated: 4/8/2026, 1:35:19 AM · Commit: a261b21

Configuration

The local world works with zero configuration, but you can customize behavior through environment variables or programmatically via createLocalWorld().

WORKFLOW_LOCAL_DATA_DIR

Directory for storing workflow data as JSON files. Default: .workflow-data/

PORT

The application dev server port. Used to enqueue steps and workflows. Default: auto-detected

WORKFLOW_LOCAL_BASE_URL

Full base URL override for HTTPS or custom hostnames. Default: http://localhost:{port}

Port resolution priority: baseUrl > port > PORT > auto-detected

WORKFLOW_LOCAL_QUEUE_CONCURRENCY

Maximum number of concurrent queue workers. Default: 100

Programmatic configuration

workflow.config.ts
import { createLocalWorld } from "@workflow/world-local";

const world = createLocalWorld({
  dataDir: "./custom-workflow-data",
  port: 5173,
  // baseUrl overrides port if set
  baseUrl: "https://local.example.com:3000",
});

Limitations

The local world is designed for development, not production:

  • In-memory queue - Steps are queued in memory and do not persist across server restarts
  • Filesystem storage - Data is stored in local JSON files
  • Single instance - Cannot handle distributed deployments
  • No authentication - Suitable only for local development

For production deployments, use the Vercel World or Postgres World.