Local World
The Local World (@workflow/world-local) is a filesystem-based workflow backend designed for local development and testing. It stores workflow data as JSON files on disk and provides in-memory queuing.
The local world is perfect for local development because it:
- Requires no external services or configuration
- Stores data as readable JSON files for easy debugging
- Provides instant feedback during development
- Works seamlessly with Next.js development server
How It Works
Storage
The local world stores all workflow data as JSON files in a configurable directory:
.workflow-data/
├── runs/
│ └── <run-id>.json
├── steps/
│ └── <run-id>/
│ └── <step-id>.json
├── hooks/
│ └── <hook-id>.json
└── streams/
└── <run-id>/
└── <stream-id>.jsonEach file contains the full state of a run, step, hook, or stream, making it easy to inspect workflow data directly.
Queuing
The local world uses an in-memory queue with HTTP transport:
- When a step is enqueued, it's added to an in-memory queue
- The queue processes steps by sending HTTP requests to your development server
- Steps are executed at the
.well-known/workflow/v1/stependpoint
The queue automatically detects your development server's port and adjusts the queue URL accordingly.
Authentication
The local world provides a simple authentication implementation since no authentication is required or enforced in local development.
getAuthHeaders(): Promise<Record<string, string>> {
return Promise.resolve({});
}Configuration
Data Directory
By default, workflow data is stored in .workflow-data/ in your project root. This can be customized through environment variables or programmatically.
Environment variable:
export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-dataProgrammatically:
import { createEmbeddedWorld } from '@workflow/world-local';
const world = createEmbeddedWorld('./custom-workflow-data');Port
The local world automatically detects your server port from the PORT environment variable:
export PORT=3000
npm run devYou can also specify it explicitly when creating the world programmatically:
import { createEmbeddedWorld } from '@workflow/world-local';
const world = createEmbeddedWorld(undefined, 3000);Usage
Automatic (Recommended)
The local world is used automatically during local development:
# Start your Next.js dev server
npm run dev
# Workflows automatically use local worldManual
You can explicitly set the local world through environment variables:
export WORKFLOW_TARGET_WORLD=local
npm run devDevelopment Workflow
A typical development workflow with local world:
-
Start your dev server:
npm run dev -
Trigger a workflow:
curl -X POST --json '{"email":"test@example.com"}' http://localhost:3000/api/signup -
Inspect the results:
- Use the CLI or Web UI
- Check JSON files in
.workflow-data/ - View development server logs
Inspecting Data
Using Observability Tools
The local world integrates with the Workflow DevKit's observability tools:
# View runs with CLI
npx workflow inspect runs
# View runs with Web UI
npx workflow inspect runs --webLearn more in the Observability section.
Limitations
The local world is designed for development, not production:
- Not scalable - Uses in-memory queuing
- Not persistent - Data is stored in local files
- Single instance - Cannot handle distributed deployments
- No authentication - Suitable only for local development
For production deployments, use the Vercel World.
API Reference
createEmbeddedWorld
Creates a local world instance:
function createEmbeddedWorld(
dataDir?: string,
port?: number
): WorldParameters:
-
dataDir- Directory for storing workflow data (default:.workflow-data/) -
port- Server port for queue transport (default: fromPORTenv var)
Returns:
-
World- A world instance implementing the World interface
Example:
import { createEmbeddedWorld } from '@workflow/world-local';
const world = createEmbeddedWorld('./my-data', 3000);Learn More
- World Interface - Understanding the World interface
- Vercel World - For production deployments
- Observability - Monitoring and debugging tools